Merge branch 'beta' into qol/Modifiers-type-inference--mirror
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "berry_bush.png",
|
"image": "berries_abound_bush.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 49,
|
"w": 49,
|
Before Width: | Height: | Size: 719 B After Width: | Height: | Size: 719 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "mad_scientist_m.png",
|
"image": "dark_deal_scientist.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 46,
|
"w": 46,
|
Before Width: | Height: | Size: 920 B After Width: | Height: | Size: 920 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "b2w2_lady.png",
|
"image": "department_store_sale_lady.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 399,
|
"w": 399,
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 378 B After Width: | Height: | Size: 378 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "teacher.png",
|
"image": "field_trip_teacher.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 43,
|
"w": 43,
|
Before Width: | Height: | Size: 727 B After Width: | Height: | Size: 727 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "carnival_game.png",
|
"image": "fun_and_games_game.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 38,
|
"w": 38,
|
Before Width: | Height: | Size: 517 B After Width: | Height: | Size: 517 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "carnival_man.png",
|
"image": "fun_and_games_man.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 50,
|
"w": 50,
|
Before Width: | Height: | Size: 833 B After Width: | Height: | Size: 833 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "carnival_wobbuffet.png",
|
"image": "fun_and_games_wobbuffet.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 45,
|
"w": 45,
|
Before Width: | Height: | Size: 772 B After Width: | Height: | Size: 772 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "chest_blue.png",
|
"image": "mysterious_chest_blue.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 54,
|
"w": 54,
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "chest_red.png",
|
"image": "mysterious_chest_red.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 54,
|
"w": 54,
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "warehouse_crate.png",
|
"image": "part_timer_crate.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 71,
|
"w": 71,
|
Before Width: | Height: | Size: 868 B After Width: | Height: | Size: 868 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "bait.png",
|
"image": "safari_zone_bait.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 14,
|
"w": 14,
|
Before Width: | Height: | Size: 277 B After Width: | Height: | Size: 277 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "mud.png",
|
"image": "safari_zone_mud.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 14,
|
"w": 14,
|
Before Width: | Height: | Size: 375 B After Width: | Height: | Size: 375 B |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "b2w2_veteran_m.png",
|
"image": "shady_vitamin_dealer.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 424,
|
"w": 424,
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "teleporter.png",
|
"image": "teleporting_hijinks_teleporter.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 74,
|
"w": 74,
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
{
|
{
|
||||||
"image": "training_gear.png",
|
"image": "training_session_gear.png",
|
||||||
"format": "RGBA8888",
|
"format": "RGBA8888",
|
||||||
"size": {
|
"size": {
|
||||||
"w": 76,
|
"w": 76,
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@ -1,10 +1,10 @@
|
|||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
import UI from "./ui/ui";
|
import UI from "./ui/ui";
|
||||||
import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon";
|
import Pokemon, { EnemyPokemon, PlayerPokemon } from "./field/pokemon";
|
||||||
import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species";
|
import PokemonSpecies, { allSpecies, getPokemonSpecies, PokemonSpeciesFilter } from "./data/pokemon-species";
|
||||||
import { Constructor, isNullOrUndefined } from "#app/utils";
|
import { Constructor, isNullOrUndefined } from "#app/utils";
|
||||||
import * as Utils from "./utils";
|
import * as Utils from "./utils";
|
||||||
import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, TurnHeldItemTransferModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems, PokemonIncrementingStatModifier, ExpShareModifier, ExpBalanceModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "./modifier/modifier";
|
import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, Modifier, ModifierBar, ModifierPredicate, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, TerastallizeModifier, TurnHeldItemTransferModifier } from "./modifier/modifier";
|
||||||
import { PokeballType } from "./data/pokeball";
|
import { PokeballType } from "./data/pokeball";
|
||||||
import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims";
|
import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims";
|
||||||
import { Phase } from "./phase";
|
import { Phase } from "./phase";
|
||||||
@ -13,20 +13,9 @@ import { Arena, ArenaBase } from "./field/arena";
|
|||||||
import { GameData } from "./system/game-data";
|
import { GameData } from "./system/game-data";
|
||||||
import { addTextObject, getTextColor, TextStyle } from "./ui/text";
|
import { addTextObject, getTextColor, TextStyle } from "./ui/text";
|
||||||
import { allMoves } from "./data/move";
|
import { allMoves } from "./data/move";
|
||||||
import {
|
import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, ModifierPoolType, modifierTypes, PokemonHeldItemModifierType } from "./modifier/modifier-type";
|
||||||
ModifierPoolType,
|
|
||||||
getDefaultModifierTypeForTier,
|
|
||||||
getEnemyModifierTypesForWave,
|
|
||||||
getLuckString,
|
|
||||||
getLuckTextTint,
|
|
||||||
getModifierPoolForType,
|
|
||||||
getModifierType,
|
|
||||||
getPartyLuckValue,
|
|
||||||
modifierTypes, PokemonHeldItemModifierType
|
|
||||||
} from "./modifier/modifier-type";
|
|
||||||
import AbilityBar from "./ui/ability-bar";
|
import AbilityBar from "./ui/ability-bar";
|
||||||
import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, ChangeMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability";
|
import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, BlockItemTheftAbAttr, ChangeMovePriorityAbAttr, DoubleBattleChanceAbAttr, PostBattleInitAbAttr } from "./data/ability";
|
||||||
import { allAbilities } from "./data/ability";
|
|
||||||
import Battle, { BattleType, FixedBattleConfig } from "./battle";
|
import Battle, { BattleType, FixedBattleConfig } from "./battle";
|
||||||
import { GameMode, GameModes, getGameMode } from "./game-mode";
|
import { GameMode, GameModes, getGameMode } from "./game-mode";
|
||||||
import FieldSpritePipeline from "./pipelines/field-sprite";
|
import FieldSpritePipeline from "./pipelines/field-sprite";
|
||||||
@ -46,7 +35,7 @@ import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin";
|
|||||||
import { addUiThemeOverrides } from "./ui/ui-theme";
|
import { addUiThemeOverrides } from "./ui/ui-theme";
|
||||||
import PokemonData from "./system/pokemon-data";
|
import PokemonData from "./system/pokemon-data";
|
||||||
import { Nature } from "./data/nature";
|
import { Nature } from "./data/nature";
|
||||||
import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges, FormChangeItem, SpeciesFormChange } from "./data/pokemon-forms";
|
import { FormChangeItem, pokemonFormChanges, SpeciesFormChange, SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger } from "./data/pokemon-forms";
|
||||||
import { FormChangePhase } from "./phases/form-change-phase";
|
import { FormChangePhase } from "./phases/form-change-phase";
|
||||||
import { getTypeRgb } from "./data/type";
|
import { getTypeRgb } from "./data/type";
|
||||||
import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler";
|
import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler";
|
||||||
@ -1081,6 +1070,11 @@ export default class BattleScene extends SceneBase {
|
|||||||
p.destroy();
|
p.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If this is a ME, clear any residual visual sprites before reloading
|
||||||
|
if (this.currentBattle?.mysteryEncounter?.introVisuals) {
|
||||||
|
this.field.remove(this.currentBattle.mysteryEncounter?.introVisuals, true);
|
||||||
|
}
|
||||||
|
|
||||||
//@ts-ignore - allowing `null` for currentBattle causes a lot of trouble
|
//@ts-ignore - allowing `null` for currentBattle causes a lot of trouble
|
||||||
this.currentBattle = null; // TODO: resolve ts-ignore
|
this.currentBattle = null; // TODO: resolve ts-ignore
|
||||||
|
|
||||||
@ -1111,6 +1105,8 @@ export default class BattleScene extends SceneBase {
|
|||||||
this.trainer.setPosition(406, 186);
|
this.trainer.setPosition(406, 186);
|
||||||
this.trainer.setVisible(true);
|
this.trainer.setVisible(true);
|
||||||
|
|
||||||
|
this.mysteryEncounterSaveData = new MysteryEncounterSaveData();
|
||||||
|
|
||||||
this.updateGameInfo();
|
this.updateGameInfo();
|
||||||
|
|
||||||
if (reloadI18n) {
|
if (reloadI18n) {
|
||||||
@ -1146,6 +1142,13 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getDoubleBattleChance(newWaveIndex: number, playerField: PlayerPokemon[]) {
|
||||||
|
const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8);
|
||||||
|
this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance);
|
||||||
|
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance));
|
||||||
|
return Math.max(doubleChance.value, 1);
|
||||||
|
}
|
||||||
|
|
||||||
newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounterType?: MysteryEncounterType): Battle | null {
|
newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounterType?: MysteryEncounterType): Battle | null {
|
||||||
const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave;
|
const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave;
|
||||||
const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1);
|
const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1);
|
||||||
@ -1229,10 +1232,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
if (double === undefined && newWaveIndex > 1) {
|
if (double === undefined && newWaveIndex > 1) {
|
||||||
if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) {
|
if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) {
|
||||||
const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8);
|
newDouble = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField));
|
||||||
this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance);
|
|
||||||
playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance));
|
|
||||||
newDouble = !Utils.randSeedInt(doubleChance.value);
|
|
||||||
} else if (newBattleType === BattleType.TRAINER) {
|
} else if (newBattleType === BattleType.TRAINER) {
|
||||||
newDouble = newTrainer?.variant === TrainerVariant.DOUBLE;
|
newDouble = newTrainer?.variant === TrainerVariant.DOUBLE;
|
||||||
}
|
}
|
||||||
@ -3213,11 +3213,17 @@ export default class BattleScene extends SceneBase {
|
|||||||
if (encounterCandidate.encounterTier !== tier) { // Encounter is in tier
|
if (encounterCandidate.encounterTier !== tier) { // Encounter is in tier
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const disabledModes = encounterCandidate.disabledGameModes;
|
const disallowedGameModes = encounterCandidate.disallowedGameModes;
|
||||||
if (disabledModes && disabledModes.length > 0
|
if (disallowedGameModes && disallowedGameModes.length > 0
|
||||||
&& disabledModes.includes(this.gameMode.modeId)) { // Encounter is enabled for game mode
|
&& disallowedGameModes.includes(this.gameMode.modeId)) { // Encounter is enabled for game mode
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (this.gameMode.modeId === GameModes.CHALLENGE) { // Encounter is enabled for challenges
|
||||||
|
const disallowedChallenges = encounterCandidate.disallowedChallenges;
|
||||||
|
if (disallowedChallenges && disallowedChallenges.length > 0 && this.gameMode.challenges.some(challenge => disallowedChallenges.includes(challenge.id))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!encounterCandidate.meetsRequirements(this)) { // Meets encounter requirements
|
if (!encounterCandidate.meetsRequirements(this)) { // Meets encounter requirements
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
95
src/data/ability.ts
Executable file → Normal file
@ -165,14 +165,27 @@ export class BlockRecoilDamageAttr extends AbAttr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attribute for abilities that increase the chance of a double battle
|
||||||
|
* occurring.
|
||||||
|
* @see apply
|
||||||
|
*/
|
||||||
export class DoubleBattleChanceAbAttr extends AbAttr {
|
export class DoubleBattleChanceAbAttr extends AbAttr {
|
||||||
constructor() {
|
constructor() {
|
||||||
super(false);
|
super(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
/**
|
||||||
const doubleChance = (args[0] as Utils.IntegerHolder);
|
* Increases the chance of a double battle occurring
|
||||||
doubleChance.value = Math.max(doubleChance.value / 2, 1);
|
* @param args [0] {@linkcode Utils.NumberHolder} for double battle chance
|
||||||
|
* @returns true if the ability was applied
|
||||||
|
*/
|
||||||
|
apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||||
|
const doubleBattleChance = args[0] as Utils.NumberHolder;
|
||||||
|
// This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt
|
||||||
|
// A double battle will initiate if the generated number is 0
|
||||||
|
doubleBattleChance.value = doubleBattleChance.value / 4;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1785,6 +1798,61 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for defining all {@linkcode Ability} Attributes after a status effect has been set.
|
||||||
|
* @see {@linkcode applyPostSetStatus()}.
|
||||||
|
*/
|
||||||
|
export class PostSetStatusAbAttr extends AbAttr {
|
||||||
|
/**
|
||||||
|
* Does nothing after a status condition is set.
|
||||||
|
* @param pokemon {@linkcode Pokemon} that status condition was set on.
|
||||||
|
* @param sourcePokemon {@linkcode Pokemon} that that set the status condition. Is `null` if status was not set by a Pokemon.
|
||||||
|
* @param passive Whether this ability is a passive.
|
||||||
|
* @param effect {@linkcode StatusEffect} that was set.
|
||||||
|
* @param args Set of unique arguments needed by this attribute.
|
||||||
|
* @returns `true` if application of the ability succeeds.
|
||||||
|
*/
|
||||||
|
applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]) : boolean | Promise<boolean> {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If another Pokemon burns, paralyzes, poisons, or badly poisons this Pokemon,
|
||||||
|
* that Pokemon receives the same non-volatile status condition as part of this
|
||||||
|
* ability attribute. For Synchronize ability.
|
||||||
|
*/
|
||||||
|
export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr {
|
||||||
|
/**
|
||||||
|
* If the `StatusEffect` that was set is Burn, Paralysis, Poison, or Toxic, and the status
|
||||||
|
* was set by a source Pokemon, set the source Pokemon's status to the same `StatusEffect`.
|
||||||
|
* @param pokemon {@linkcode Pokemon} that status condition was set on.
|
||||||
|
* @param sourcePokemon {@linkcode Pokemon} that that set the status condition. Is null if status was not set by a Pokemon.
|
||||||
|
* @param passive Whether this ability is a passive.
|
||||||
|
* @param effect {@linkcode StatusEffect} that was set.
|
||||||
|
* @param args Set of unique arguments needed by this attribute.
|
||||||
|
* @returns `true` if application of the ability succeeds.
|
||||||
|
*/
|
||||||
|
override applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]): boolean {
|
||||||
|
/** Synchronizable statuses */
|
||||||
|
const syncStatuses = new Set<StatusEffect>([
|
||||||
|
StatusEffect.BURN,
|
||||||
|
StatusEffect.PARALYSIS,
|
||||||
|
StatusEffect.POISON,
|
||||||
|
StatusEffect.TOXIC
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (sourcePokemon && syncStatuses.has(effect)) {
|
||||||
|
if (!simulated) {
|
||||||
|
sourcePokemon.trySetStatus(effect, true, pokemon);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class PostVictoryAbAttr extends AbAttr {
|
export class PostVictoryAbAttr extends AbAttr {
|
||||||
applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise<boolean> {
|
applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise<boolean> {
|
||||||
return false;
|
return false;
|
||||||
@ -4664,6 +4732,10 @@ export function applyStatMultiplierAbAttrs(attrType: Constructor<StatMultiplierA
|
|||||||
pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise<void> {
|
pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise<void> {
|
||||||
return applyAbAttrsInternal<StatMultiplierAbAttr>(attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), args);
|
return applyAbAttrsInternal<StatMultiplierAbAttr>(attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), args);
|
||||||
}
|
}
|
||||||
|
export function applyPostSetStatusAbAttrs(attrType: Constructor<PostSetStatusAbAttr>,
|
||||||
|
pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon | null, simulated: boolean = false, ...args: any[]): Promise<void> {
|
||||||
|
return applyAbAttrsInternal<PostSetStatusAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, false, simulated);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies a field Stat multiplier attribute
|
* Applies a field Stat multiplier attribute
|
||||||
@ -4831,11 +4903,9 @@ export function initAbilities() {
|
|||||||
.bypassFaint(),
|
.bypassFaint(),
|
||||||
new Ability(Abilities.VOLT_ABSORB, 3)
|
new Ability(Abilities.VOLT_ABSORB, 3)
|
||||||
.attr(TypeImmunityHealAbAttr, Type.ELECTRIC)
|
.attr(TypeImmunityHealAbAttr, Type.ELECTRIC)
|
||||||
.partial() // Healing not blocked by Heal Block
|
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.WATER_ABSORB, 3)
|
new Ability(Abilities.WATER_ABSORB, 3)
|
||||||
.attr(TypeImmunityHealAbAttr, Type.WATER)
|
.attr(TypeImmunityHealAbAttr, Type.WATER)
|
||||||
.partial() // Healing not blocked by Heal Block
|
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.OBLIVIOUS, 3)
|
new Ability(Abilities.OBLIVIOUS, 3)
|
||||||
.attr(BattlerTagImmunityAbAttr, BattlerTagType.INFATUATED)
|
.attr(BattlerTagImmunityAbAttr, BattlerTagType.INFATUATED)
|
||||||
@ -4896,7 +4966,8 @@ export function initAbilities() {
|
|||||||
.attr(EffectSporeAbAttr),
|
.attr(EffectSporeAbAttr),
|
||||||
new Ability(Abilities.SYNCHRONIZE, 3)
|
new Ability(Abilities.SYNCHRONIZE, 3)
|
||||||
.attr(SyncEncounterNatureAbAttr)
|
.attr(SyncEncounterNatureAbAttr)
|
||||||
.unimplemented(),
|
.attr(SynchronizeStatusAbAttr)
|
||||||
|
.partial(), // interaction with psycho shift needs work, keeping to old Gen interaction for now
|
||||||
new Ability(Abilities.CLEAR_BODY, 3)
|
new Ability(Abilities.CLEAR_BODY, 3)
|
||||||
.attr(ProtectStatAbAttr)
|
.attr(ProtectStatAbAttr)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
@ -4948,8 +5019,7 @@ export function initAbilities() {
|
|||||||
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.SOUND_BASED))
|
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.SOUND_BASED))
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.RAIN_DISH, 3)
|
new Ability(Abilities.RAIN_DISH, 3)
|
||||||
.attr(PostWeatherLapseHealAbAttr, 1, WeatherType.RAIN, WeatherType.HEAVY_RAIN)
|
.attr(PostWeatherLapseHealAbAttr, 1, WeatherType.RAIN, WeatherType.HEAVY_RAIN),
|
||||||
.partial(), // Healing not blocked by Heal Block
|
|
||||||
new Ability(Abilities.SAND_STREAM, 3)
|
new Ability(Abilities.SAND_STREAM, 3)
|
||||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.SANDSTORM)
|
.attr(PostSummonWeatherChangeAbAttr, WeatherType.SANDSTORM)
|
||||||
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SANDSTORM),
|
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SANDSTORM),
|
||||||
@ -5080,7 +5150,6 @@ export function initAbilities() {
|
|||||||
.attr(PostWeatherLapseHealAbAttr, 2, WeatherType.RAIN, WeatherType.HEAVY_RAIN)
|
.attr(PostWeatherLapseHealAbAttr, 2, WeatherType.RAIN, WeatherType.HEAVY_RAIN)
|
||||||
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 1.25)
|
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 1.25)
|
||||||
.attr(TypeImmunityHealAbAttr, Type.WATER)
|
.attr(TypeImmunityHealAbAttr, Type.WATER)
|
||||||
.partial() // Healing not blocked by Heal Block
|
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.DOWNLOAD, 4)
|
new Ability(Abilities.DOWNLOAD, 4)
|
||||||
.attr(DownloadAbAttr),
|
.attr(DownloadAbAttr),
|
||||||
@ -5161,8 +5230,7 @@ export function initAbilities() {
|
|||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.ICE_BODY, 4)
|
new Ability(Abilities.ICE_BODY, 4)
|
||||||
.attr(BlockWeatherDamageAttr, WeatherType.HAIL)
|
.attr(BlockWeatherDamageAttr, WeatherType.HAIL)
|
||||||
.attr(PostWeatherLapseHealAbAttr, 1, WeatherType.HAIL, WeatherType.SNOW)
|
.attr(PostWeatherLapseHealAbAttr, 1, WeatherType.HAIL, WeatherType.SNOW),
|
||||||
.partial(), // Healing not blocked by Heal Block
|
|
||||||
new Ability(Abilities.SOLID_ROCK, 4)
|
new Ability(Abilities.SOLID_ROCK, 4)
|
||||||
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75)
|
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => target.getMoveEffectiveness(user, move) >= 2, 0.75)
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
@ -5332,8 +5400,7 @@ export function initAbilities() {
|
|||||||
.ignorable()
|
.ignorable()
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
new Ability(Abilities.CHEEK_POUCH, 6)
|
new Ability(Abilities.CHEEK_POUCH, 6)
|
||||||
.attr(HealFromBerryUseAbAttr, 1/3)
|
.attr(HealFromBerryUseAbAttr, 1/3),
|
||||||
.partial(), // Healing not blocked by Heal Block
|
|
||||||
new Ability(Abilities.PROTEAN, 6)
|
new Ability(Abilities.PROTEAN, 6)
|
||||||
.attr(PokemonTypeChangeAbAttr),
|
.attr(PokemonTypeChangeAbAttr),
|
||||||
//.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), //Gen 9 Implementation
|
//.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), //Gen 9 Implementation
|
||||||
@ -5872,6 +5939,6 @@ export function initAbilities() {
|
|||||||
new Ability(Abilities.POISON_PUPPETEER, 9)
|
new Ability(Abilities.POISON_PUPPETEER, 9)
|
||||||
.attr(UncopiableAbilityAbAttr)
|
.attr(UncopiableAbilityAbAttr)
|
||||||
.attr(UnswappableAbilityAbAttr)
|
.attr(UnswappableAbilityAbAttr)
|
||||||
.conditionalAttr(pokemon => pokemon.species.speciesId===Species.PECHARUNT, ConfusionOnStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
|
.attr(ConfusionOnStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -743,16 +743,21 @@ export abstract class BattleAnim {
|
|||||||
public target: Pokemon | null;
|
public target: Pokemon | null;
|
||||||
public sprites: Phaser.GameObjects.Sprite[];
|
public sprites: Phaser.GameObjects.Sprite[];
|
||||||
public bgSprite: Phaser.GameObjects.TileSprite | Phaser.GameObjects.Rectangle;
|
public bgSprite: Phaser.GameObjects.TileSprite | Phaser.GameObjects.Rectangle;
|
||||||
public playOnEmptyField: boolean;
|
/**
|
||||||
|
* Will attempt to play as much of an animation as possible, even if not all targets are on the field.
|
||||||
|
* Will also play the animation, even if the user has selected "Move Animations" OFF in Settings.
|
||||||
|
* Exclusively used by MEs atm, for visual animations at the start of an encounter.
|
||||||
|
*/
|
||||||
|
public playRegardlessOfIssues: boolean;
|
||||||
|
|
||||||
private srcLine: number[];
|
private srcLine: number[];
|
||||||
private dstLine: number[];
|
private dstLine: number[];
|
||||||
|
|
||||||
constructor(user?: Pokemon, target?: Pokemon, playOnEmptyField: boolean = false) {
|
constructor(user?: Pokemon, target?: Pokemon, playRegardlessOfIssues: boolean = false) {
|
||||||
this.user = user ?? null;
|
this.user = user ?? null;
|
||||||
this.target = target ?? null;
|
this.target = target ?? null;
|
||||||
this.sprites = [];
|
this.sprites = [];
|
||||||
this.playOnEmptyField = playOnEmptyField;
|
this.playRegardlessOfIssues = playRegardlessOfIssues;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract getAnim(): AnimConfig | null;
|
abstract getAnim(): AnimConfig | null;
|
||||||
@ -829,7 +834,7 @@ export abstract class BattleAnim {
|
|||||||
const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct?
|
const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct?
|
||||||
const target = !isOppAnim ? this.target! : this.user!;
|
const target = !isOppAnim ? this.target! : this.user!;
|
||||||
|
|
||||||
if (!target?.isOnField() && !this.playOnEmptyField) {
|
if (!target?.isOnField() && !this.playRegardlessOfIssues) {
|
||||||
if (callback) {
|
if (callback) {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
@ -896,7 +901,7 @@ export abstract class BattleAnim {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!scene.moveAnimations) {
|
if (!scene.moveAnimations && !this.playRegardlessOfIssues) {
|
||||||
return cleanUpAndComplete();
|
return cleanUpAndComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -910,12 +915,12 @@ export abstract class BattleAnim {
|
|||||||
this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ];
|
this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ];
|
||||||
this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ];
|
this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ];
|
||||||
|
|
||||||
let r = anim!.frames.length; // TODO: is this bang correct?
|
let r = anim?.frames.length ?? 0;
|
||||||
let f = 0;
|
let f = 0;
|
||||||
|
|
||||||
scene.tweens.addCounter({
|
scene.tweens.addCounter({
|
||||||
duration: Utils.getFrameMs(3),
|
duration: Utils.getFrameMs(3),
|
||||||
repeat: anim!.frames.length, // TODO: is this bang correct?
|
repeat: anim?.frames.length ?? 0,
|
||||||
onRepeat: () => {
|
onRepeat: () => {
|
||||||
if (!f) {
|
if (!f) {
|
||||||
userSprite.setVisible(false);
|
userSprite.setVisible(false);
|
||||||
@ -932,7 +937,7 @@ export abstract class BattleAnim {
|
|||||||
const isUser = frame.target === AnimFrameTarget.USER;
|
const isUser = frame.target === AnimFrameTarget.USER;
|
||||||
if (isUser && target === user) {
|
if (isUser && target === user) {
|
||||||
continue;
|
continue;
|
||||||
} else if (this.playOnEmptyField && frame.target === AnimFrameTarget.TARGET && !target.isOnField()) {
|
} else if (this.playRegardlessOfIssues && frame.target === AnimFrameTarget.TARGET && !target.isOnField()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET];
|
const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET];
|
||||||
@ -1145,7 +1150,7 @@ export abstract class BattleAnim {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!scene.moveAnimations) {
|
if (!scene.moveAnimations && !this.playRegardlessOfIssues) {
|
||||||
return cleanUpAndComplete();
|
return cleanUpAndComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1259,7 +1264,7 @@ export class CommonBattleAnim extends BattleAnim {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getAnim(): AnimConfig | null {
|
getAnim(): AnimConfig | null {
|
||||||
return this.commonAnim ? commonAnims.get(this.commonAnim)! : null; // TODO: is this bang correct?
|
return this.commonAnim ? commonAnims.get(this.commonAnim) ?? null : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
isOppAnim(): boolean {
|
isOppAnim(): boolean {
|
||||||
@ -1279,7 +1284,7 @@ export class MoveAnim extends BattleAnim {
|
|||||||
getAnim(): AnimConfig {
|
getAnim(): AnimConfig {
|
||||||
return moveAnims.get(this.move) instanceof AnimConfig
|
return moveAnims.get(this.move) instanceof AnimConfig
|
||||||
? moveAnims.get(this.move) as AnimConfig
|
? moveAnims.get(this.move) as AnimConfig
|
||||||
: moveAnims.get(this.move)![this.user?.isPlayer() ? 0 : 1] as AnimConfig; // TODO: is this bang correct?
|
: moveAnims.get(this.move)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
isOppAnim(): boolean {
|
isOppAnim(): boolean {
|
||||||
@ -1311,7 +1316,7 @@ export class MoveChargeAnim extends MoveAnim {
|
|||||||
getAnim(): AnimConfig {
|
getAnim(): AnimConfig {
|
||||||
return chargeAnims.get(this.chargeAnim) instanceof AnimConfig
|
return chargeAnims.get(this.chargeAnim) instanceof AnimConfig
|
||||||
? chargeAnims.get(this.chargeAnim) as AnimConfig
|
? chargeAnims.get(this.chargeAnim) as AnimConfig
|
||||||
: chargeAnims.get(this.chargeAnim)![this.user?.isPlayer() ? 0 : 1] as AnimConfig; // TODO: is this bang correct?
|
: chargeAnims.get(this.chargeAnim)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { getPokemonNameWithAffix } from "../messages";
|
|||||||
import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
|
import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
|
||||||
import { StatusEffect } from "./status-effect";
|
import { StatusEffect } from "./status-effect";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import { ChargeAttr, MoveFlags, allMoves } from "./move";
|
import { ChargeAttr, MoveFlags, allMoves, MoveCategory, applyMoveAttrs, StatusCategoryOnAllyAttr, HealOnAllyAttr } from "./move";
|
||||||
import { Type } from "./type";
|
import { Type } from "./type";
|
||||||
import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs, ProtectStatAbAttr } from "./ability";
|
import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs, ProtectStatAbAttr } from "./ability";
|
||||||
import { TerrainType } from "./terrain";
|
import { TerrainType } from "./terrain";
|
||||||
@ -141,6 +141,18 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag {
|
|||||||
*/
|
*/
|
||||||
abstract isMoveRestricted(move: Moves): boolean;
|
abstract isMoveRestricted(move: Moves): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if this tag is restricting a move based on a user's decisions during the target selection phase
|
||||||
|
*
|
||||||
|
* @param {Moves} move {@linkcode Moves} move ID to check restriction for
|
||||||
|
* @param {Pokemon} user {@linkcode Pokemon} the user of the above move
|
||||||
|
* @param {Pokemon} target {@linkcode Pokemon} the target of the above move
|
||||||
|
* @returns {boolean} `false` unless overridden by the child tag
|
||||||
|
*/
|
||||||
|
isMoveTargetRestricted(move: Moves, user: Pokemon, target: Pokemon): boolean {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the text to display when the player attempts to select a move that is restricted by this tag.
|
* Gets the text to display when the player attempts to select a move that is restricted by this tag.
|
||||||
*
|
*
|
||||||
@ -2178,6 +2190,74 @@ export class ExposedTag extends BattlerTag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag that prevents HP recovery from held items and move effects. It also blocks the usage of recovery moves.
|
||||||
|
* Applied by moves: {@linkcode Moves.HEAL_BLOCK | Heal Block (5 turns)}, {@linkcode Moves.PSYCHIC_NOISE | Psychic Noise (2 turns)}
|
||||||
|
*
|
||||||
|
* @extends MoveRestrictionBattlerTag
|
||||||
|
*/
|
||||||
|
export class HealBlockTag extends MoveRestrictionBattlerTag {
|
||||||
|
constructor(turnCount: number, sourceMove: Moves) {
|
||||||
|
super(BattlerTagType.HEAL_BLOCK, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], turnCount, sourceMove);
|
||||||
|
}
|
||||||
|
|
||||||
|
onActivation(pokemon: Pokemon): string {
|
||||||
|
return i18next.t("battle:battlerTagsHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a move is disabled under Heal Block
|
||||||
|
* @param {Moves} move {@linkcode Moves} the move ID
|
||||||
|
* @returns `true` if the move has a TRIAGE_MOVE flag and is a status move
|
||||||
|
*/
|
||||||
|
override isMoveRestricted(move: Moves): boolean {
|
||||||
|
if (allMoves[move].hasFlag(MoveFlags.TRIAGE_MOVE) && allMoves[move].category === MoveCategory.STATUS) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a move is disabled under Heal Block because of its choice of target
|
||||||
|
* Implemented b/c of Pollen Puff
|
||||||
|
* @param {Moves} move {@linkcode Moves} the move ID
|
||||||
|
* @param {Pokemon} user {@linkcode Pokemon} the move user
|
||||||
|
* @param {Pokemon} target {@linkcode Pokemon} the target of the move
|
||||||
|
* @returns `true` if the move cannot be used because the target is an ally
|
||||||
|
*/
|
||||||
|
override isMoveTargetRestricted(move: Moves, user: Pokemon, target: Pokemon) {
|
||||||
|
const moveCategory = new Utils.IntegerHolder(allMoves[move].category);
|
||||||
|
applyMoveAttrs(StatusCategoryOnAllyAttr, user, target, allMoves[move], moveCategory);
|
||||||
|
if (allMoves[move].hasAttr(HealOnAllyAttr) && moveCategory.value === MoveCategory.STATUS ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses DisabledTag's selectionDeniedText() message
|
||||||
|
*/
|
||||||
|
override selectionDeniedText(pokemon: Pokemon, move: Moves): string {
|
||||||
|
return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @override
|
||||||
|
* @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move
|
||||||
|
* @param {Moves} move {@linkcode Moves} ID of the move being interrupted
|
||||||
|
* @returns {string} text to display when the move is interrupted
|
||||||
|
*/
|
||||||
|
override interruptedText(pokemon: Pokemon, move: Moves): string {
|
||||||
|
return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name });
|
||||||
|
}
|
||||||
|
|
||||||
|
override onRemove(pokemon: Pokemon): void {
|
||||||
|
super.onRemove(pokemon);
|
||||||
|
|
||||||
|
pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHealBlockOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tag that doubles the type effectiveness of Fire-type moves.
|
* Tag that doubles the type effectiveness of Fire-type moves.
|
||||||
* @extends BattlerTag
|
* @extends BattlerTag
|
||||||
@ -2490,6 +2570,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
|
|||||||
return new SubstituteTag(sourceMove, sourceId);
|
return new SubstituteTag(sourceMove, sourceId);
|
||||||
case BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON:
|
case BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON:
|
||||||
return new MysteryEncounterPostSummonTag();
|
return new MysteryEncounterPostSummonTag();
|
||||||
|
case BattlerTagType.HEAL_BLOCK:
|
||||||
|
return new HealBlockTag(turnCount, sourceMove);
|
||||||
case BattlerTagType.NONE:
|
case BattlerTagType.NONE:
|
||||||
default:
|
default:
|
||||||
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);
|
||||||
|
@ -867,9 +867,17 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
|||||||
{
|
{
|
||||||
encounter: [
|
encounter: [
|
||||||
"dialogue:star_grunt.encounter.1",
|
"dialogue:star_grunt.encounter.1",
|
||||||
|
"dialogue:star_grunt.encounter.2",
|
||||||
|
"dialogue:star_grunt.encounter.3",
|
||||||
|
"dialogue:star_grunt.encounter.4",
|
||||||
|
"dialogue:star_grunt.encounter.5",
|
||||||
],
|
],
|
||||||
victory: [
|
victory: [
|
||||||
"dialogue:star_grunt.victory.1",
|
"dialogue:star_grunt.victory.1",
|
||||||
|
"dialogue:star_grunt.victory.2",
|
||||||
|
"dialogue:star_grunt.victory.3",
|
||||||
|
"dialogue:star_grunt.victory.4",
|
||||||
|
"dialogue:star_grunt.victory.5",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -877,9 +885,11 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
|||||||
{
|
{
|
||||||
encounter: [
|
encounter: [
|
||||||
"dialogue:giacomo.encounter.1",
|
"dialogue:giacomo.encounter.1",
|
||||||
|
"dialogue:giacomo.encounter.2",
|
||||||
],
|
],
|
||||||
victory: [
|
victory: [
|
||||||
"dialogue:giacomo.victory.1",
|
"dialogue:giacomo.victory.1",
|
||||||
|
"dialogue:giacomo.victory.2",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -887,9 +897,11 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
|||||||
{
|
{
|
||||||
encounter: [
|
encounter: [
|
||||||
"dialogue:mela.encounter.1",
|
"dialogue:mela.encounter.1",
|
||||||
|
"dialogue:mela.encounter.2",
|
||||||
],
|
],
|
||||||
victory: [
|
victory: [
|
||||||
"dialogue:mela.victory.1",
|
"dialogue:mela.victory.1",
|
||||||
|
"dialogue:mela.victory.2",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -897,9 +909,11 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
|||||||
{
|
{
|
||||||
encounter: [
|
encounter: [
|
||||||
"dialogue:atticus.encounter.1",
|
"dialogue:atticus.encounter.1",
|
||||||
|
"dialogue:atticus.encounter.2",
|
||||||
],
|
],
|
||||||
victory: [
|
victory: [
|
||||||
"dialogue:atticus.victory.1",
|
"dialogue:atticus.victory.1",
|
||||||
|
"dialogue:atticus.victory.2",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -907,9 +921,11 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
|||||||
{
|
{
|
||||||
encounter: [
|
encounter: [
|
||||||
"dialogue:ortega.encounter.1",
|
"dialogue:ortega.encounter.1",
|
||||||
|
"dialogue:ortega.encounter.2",
|
||||||
],
|
],
|
||||||
victory: [
|
victory: [
|
||||||
"dialogue:ortega.victory.1",
|
"dialogue:ortega.victory.1",
|
||||||
|
"dialogue:ortega.victory.2",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -917,9 +933,11 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
|||||||
{
|
{
|
||||||
encounter: [
|
encounter: [
|
||||||
"dialogue:eri.encounter.1",
|
"dialogue:eri.encounter.1",
|
||||||
|
"dialogue:eri.encounter.2",
|
||||||
],
|
],
|
||||||
victory: [
|
victory: [
|
||||||
"dialogue:eri.victory.1",
|
"dialogue:eri.victory.1",
|
||||||
|
"dialogue:eri.victory.2",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -650,7 +650,7 @@ export default class Move implements Localizable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies each {@linkcode MoveCondition} of this move to the params
|
* Applies each {@linkcode MoveCondition} function of this move to the params, determines if the move can be used prior to calling each attribute's apply()
|
||||||
* @param user {@linkcode Pokemon} to apply conditions to
|
* @param user {@linkcode Pokemon} to apply conditions to
|
||||||
* @param target {@linkcode Pokemon} to apply conditions to
|
* @param target {@linkcode Pokemon} to apply conditions to
|
||||||
* @param move {@linkcode Move} to apply conditions to
|
* @param move {@linkcode Move} to apply conditions to
|
||||||
@ -2091,21 +2091,20 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr {
|
|||||||
|
|
||||||
if (target.status) {
|
if (target.status) {
|
||||||
return false;
|
return false;
|
||||||
}
|
} else {
|
||||||
//@ts-ignore - how can target.status.effect be checked when we return `false` before when it's defined?
|
const canSetStatus = target.canSetStatus(statusToApply, true, false, user);
|
||||||
if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { // TODO: resolve ts-ignore
|
|
||||||
const statusAfflictResult = target.trySetStatus(statusToApply, true, user);
|
if (canSetStatus) {
|
||||||
if (statusAfflictResult) {
|
|
||||||
if (user.status) {
|
if (user.status) {
|
||||||
user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user)));
|
user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user)));
|
||||||
}
|
}
|
||||||
user.resetStatus();
|
user.resetStatus();
|
||||||
user.updateInfo();
|
user.updateInfo();
|
||||||
|
target.trySetStatus(statusToApply, true, user);
|
||||||
}
|
}
|
||||||
return statusAfflictResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return canSetStatus;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
|
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
|
||||||
@ -4539,6 +4538,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
|
|||||||
case BattlerTagType.NIGHTMARE:
|
case BattlerTagType.NIGHTMARE:
|
||||||
case BattlerTagType.DROWSY:
|
case BattlerTagType.DROWSY:
|
||||||
case BattlerTagType.DISABLED:
|
case BattlerTagType.DISABLED:
|
||||||
|
case BattlerTagType.HEAL_BLOCK:
|
||||||
return -5;
|
return -5;
|
||||||
case BattlerTagType.SEEDED:
|
case BattlerTagType.SEEDED:
|
||||||
case BattlerTagType.SALT_CURED:
|
case BattlerTagType.SALT_CURED:
|
||||||
@ -5295,6 +5295,21 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export class ChillyReceptionAttr extends ForceSwitchOutAttr {
|
||||||
|
|
||||||
|
// using inherited constructor
|
||||||
|
|
||||||
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||||
|
user.scene.arena.trySetWeather(WeatherType.SNOW, true);
|
||||||
|
return super.apply(user, target, move, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
getCondition(): MoveConditionFunc {
|
||||||
|
// chilly reception move will go through if the weather is change-able to snow, or the user can switch out, else move will fail
|
||||||
|
return (user, target, move) => user.scene.arena.trySetWeather(WeatherType.SNOW, true) || super.getSwitchOutCondition()(user, target, move);
|
||||||
|
}
|
||||||
|
}
|
||||||
export class RemoveTypeAttr extends MoveEffectAttr {
|
export class RemoveTypeAttr extends MoveEffectAttr {
|
||||||
|
|
||||||
private removedType: Type;
|
private removedType: Type;
|
||||||
@ -7826,8 +7841,8 @@ export function initMoves() {
|
|||||||
.makesContact()
|
.makesContact()
|
||||||
.attr(LessPPMorePowerAttr),
|
.attr(LessPPMorePowerAttr),
|
||||||
new StatusMove(Moves.HEAL_BLOCK, Type.PSYCHIC, 100, 15, -1, 0, 4)
|
new StatusMove(Moves.HEAL_BLOCK, Type.PSYCHIC, 100, 15, -1, 0, 4)
|
||||||
.target(MoveTarget.ALL_NEAR_ENEMIES)
|
.attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, true, 5)
|
||||||
.unimplemented(),
|
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||||
new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4)
|
new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4)
|
||||||
.attr(OpponentHighHpPowerAttr, 120)
|
.attr(OpponentHighHpPowerAttr, 120)
|
||||||
.makesContact(),
|
.makesContact(),
|
||||||
@ -9072,8 +9087,7 @@ export function initMoves() {
|
|||||||
new AttackMove(Moves.AURA_WHEEL, Type.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, 100, 0, 8)
|
new AttackMove(Moves.AURA_WHEEL, Type.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, 100, 0, 8)
|
||||||
.attr(StatStageChangeAttr, [ Stat.SPD ], 1, true)
|
.attr(StatStageChangeAttr, [ Stat.SPD ], 1, true)
|
||||||
.makesContact(false)
|
.makesContact(false)
|
||||||
.attr(AuraWheelTypeAttr)
|
.attr(AuraWheelTypeAttr),
|
||||||
.condition((user, target, move) => [user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.MORPEKO)), // Missing custom fail message
|
|
||||||
new AttackMove(Moves.BREAKING_SWIPE, Type.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, 100, 0, 8)
|
new AttackMove(Moves.BREAKING_SWIPE, Type.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, 100, 0, 8)
|
||||||
.target(MoveTarget.ALL_NEAR_ENEMIES)
|
.target(MoveTarget.ALL_NEAR_ENEMIES)
|
||||||
.attr(StatStageChangeAttr, [ Stat.ATK ], -1),
|
.attr(StatStageChangeAttr, [ Stat.ATK ], -1),
|
||||||
@ -9485,10 +9499,9 @@ export function initMoves() {
|
|||||||
.makesContact(),
|
.makesContact(),
|
||||||
new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9)
|
new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9)
|
||||||
.unimplemented(),
|
.unimplemented(),
|
||||||
new StatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9)
|
new SelfStatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9)
|
||||||
.attr(WeatherChangeAttr, WeatherType.SNOW)
|
.attr(PreMoveMessageAttr, (user, move) => i18next.t("moveTriggers:chillyReception", {pokemonName: getPokemonNameWithAffix(user)}))
|
||||||
.attr(ForceSwitchOutAttr, true, false)
|
.attr(ChillyReceptionAttr, true, false),
|
||||||
.target(MoveTarget.BOTH_SIDES),
|
|
||||||
new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9)
|
new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9)
|
||||||
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true, null, true, true)
|
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true, null, true, true)
|
||||||
.attr(RemoveArenaTrapAttr, true)
|
.attr(RemoveArenaTrapAttr, true)
|
||||||
@ -9609,7 +9622,7 @@ export function initMoves() {
|
|||||||
.recklessMove(),
|
.recklessMove(),
|
||||||
new AttackMove(Moves.PSYCHIC_NOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 9)
|
new AttackMove(Moves.PSYCHIC_NOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 9)
|
||||||
.soundBased()
|
.soundBased()
|
||||||
.partial(),
|
.attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, false, 2),
|
||||||
new AttackMove(Moves.UPPER_HAND, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 15, 100, 3, 9)
|
new AttackMove(Moves.UPPER_HAND, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 15, 100, 3, 9)
|
||||||
.attr(FlinchAttr)
|
.attr(FlinchAttr)
|
||||||
.condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].priority > 0 ) // TODO: is this bang correct?
|
.condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].priority > 0 ) // TODO: is this bang correct?
|
||||||
|
@ -338,7 +338,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter =
|
|||||||
.withOptionPhase(async (scene: BattleScene) => {
|
.withOptionPhase(async (scene: BattleScene) => {
|
||||||
// Let it have the food
|
// Let it have the food
|
||||||
// Greedent joins the team, level equal to 2 below highest party member
|
// Greedent joins the team, level equal to 2 below highest party member
|
||||||
const level = getHighestLevelPlayerPokemon(scene).level - 2;
|
const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2;
|
||||||
const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false);
|
const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false);
|
||||||
greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)];
|
greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)];
|
||||||
greedent.passive = true;
|
greedent.passive = true;
|
||||||
|
@ -26,7 +26,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter =
|
|||||||
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE)
|
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE)
|
||||||
.withEncounterTier(MysteryEncounterTier.GREAT)
|
.withEncounterTier(MysteryEncounterTier.GREAT)
|
||||||
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
||||||
.withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party
|
.withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: Species.LIEPARD.toString(),
|
spriteKey: Species.LIEPARD.toString(),
|
||||||
@ -60,7 +60,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter =
|
|||||||
.withQuery(`${namespace}.query`)
|
.withQuery(`${namespace}.query`)
|
||||||
.withOnInit((scene: BattleScene) => {
|
.withOnInit((scene: BattleScene) => {
|
||||||
const encounter = scene.currentBattle.mysteryEncounter!;
|
const encounter = scene.currentBattle.mysteryEncounter!;
|
||||||
const pokemon = getHighestStatTotalPlayerPokemon(scene, false);
|
const pokemon = getHighestStatTotalPlayerPokemon(scene, true, true);
|
||||||
const price = scene.getWaveMoneyAmount(10);
|
const price = scene.getWaveMoneyAmount(10);
|
||||||
|
|
||||||
encounter.setDialogueToken("strongestPokemon", pokemon.getNameToRender());
|
encounter.setDialogueToken("strongestPokemon", pokemon.getNameToRender());
|
||||||
|
@ -82,7 +82,7 @@ export const BerriesAboundEncounter: MysteryEncounter =
|
|||||||
const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon);
|
const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon);
|
||||||
encounter.spriteConfigs = [
|
encounter.spriteConfigs = [
|
||||||
{
|
{
|
||||||
spriteKey: "berry_bush",
|
spriteKey: "berries_abound_bush",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
x: 25,
|
x: 25,
|
||||||
y: -6,
|
y: -6,
|
||||||
@ -102,7 +102,7 @@ export const BerriesAboundEncounter: MysteryEncounter =
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Get fastest party pokemon for option 2
|
// Get fastest party pokemon for option 2
|
||||||
const fastestPokemon = getHighestStatPlayerPokemon(scene, PERMANENT_STATS[Stat.SPD], true);
|
const fastestPokemon = getHighestStatPlayerPokemon(scene, PERMANENT_STATS[Stat.SPD], true, false);
|
||||||
encounter.misc.fastestPokemon = fastestPokemon;
|
encounter.misc.fastestPokemon = fastestPokemon;
|
||||||
encounter.misc.enemySpeed = bossPokemon.getStat(Stat.SPD);
|
encounter.misc.enemySpeed = bossPokemon.getStat(Stat.SPD);
|
||||||
encounter.setDialogueToken("fastestPokemon", fastestPokemon.getNameToRender());
|
encounter.setDialogueToken("fastestPokemon", fastestPokemon.getNameToRender());
|
||||||
|
@ -376,9 +376,10 @@ export const BugTypeSuperfanEncounter: MysteryEncounter =
|
|||||||
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
||||||
// Get Pokemon held items and filter for valid ones
|
// Get Pokemon held items and filter for valid ones
|
||||||
const validItems = pokemon.getHeldItems().filter(item => {
|
const validItems = pokemon.getHeldItems().filter(item => {
|
||||||
return item instanceof BypassSpeedChanceModifier ||
|
return (item instanceof BypassSpeedChanceModifier ||
|
||||||
item instanceof ContactHeldItemTransferChanceModifier ||
|
item instanceof ContactHeldItemTransferChanceModifier ||
|
||||||
(item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG);
|
(item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG)) &&
|
||||||
|
item.isTransferable;
|
||||||
});
|
});
|
||||||
|
|
||||||
return validItems.map((modifier: PokemonHeldItemModifier) => {
|
return validItems.map((modifier: PokemonHeldItemModifier) => {
|
||||||
|
@ -29,8 +29,9 @@ import { Moves } from "#enums/moves";
|
|||||||
import { EncounterBattleAnim } from "#app/data/battle-anims";
|
import { EncounterBattleAnim } from "#app/data/battle-anims";
|
||||||
import { MoveCategory } from "#app/data/move";
|
import { MoveCategory } from "#app/data/move";
|
||||||
import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data";
|
import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES, GameModes } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
import { EncounterAnim } from "#enums/encounter-anims";
|
import { EncounterAnim } from "#enums/encounter-anims";
|
||||||
|
import { Challenges } from "#enums/challenges";
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounter:clowningAround";
|
const namespace = "mysteryEncounter:clowningAround";
|
||||||
@ -61,7 +62,7 @@ const RANDOM_ABILITY_POOL = [
|
|||||||
export const ClowningAroundEncounter: MysteryEncounter =
|
export const ClowningAroundEncounter: MysteryEncounter =
|
||||||
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND)
|
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND)
|
||||||
.withEncounterTier(MysteryEncounterTier.ULTRA)
|
.withEncounterTier(MysteryEncounterTier.ULTRA)
|
||||||
.withDisabledGameModes(GameModes.CHALLENGE)
|
.withDisallowedChallenges(Challenges.SINGLE_TYPE)
|
||||||
.withSceneWaveRangeRequirement(80, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1])
|
.withSceneWaveRangeRequirement(80, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1])
|
||||||
.withAnimations(EncounterAnim.SMOKESCREEN)
|
.withAnimations(EncounterAnim.SMOKESCREEN)
|
||||||
.withAutoHideIntroVisuals(false)
|
.withAutoHideIntroVisuals(false)
|
||||||
@ -349,10 +350,18 @@ export const ClowningAroundEncounter: MysteryEncounter =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
newTypes.push(secondType);
|
newTypes.push(secondType);
|
||||||
|
|
||||||
|
// Apply the type changes (to both base and fusion, if pokemon is fused)
|
||||||
if (!pokemon.mysteryEncounterPokemonData) {
|
if (!pokemon.mysteryEncounterPokemonData) {
|
||||||
pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData();
|
pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData();
|
||||||
}
|
}
|
||||||
pokemon.mysteryEncounterPokemonData.types = newTypes;
|
pokemon.mysteryEncounterPokemonData.types = newTypes;
|
||||||
|
if (pokemon.isFusion()) {
|
||||||
|
if (!pokemon.fusionMysteryEncounterPokemonData) {
|
||||||
|
pokemon.fusionMysteryEncounterPokemonData = new MysteryEncounterPokemonData();
|
||||||
|
}
|
||||||
|
pokemon.fusionMysteryEncounterPokemonData.types = newTypes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.withOptionPhase(async (scene: BattleScene) => {
|
.withOptionPhase(async (scene: BattleScene) => {
|
||||||
@ -415,10 +424,17 @@ function onYesAbilitySwap(scene: BattleScene, resolve) {
|
|||||||
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
||||||
// Do ability swap
|
// Do ability swap
|
||||||
const encounter = scene.currentBattle.mysteryEncounter!;
|
const encounter = scene.currentBattle.mysteryEncounter!;
|
||||||
if (!pokemon.mysteryEncounterPokemonData) {
|
if (pokemon.isFusion()) {
|
||||||
pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData();
|
if (!pokemon.fusionMysteryEncounterPokemonData) {
|
||||||
|
pokemon.fusionMysteryEncounterPokemonData = new MysteryEncounterPokemonData();
|
||||||
|
}
|
||||||
|
pokemon.fusionMysteryEncounterPokemonData.ability = encounter.misc.ability;
|
||||||
|
} else {
|
||||||
|
if (!pokemon.mysteryEncounterPokemonData) {
|
||||||
|
pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData();
|
||||||
|
}
|
||||||
|
pokemon.mysteryEncounterPokemonData.ability = encounter.misc.ability;
|
||||||
}
|
}
|
||||||
pokemon.mysteryEncounterPokemonData.ability = encounter.misc.ability;
|
|
||||||
encounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender());
|
encounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender());
|
||||||
scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true));
|
scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true));
|
||||||
};
|
};
|
||||||
|
@ -27,6 +27,7 @@ import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
|||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { EncounterAnim } from "#enums/encounter-anims";
|
import { EncounterAnim } from "#enums/encounter-anims";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import i18next from "i18next";
|
||||||
|
|
||||||
/** the i18n namespace for this encounter */
|
/** the i18n namespace for this encounter */
|
||||||
const namespace = "mysteryEncounter:dancingLessons";
|
const namespace = "mysteryEncounter:dancingLessons";
|
||||||
@ -268,9 +269,12 @@ export const DancingLessonsEncounter: MysteryEncounter =
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Only Pokemon that have a Dancing move can be selected
|
// Only challenge legal/unfainted Pokemon that have a Dancing move can be selected
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
// If pokemon meets primary pokemon reqs, it can be selected
|
// If pokemon meets primary pokemon reqs, it can be selected
|
||||||
|
if (!pokemon.isAllowedInBattle()) {
|
||||||
|
return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null;
|
||||||
|
}
|
||||||
const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon);
|
const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon);
|
||||||
if (!meetsReqs) {
|
if (!meetsReqs) {
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
||||||
|
@ -94,7 +94,7 @@ export const DarkDealEncounter: MysteryEncounter =
|
|||||||
.withEncounterTier(MysteryEncounterTier.ROGUE)
|
.withEncounterTier(MysteryEncounterTier.ROGUE)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "mad_scientist_m",
|
spriteKey: "dark_deal_scientist",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
},
|
},
|
||||||
@ -115,7 +115,7 @@ export const DarkDealEncounter: MysteryEncounter =
|
|||||||
},
|
},
|
||||||
])
|
])
|
||||||
.withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1])
|
.withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1])
|
||||||
.withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party
|
.withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party
|
||||||
.withCatchAllowed(true)
|
.withCatchAllowed(true)
|
||||||
.withTitle(`${namespace}.title`)
|
.withTitle(`${namespace}.title`)
|
||||||
.withDescription(`${namespace}.description`)
|
.withDescription(`${namespace}.description`)
|
||||||
@ -139,7 +139,7 @@ export const DarkDealEncounter: MysteryEncounter =
|
|||||||
.withPreOptionPhase(async (scene: BattleScene) => {
|
.withPreOptionPhase(async (scene: BattleScene) => {
|
||||||
// Removes random pokemon (including fainted) from party and adds name to dialogue data tokens
|
// Removes random pokemon (including fainted) from party and adds name to dialogue data tokens
|
||||||
// Will never return last battle able mon and instead pick fainted/unable to battle
|
// Will never return last battle able mon and instead pick fainted/unable to battle
|
||||||
const removedPokemon = getRandomPlayerPokemon(scene, false, true);
|
const removedPokemon = getRandomPlayerPokemon(scene, true, false, true);
|
||||||
// Get all the pokemon's held items
|
// Get all the pokemon's held items
|
||||||
const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier));
|
const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier));
|
||||||
scene.removePokemonFromPlayerParty(removedPokemon);
|
scene.removePokemonFromPlayerParty(removedPokemon);
|
||||||
|
@ -10,7 +10,7 @@ import { CombinationPokemonRequirement, HeldItemRequirement, MoneyRequirement }
|
|||||||
import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { HealingBoosterModifier, HiddenAbilityRateBoosterModifier, LevelIncrementBoosterModifier, PokemonHeldItemModifier, PreserveBerryModifier } from "#app/modifier/modifier";
|
import { BerryModifier, HealingBoosterModifier, HiddenAbilityRateBoosterModifier, LevelIncrementBoosterModifier, PokemonHeldItemModifier, PreserveBerryModifier } from "#app/modifier/modifier";
|
||||||
import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
||||||
import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import i18next from "#app/plugins/i18n";
|
import i18next from "#app/plugins/i18n";
|
||||||
@ -159,7 +159,7 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
||||||
// Get Pokemon held items and filter for valid ones
|
// Get Pokemon held items and filter for valid ones
|
||||||
const validItems = pokemon.getHeldItems().filter((it) => {
|
const validItems = pokemon.getHeldItems().filter((it) => {
|
||||||
return OPTION_2_ALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem);
|
return OPTION_2_ALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable;
|
||||||
});
|
});
|
||||||
|
|
||||||
return validItems.map((modifier: PokemonHeldItemModifier) => {
|
return validItems.map((modifier: PokemonHeldItemModifier) => {
|
||||||
@ -179,9 +179,8 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Only Pokemon that can gain benefits are above 1/3rd HP with no status
|
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
// If pokemon meets primary pokemon reqs, it can be selected
|
// If pokemon has valid item, it can be selected
|
||||||
const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(scene, pokemon);
|
const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(scene, pokemon);
|
||||||
if (!meetsReqs) {
|
if (!meetsReqs) {
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
||||||
@ -197,7 +196,7 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
const modifier = encounter.misc.chosenModifier;
|
const modifier = encounter.misc.chosenModifier;
|
||||||
|
|
||||||
// Give the player a Candy Jar if they gave a Berry, and a Healing Charm for Reviver Seed
|
// Give the player a Candy Jar if they gave a Berry, and a Healing Charm for Reviver Seed
|
||||||
if (modifier.type.name.includes("Berry")) {
|
if (modifier instanceof BerryModifier) {
|
||||||
// Check if the player has max stacks of that Candy Jar already
|
// Check if the player has max stacks of that Candy Jar already
|
||||||
const existing = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier) as LevelIncrementBoosterModifier;
|
const existing = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier) as LevelIncrementBoosterModifier;
|
||||||
|
|
||||||
@ -254,7 +253,7 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
||||||
// Get Pokemon held items and filter for valid ones
|
// Get Pokemon held items and filter for valid ones
|
||||||
const validItems = pokemon.getHeldItems().filter((it) => {
|
const validItems = pokemon.getHeldItems().filter((it) => {
|
||||||
return !OPTION_3_DISALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem);
|
return !OPTION_3_DISALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable;
|
||||||
});
|
});
|
||||||
|
|
||||||
return validItems.map((modifier: PokemonHeldItemModifier) => {
|
return validItems.map((modifier: PokemonHeldItemModifier) => {
|
||||||
@ -274,9 +273,8 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Only Pokemon that can gain benefits are above 1/3rd HP with no status
|
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
// If pokemon meets primary pokemon reqs, it can be selected
|
// If pokemon has valid item, it can be selected
|
||||||
const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon);
|
const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon);
|
||||||
if (!meetsReqs) {
|
if (!meetsReqs) {
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
||||||
|
@ -27,7 +27,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter =
|
|||||||
.withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100)
|
.withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "b2w2_lady",
|
spriteKey: "department_store_sale_lady",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
x: -20,
|
x: -20,
|
||||||
|
@ -32,7 +32,7 @@ export const FieldTripEncounter: MysteryEncounter =
|
|||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
spriteKey: "teacher",
|
spriteKey: "field_trip_teacher",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
},
|
},
|
||||||
|
@ -189,7 +189,7 @@ export const FieryFalloutEncounter: MysteryEncounter =
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Burn random member
|
// Burn random member
|
||||||
const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status!.effect) || p.status?.effect === StatusEffect.BURN);
|
const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status!.effect) || p.status?.effect === StatusEffect.NONE);
|
||||||
if (burnable?.length > 0) {
|
if (burnable?.length > 0) {
|
||||||
const roll = randSeedInt(burnable.length);
|
const roll = randSeedInt(burnable.length);
|
||||||
const chosenPokemon = burnable[roll];
|
const chosenPokemon = burnable[roll];
|
||||||
|
@ -68,6 +68,7 @@ export const FightOrFlightEncounter: MysteryEncounter =
|
|||||||
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
|
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
|
||||||
queueEncounterMessage(pokemon.scene, `${namespace}.option.1.stat_boost`);
|
queueEncounterMessage(pokemon.scene, `${namespace}.option.1.stat_boost`);
|
||||||
// Randomly boost 1 stat 2 stages
|
// Randomly boost 1 stat 2 stages
|
||||||
|
// Cannot boost Spd, Acc, or Evasion
|
||||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [randSeedInt(4, 1)], 2));
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [randSeedInt(4, 1)], 2));
|
||||||
}
|
}
|
||||||
}],
|
}],
|
||||||
|
@ -7,7 +7,7 @@ import { TrainerSlot } from "#app/data/trainer-config";
|
|||||||
import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon";
|
import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements";
|
import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements";
|
||||||
import { getEncounterText, queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
@ -22,6 +22,7 @@ import { PostSummonPhase } from "#app/phases/post-summon-phase";
|
|||||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import { isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounter:funAndGames";
|
const namespace = "mysteryEncounter:funAndGames";
|
||||||
@ -45,14 +46,14 @@ export const FunAndGamesEncounter: MysteryEncounter =
|
|||||||
.withSkipToFightInput(true)
|
.withSkipToFightInput(true)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "carnival_game",
|
spriteKey: "fun_and_games_game",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: false,
|
hasShadow: false,
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 6,
|
y: 6,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
spriteKey: "carnival_wobbuffet",
|
spriteKey: "fun_and_games_wobbuffet",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
x: -28,
|
x: -28,
|
||||||
@ -60,7 +61,7 @@ export const FunAndGamesEncounter: MysteryEncounter =
|
|||||||
yShadow: 6
|
yShadow: 6
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
spriteKey: "carnival_man",
|
spriteKey: "fun_and_games_man",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
x: 40,
|
x: 40,
|
||||||
@ -110,12 +111,7 @@ export const FunAndGamesEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Only Pokemon that are not KOed/legal can be selected
|
// Only Pokemon that are not KOed/legal can be selected
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
const meetsReqs = pokemon.isAllowedInBattle();
|
return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}.invalid_selection`);
|
||||||
if (!meetsReqs) {
|
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
||||||
|
@ -317,7 +317,6 @@ export const GlobalTradeSystemEncounter: MysteryEncounter =
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Only Pokemon that can gain benefits are above 1/3rd HP with no status
|
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
// If pokemon has items to trade
|
// If pokemon has items to trade
|
||||||
const meetsReqs = pokemon.getHeldItems().filter((it) => {
|
const meetsReqs = pokemon.getHeldItems().filter((it) => {
|
||||||
@ -431,14 +430,13 @@ function getPokemonTradeOptions(scene: BattleScene): Map<number, EnemyPokemon[]>
|
|||||||
|
|
||||||
function generateTradeOption(alreadyUsedSpecies: PokemonSpecies[], originalBst?: number): PokemonSpecies {
|
function generateTradeOption(alreadyUsedSpecies: PokemonSpecies[], originalBst?: number): PokemonSpecies {
|
||||||
let newSpecies: PokemonSpecies | undefined;
|
let newSpecies: PokemonSpecies | undefined;
|
||||||
|
let bstCap = 9999;
|
||||||
|
let bstMin = 0;
|
||||||
|
if (originalBst) {
|
||||||
|
bstCap = originalBst + 100;
|
||||||
|
bstMin = originalBst - 100;
|
||||||
|
}
|
||||||
while (isNullOrUndefined(newSpecies)) {
|
while (isNullOrUndefined(newSpecies)) {
|
||||||
let bstCap = 9999;
|
|
||||||
let bstMin = 0;
|
|
||||||
if (originalBst) {
|
|
||||||
bstCap = originalBst + 100;
|
|
||||||
bstMin = originalBst - 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all non-legendary species that fall within the Bst range requirements
|
// Get all non-legendary species that fall within the Bst range requirements
|
||||||
let validSpecies = allSpecies
|
let validSpecies = allSpecies
|
||||||
.filter(s => {
|
.filter(s => {
|
||||||
|
@ -33,7 +33,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
|
|||||||
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "buoy",
|
spriteKey: "lost_at_sea_buoy",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: false,
|
hasShadow: false,
|
||||||
x: 20,
|
x: 20,
|
||||||
|
@ -37,7 +37,7 @@ export const MysteriousChestEncounter: MysteryEncounter =
|
|||||||
.withCatchAllowed(true)
|
.withCatchAllowed(true)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "chest_blue",
|
spriteKey: "mysterious_chest_blue",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
y: 8,
|
y: 8,
|
||||||
@ -46,7 +46,7 @@ export const MysteriousChestEncounter: MysteryEncounter =
|
|||||||
disableAnimation: true, // Re-enabled after option select
|
disableAnimation: true, // Re-enabled after option select
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
spriteKey: "chest_red",
|
spriteKey: "mysterious_chest_red",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: false,
|
hasShadow: false,
|
||||||
y: 8,
|
y: 8,
|
||||||
@ -163,11 +163,12 @@ export const MysteriousChestEncounter: MysteryEncounter =
|
|||||||
leaveEncounterWithoutBattle(scene);
|
leaveEncounterWithoutBattle(scene);
|
||||||
} else {
|
} else {
|
||||||
// Your highest level unfainted Pokemon gets OHKO. Start battle against a Gimmighoul (35%)
|
// Your highest level unfainted Pokemon gets OHKO. Start battle against a Gimmighoul (35%)
|
||||||
const highestLevelPokemon = getHighestLevelPlayerPokemon(
|
const highestLevelPokemon = getHighestLevelPlayerPokemon(scene, true, false);
|
||||||
scene,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
koPlayerPokemon(scene, highestLevelPokemon);
|
koPlayerPokemon(scene, highestLevelPokemon);
|
||||||
|
|
||||||
|
encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender());
|
||||||
|
await showEncounterText(scene, `${namespace}.option.1.bad`);
|
||||||
|
|
||||||
// Handle game over edge case
|
// Handle game over edge case
|
||||||
const allowedPokemon = scene.getParty().filter(p => p.isAllowedInBattle());
|
const allowedPokemon = scene.getParty().filter(p => p.isAllowedInBattle());
|
||||||
if (allowedPokemon.length === 0) {
|
if (allowedPokemon.length === 0) {
|
||||||
@ -176,8 +177,6 @@ export const MysteriousChestEncounter: MysteryEncounter =
|
|||||||
scene.unshiftPhase(new GameOverPhase(scene));
|
scene.unshiftPhase(new GameOverPhase(scene));
|
||||||
} else {
|
} else {
|
||||||
// Show which Pokemon was KOed, then start battle against Gimmighoul
|
// Show which Pokemon was KOed, then start battle against Gimmighoul
|
||||||
encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender());
|
|
||||||
await showEncounterText(scene, `${namespace}.option.1.bad`);
|
|
||||||
transitionMysteryEncounterIntroVisuals(scene, true, true, 500);
|
transitionMysteryEncounterIntroVisuals(scene, true, true, 500);
|
||||||
setEncounterRewards(scene, { fillRemaining: true });
|
setEncounterRewards(scene, { fillRemaining: true });
|
||||||
await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]);
|
await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]);
|
||||||
|
@ -8,10 +8,11 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
|||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups";
|
import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups";
|
||||||
import { getEncounterText, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import Pokemon, { PlayerPokemon } from "#app/field/pokemon";
|
import Pokemon, { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import { isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounter:partTimer";
|
const namespace = "mysteryEncounter:partTimer";
|
||||||
@ -27,7 +28,7 @@ export const PartTimerEncounter: MysteryEncounter =
|
|||||||
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "warehouse_crate",
|
spriteKey: "part_timer_crate",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: false,
|
hasShadow: false,
|
||||||
y: 6,
|
y: 6,
|
||||||
@ -117,11 +118,7 @@ export const PartTimerEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Only Pokemon non-KOd pokemon can be selected
|
// Only Pokemon non-KOd pokemon can be selected
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
if (!pokemon.isAllowedInBattle()) {
|
return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}.invalid_selection`);
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
||||||
@ -198,11 +195,7 @@ export const PartTimerEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Only Pokemon non-KOd pokemon can be selected
|
// Only Pokemon non-KOd pokemon can be selected
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
if (!pokemon.isAllowedInBattle()) {
|
return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}.invalid_selection`);
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
||||||
|
@ -79,8 +79,8 @@ export const SafariZoneEncounter: MysteryEncounter =
|
|||||||
scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav");
|
scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav");
|
||||||
scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims", "PRSFX- Sludge Bomb2.wav");
|
scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims", "PRSFX- Sludge Bomb2.wav");
|
||||||
scene.loadSe("PRSFX- Taunt2", "battle_anims", "PRSFX- Taunt2.wav");
|
scene.loadSe("PRSFX- Taunt2", "battle_anims", "PRSFX- Taunt2.wav");
|
||||||
scene.loadAtlas("bait", "mystery-encounters");
|
scene.loadAtlas("safari_zone_bait", "mystery-encounters");
|
||||||
scene.loadAtlas("mud", "mystery-encounters");
|
scene.loadAtlas("safari_zone_mud", "mystery-encounters");
|
||||||
// Clear enemy party
|
// Clear enemy party
|
||||||
scene.currentBattle.enemyParty = [];
|
scene.currentBattle.enemyParty = [];
|
||||||
await transitionMysteryEncounterIntroVisuals(scene);
|
await transitionMysteryEncounterIntroVisuals(scene);
|
||||||
@ -254,7 +254,7 @@ async function summonSafariPokemon(scene: BattleScene) {
|
|||||||
let enemySpecies;
|
let enemySpecies;
|
||||||
let pokemon;
|
let pokemon;
|
||||||
scene.executeWithSeedOffset(() => {
|
scene.executeWithSeedOffset(() => {
|
||||||
enemySpecies = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5]));
|
enemySpecies = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5], undefined, undefined, false, false, false));
|
||||||
const level = scene.currentBattle.getLevelForWave();
|
const level = scene.currentBattle.getLevelForWave();
|
||||||
enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(level, true, false, scene.gameMode));
|
enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(level, true, false, scene.gameMode));
|
||||||
pokemon = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, false);
|
pokemon = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, false);
|
||||||
@ -282,7 +282,7 @@ async function summonSafariPokemon(scene: BattleScene) {
|
|||||||
pokemon.calculateStats();
|
pokemon.calculateStats();
|
||||||
|
|
||||||
scene.currentBattle.enemyParty.unshift(pokemon);
|
scene.currentBattle.enemyParty.unshift(pokemon);
|
||||||
}, scene.currentBattle.waveIndex * 1000 + encounter.misc.safariPokemonRemaining);
|
}, scene.currentBattle.waveIndex * 1000 * encounter.misc.safariPokemonRemaining);
|
||||||
|
|
||||||
scene.gameData.setPokemonSeen(pokemon, true);
|
scene.gameData.setPokemonSeen(pokemon, true);
|
||||||
await pokemon.loadAssets();
|
await pokemon.loadAssets();
|
||||||
@ -322,7 +322,7 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise<boo
|
|||||||
const originalY: number = pokemon.y;
|
const originalY: number = pokemon.y;
|
||||||
|
|
||||||
const fpOffset = pokemon.getFieldPositionOffset();
|
const fpOffset = pokemon.getFieldPositionOffset();
|
||||||
const bait: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "bait", "0001.png");
|
const bait: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "safari_zone_bait", "0001.png");
|
||||||
bait.setOrigin(0.5, 0.625);
|
bait.setOrigin(0.5, 0.625);
|
||||||
scene.field.add(bait);
|
scene.field.add(bait);
|
||||||
|
|
||||||
@ -388,7 +388,7 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise<bool
|
|||||||
const originalY: number = pokemon.y;
|
const originalY: number = pokemon.y;
|
||||||
|
|
||||||
const fpOffset = pokemon.getFieldPositionOffset();
|
const fpOffset = pokemon.getFieldPositionOffset();
|
||||||
const mud: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 35, "mud", "0001.png");
|
const mud: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 35, "safari_zone_mud", "0001.png");
|
||||||
mud.setOrigin(0.5, 0.625);
|
mud.setOrigin(0.5, 0.625);
|
||||||
scene.field.add(mud);
|
scene.field.add(mud);
|
||||||
|
|
||||||
|
@ -9,12 +9,13 @@ import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-enc
|
|||||||
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
||||||
import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements";
|
import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements";
|
||||||
import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { applyDamageToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { applyDamageToPokemon, applyModifierTypeToPlayerPokemon, isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import { getNatureName } from "#app/data/nature";
|
import { getNatureName } from "#app/data/nature";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import i18next from "i18next";
|
||||||
|
|
||||||
/** the i18n namespace for this encounter */
|
/** the i18n namespace for this encounter */
|
||||||
const namespace = "mysteryEncounter:shadyVitaminDealer";
|
const namespace = "mysteryEncounter:shadyVitaminDealer";
|
||||||
@ -32,7 +33,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter =
|
|||||||
.withEncounterTier(MysteryEncounterTier.COMMON)
|
.withEncounterTier(MysteryEncounterTier.COMMON)
|
||||||
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
||||||
.withSceneRequirement(new MoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER)) // Must have the money for at least the cheap deal
|
.withSceneRequirement(new MoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER)) // Must have the money for at least the cheap deal
|
||||||
.withPrimaryPokemonHealthRatioRequirement([0.5, 1]) // At least 1 Pokemon must have above half HP
|
.withPrimaryPokemonHealthRatioRequirement([0.51, 1]) // At least 1 Pokemon must have above half HP
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: Species.KROOKODILE.toString(),
|
spriteKey: Species.KROOKODILE.toString(),
|
||||||
@ -44,7 +45,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter =
|
|||||||
yShadow: -5
|
yShadow: -5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
spriteKey: "b2w2_veteran_m",
|
spriteKey: "shady_vitamin_dealer",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
x: -12,
|
x: -12,
|
||||||
@ -98,8 +99,10 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter =
|
|||||||
// Only Pokemon that can gain benefits are above half HP with no status
|
// Only Pokemon that can gain benefits are above half HP with no status
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
// If pokemon meets primary pokemon reqs, it can be selected
|
// If pokemon meets primary pokemon reqs, it can be selected
|
||||||
const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon);
|
if (!pokemon.isAllowed()) {
|
||||||
if (!meetsReqs) {
|
return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null;
|
||||||
|
}
|
||||||
|
if (!encounter.pokemonMeetsPrimaryRequirements(scene, pokemon)) {
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,13 +178,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Only Pokemon that can gain benefits are unfainted
|
// Only Pokemon that can gain benefits are unfainted
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
// If pokemon is unfainted it can be selected
|
return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}.invalid_selection`);
|
||||||
const meetsReqs = !pokemon.isFainted(true);
|
|
||||||
if (!meetsReqs) {
|
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
||||||
|
@ -44,7 +44,7 @@ export const TeleportingHijinksEncounter: MysteryEncounter =
|
|||||||
.withCatchAllowed(true)
|
.withCatchAllowed(true)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "teleporter",
|
spriteKey: "teleporting_hijinks_teleporter",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
x: 4,
|
x: 4,
|
||||||
@ -171,6 +171,12 @@ async function doBiomeTransitionDialogueAndBattleInit(scene: BattleScene) {
|
|||||||
const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true);
|
const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true);
|
||||||
const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true);
|
const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true);
|
||||||
encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon));
|
encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon));
|
||||||
|
|
||||||
|
// Defense/Spd buffs below wave 50, Atk/Def/Spd buffs otherwise
|
||||||
|
const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = scene.currentBattle.waveIndex < 50 ?
|
||||||
|
[Stat.DEF, Stat.SPDEF, Stat.SPD] :
|
||||||
|
[Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD];
|
||||||
|
|
||||||
const config: EnemyPartyConfig = {
|
const config: EnemyPartyConfig = {
|
||||||
pokemonConfigs: [{
|
pokemonConfigs: [{
|
||||||
level: level,
|
level: level,
|
||||||
@ -180,7 +186,7 @@ async function doBiomeTransitionDialogueAndBattleInit(scene: BattleScene) {
|
|||||||
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
|
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
|
||||||
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
|
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
|
||||||
queueEncounterMessage(pokemon.scene, `${namespace}.boss_enraged`);
|
queueEncounterMessage(pokemon.scene, `${namespace}.boss_enraged`);
|
||||||
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD], 1));
|
pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, statChangesForBattle, 1));
|
||||||
}
|
}
|
||||||
}],
|
}],
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils";
|
import { EnemyPartyConfig, generateModifierType, handleMysteryEncounterBattleFailed, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils";
|
||||||
import { trainerConfigs } from "#app/data/trainer-config";
|
import { trainerConfigs } from "#app/data/trainer-config";
|
||||||
import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import BattleScene from "#app/battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
import { randSeedShuffle } from "#app/utils";
|
import { randSeedShuffle } from "#app/utils";
|
||||||
@ -14,8 +13,6 @@ import { Species } from "#enums/species";
|
|||||||
import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species";
|
import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Type } from "#app/data/type";
|
|
||||||
import { Stat } from "#enums/stat";
|
|
||||||
import { PlayerPokemon } from "#app/field/pokemon";
|
import { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { IEggOptions } from "#app/data/egg";
|
import { IEggOptions } from "#app/data/egg";
|
||||||
@ -24,15 +21,18 @@ import { EggTier } from "#enums/egg-type";
|
|||||||
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { achvs } from "#app/system/achv";
|
import { achvs } from "#app/system/achv";
|
||||||
|
import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
||||||
|
import { Type } from "#app/data/type";
|
||||||
|
import { getPokeballTintColor } from "#app/data/pokeball";
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounter:expertPokemonBreeder";
|
const namespace = "mysteryEncounter:expertPokemonBreeder";
|
||||||
|
|
||||||
const trainerNameKey = "trainerNames:expert_pokemon_breeder";
|
const trainerNameKey = "trainerNames:expert_pokemon_breeder";
|
||||||
|
|
||||||
const FIRST_STAGE_EVOLUTION_WAVE = 30;
|
const FIRST_STAGE_EVOLUTION_WAVE = 45;
|
||||||
const SECOND_STAGE_EVOLUTION_WAVE = 45;
|
const SECOND_STAGE_EVOLUTION_WAVE = 60;
|
||||||
const FINAL_STAGE_EVOLUTION_WAVE = 60;
|
const FINAL_STAGE_EVOLUTION_WAVE = 75;
|
||||||
|
|
||||||
const FRIENDSHIP_ADDED = 20;
|
const FRIENDSHIP_ADDED = 20;
|
||||||
|
|
||||||
@ -216,6 +216,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter =
|
|||||||
const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0];
|
const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0];
|
||||||
|
|
||||||
const { pokemon1, pokemon1CommonEggs, pokemon1RareEggs } = encounter.misc;
|
const { pokemon1, pokemon1CommonEggs, pokemon1RareEggs } = encounter.misc;
|
||||||
|
encounter.misc.chosenPokemon = pokemon1;
|
||||||
encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender());
|
encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender());
|
||||||
const eggOptions = getEggOptions(scene, pokemon1CommonEggs, pokemon1RareEggs);
|
const eggOptions = getEggOptions(scene, pokemon1CommonEggs, pokemon1RareEggs);
|
||||||
setEncounterRewards(scene, { fillRemaining: true }, eggOptions);
|
setEncounterRewards(scene, { fillRemaining: true }, eggOptions);
|
||||||
@ -241,14 +242,11 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter =
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
encounter.onGameOver = onGameOver;
|
||||||
initBattleWithEnemyConfig(scene, config);
|
initBattleWithEnemyConfig(scene, config);
|
||||||
})
|
})
|
||||||
.withPostOptionPhase(async (scene: BattleScene) => {
|
.withPostOptionPhase(async (scene: BattleScene) => {
|
||||||
// Give achievement if in Space biome
|
await doPostEncounterCleanup(scene);
|
||||||
checkAchievement(scene);
|
|
||||||
// Give 20 friendship to the chosen pokemon
|
|
||||||
scene.currentBattle.mysteryEncounter!.misc.pokemon1.addFriendship(FRIENDSHIP_ADDED);
|
|
||||||
await restorePartyAndHeldItems(scene);
|
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
@ -270,6 +268,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter =
|
|||||||
const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0];
|
const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0];
|
||||||
|
|
||||||
const { pokemon2, pokemon2CommonEggs, pokemon2RareEggs } = encounter.misc;
|
const { pokemon2, pokemon2CommonEggs, pokemon2RareEggs } = encounter.misc;
|
||||||
|
encounter.misc.chosenPokemon = pokemon2;
|
||||||
encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender());
|
encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender());
|
||||||
const eggOptions = getEggOptions(scene, pokemon2CommonEggs, pokemon2RareEggs);
|
const eggOptions = getEggOptions(scene, pokemon2CommonEggs, pokemon2RareEggs);
|
||||||
setEncounterRewards(scene, { fillRemaining: true }, eggOptions);
|
setEncounterRewards(scene, { fillRemaining: true }, eggOptions);
|
||||||
@ -295,14 +294,11 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter =
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
encounter.onGameOver = onGameOver;
|
||||||
initBattleWithEnemyConfig(scene, config);
|
initBattleWithEnemyConfig(scene, config);
|
||||||
})
|
})
|
||||||
.withPostOptionPhase(async (scene: BattleScene) => {
|
.withPostOptionPhase(async (scene: BattleScene) => {
|
||||||
// Give achievement if in Space biome
|
await doPostEncounterCleanup(scene);
|
||||||
checkAchievement(scene);
|
|
||||||
// Give 20 friendship to the chosen pokemon
|
|
||||||
scene.currentBattle.mysteryEncounter!.misc.pokemon2.addFriendship(FRIENDSHIP_ADDED);
|
|
||||||
await restorePartyAndHeldItems(scene);
|
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
@ -324,6 +320,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter =
|
|||||||
const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0];
|
const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0];
|
||||||
|
|
||||||
const { pokemon3, pokemon3CommonEggs, pokemon3RareEggs } = encounter.misc;
|
const { pokemon3, pokemon3CommonEggs, pokemon3RareEggs } = encounter.misc;
|
||||||
|
encounter.misc.chosenPokemon = pokemon3;
|
||||||
encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender());
|
encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender());
|
||||||
const eggOptions = getEggOptions(scene, pokemon3CommonEggs, pokemon3RareEggs);
|
const eggOptions = getEggOptions(scene, pokemon3CommonEggs, pokemon3RareEggs);
|
||||||
setEncounterRewards(scene, { fillRemaining: true }, eggOptions);
|
setEncounterRewards(scene, { fillRemaining: true }, eggOptions);
|
||||||
@ -349,19 +346,17 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter =
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
encounter.onGameOver = onGameOver;
|
||||||
initBattleWithEnemyConfig(scene, config);
|
initBattleWithEnemyConfig(scene, config);
|
||||||
})
|
})
|
||||||
.withPostOptionPhase(async (scene: BattleScene) => {
|
.withPostOptionPhase(async (scene: BattleScene) => {
|
||||||
// Give achievement if in Space biome
|
await doPostEncounterCleanup(scene);
|
||||||
checkAchievement(scene);
|
|
||||||
// Give 20 friendship to the chosen pokemon
|
|
||||||
scene.currentBattle.mysteryEncounter!.misc.pokemon3.addFriendship(FRIENDSHIP_ADDED);
|
|
||||||
await restorePartyAndHeldItems(scene);
|
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.withOutroDialogue([
|
.withOutroDialogue([
|
||||||
{
|
{
|
||||||
|
speaker: trainerNameKey,
|
||||||
text: `${namespace}.outro`,
|
text: `${namespace}.outro`,
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@ -390,15 +385,7 @@ function getPartyConfig(scene: BattleScene): EnemyPartyConfig {
|
|||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(scene, modifierTypes.TERA_SHARD, [Type.STEEL]) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(scene, modifierTypes.TERA_SHARD, [Type.STEEL]) as PokemonHeldItemModifierType,
|
||||||
},
|
}
|
||||||
{
|
|
||||||
modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.ATK]) as PokemonHeldItemModifierType,
|
|
||||||
stackCount: 1 + Math.floor(waveIndex / 20), // +1 Protein every 20 waves
|
|
||||||
},
|
|
||||||
{
|
|
||||||
modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType,
|
|
||||||
stackCount: 1 + Math.floor(waveIndex / 40), // +1 Carbos every 40 waves
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -547,3 +534,83 @@ async function restorePartyAndHeldItems(scene: BattleScene) {
|
|||||||
});
|
});
|
||||||
await scene.updateModifiers(true);
|
await scene.updateModifiers(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onGameOver(scene: BattleScene) {
|
||||||
|
const encounter = scene.currentBattle.mysteryEncounter!;
|
||||||
|
|
||||||
|
encounter.dialogue.outro = [
|
||||||
|
{
|
||||||
|
speaker: trainerNameKey,
|
||||||
|
text: `${namespace}.outro_failed`,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// Restore original party, player loses all friendship with chosen mon (it remains fainted)
|
||||||
|
restorePartyAndHeldItems(scene);
|
||||||
|
const chosenPokemon = encounter.misc.chosenPokemon;
|
||||||
|
chosenPokemon.friendship = 0;
|
||||||
|
|
||||||
|
// Clear all rewards that would have been earned
|
||||||
|
encounter.doEncounterRewards = undefined;
|
||||||
|
|
||||||
|
// Set flag that encounter was failed
|
||||||
|
encounter.misc.encounterFailed = true;
|
||||||
|
|
||||||
|
// Revert BGM
|
||||||
|
scene.playBgm(scene.arena.bgm);
|
||||||
|
|
||||||
|
// Return enemy Pokemon
|
||||||
|
const pokemon = scene.getEnemyPokemon();
|
||||||
|
if (pokemon) {
|
||||||
|
scene.playSound("se/pb_rel");
|
||||||
|
pokemon.hideInfo();
|
||||||
|
pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn");
|
||||||
|
scene.tweens.add({
|
||||||
|
targets: pokemon,
|
||||||
|
duration: 250,
|
||||||
|
ease: "Sine.easeIn",
|
||||||
|
scale: 0.5,
|
||||||
|
onComplete: () => {
|
||||||
|
scene.field.remove(pokemon, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the enemy trainer
|
||||||
|
scene.time.delayedCall(250, () => {
|
||||||
|
const sprites = scene.currentBattle.trainer?.getSprites();
|
||||||
|
const tintSprites = scene.currentBattle.trainer?.getTintSprites();
|
||||||
|
if (sprites && tintSprites) {
|
||||||
|
for (let i = 0; i < sprites.length; i++) {
|
||||||
|
sprites[i].setVisible(true);
|
||||||
|
tintSprites[i].setVisible(true);
|
||||||
|
sprites[i].clearTint();
|
||||||
|
tintSprites[i].clearTint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scene.tweens.add({
|
||||||
|
targets: scene.currentBattle.trainer,
|
||||||
|
x: "-=16",
|
||||||
|
y: "+=16",
|
||||||
|
alpha: 1,
|
||||||
|
ease: "Sine.easeInOut",
|
||||||
|
duration: 750
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
handleMysteryEncounterBattleFailed(scene, true);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doPostEncounterCleanup(scene: BattleScene) {
|
||||||
|
const encounter = scene.currentBattle.mysteryEncounter!;
|
||||||
|
if (!encounter.misc.encounterFailed) {
|
||||||
|
// Give achievement if in Space biome
|
||||||
|
checkAchievement(scene);
|
||||||
|
// Give 20 friendship to the chosen pokemon
|
||||||
|
encounter.misc.chosenPokemon.addFriendship(FRIENDSHIP_ADDED);
|
||||||
|
await restorePartyAndHeldItems(scene);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -58,12 +58,12 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter =
|
|||||||
.withOnInit((scene: BattleScene) => {
|
.withOnInit((scene: BattleScene) => {
|
||||||
const encounter = scene.currentBattle.mysteryEncounter!;
|
const encounter = scene.currentBattle.mysteryEncounter!;
|
||||||
|
|
||||||
let species = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5]));
|
let species = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5], undefined, undefined, false, false, false));
|
||||||
const tries = 0;
|
const tries = 0;
|
||||||
|
|
||||||
// Reroll any species that don't have HAs
|
// Reroll any species that don't have HAs
|
||||||
while ((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) && tries < 5) {
|
while ((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) && tries < 5) {
|
||||||
species = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5]));
|
species = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5], undefined, undefined, false, false, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
let pokemon: PlayerPokemon;
|
let pokemon: PlayerPokemon;
|
||||||
|
@ -13,13 +13,14 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
|||||||
import BattleScene from "#app/battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
||||||
import { getEncounterText, queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import HeldModifierConfig from "#app/interfaces/held-modifier-config";
|
import HeldModifierConfig from "#app/interfaces/held-modifier-config";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { getStatKey } from "#enums/stat";
|
import { getStatKey } from "#enums/stat";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import { isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
|
|
||||||
/** The i18n namespace for the encounter */
|
/** The i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounter:trainingSession";
|
const namespace = "mysteryEncounter:trainingSession";
|
||||||
@ -38,7 +39,7 @@ export const TrainingSessionEncounter: MysteryEncounter =
|
|||||||
.withHideWildIntroMessage(true)
|
.withHideWildIntroMessage(true)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: "training_gear",
|
spriteKey: "training_session_gear",
|
||||||
fileRoot: "mystery-encounters",
|
fileRoot: "mystery-encounters",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
y: 6,
|
y: 6,
|
||||||
@ -77,12 +78,7 @@ export const TrainingSessionEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Only Pokemon that are not KOed/legal can be trained
|
// Only Pokemon that are not KOed/legal can be trained
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
const meetsReqs = pokemon.isAllowedInBattle();
|
return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}.invalid_selection`);
|
||||||
if (!meetsReqs) {
|
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
||||||
@ -211,12 +207,7 @@ export const TrainingSessionEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Only Pokemon that are not KOed/legal can be trained
|
// Only Pokemon that are not KOed/legal can be trained
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
const meetsReqs = pokemon.isAllowedInBattle();
|
return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}.invalid_selection`);
|
||||||
if (!meetsReqs) {
|
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
||||||
@ -307,12 +298,7 @@ export const TrainingSessionEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Only Pokemon that are not KOed/legal can be trained
|
// Only Pokemon that are not KOed/legal can be trained
|
||||||
const selectableFilter = (pokemon: Pokemon) => {
|
const selectableFilter = (pokemon: Pokemon) => {
|
||||||
const meetsReqs = pokemon.isAllowedInBattle();
|
return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}.invalid_selection`);
|
||||||
if (!meetsReqs) {
|
|
||||||
return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter);
|
||||||
|
@ -50,7 +50,7 @@ export const UncommonBreedEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Calculate boss mon
|
// Calculate boss mon
|
||||||
// Level equal to 2 below highest party member
|
// Level equal to 2 below highest party member
|
||||||
const level = getHighestLevelPlayerPokemon(scene).level - 2;
|
const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2;
|
||||||
const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true);
|
const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true);
|
||||||
const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true);
|
const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true);
|
||||||
const speciesRootForm = pokemon.species.getRootSpeciesId();
|
const speciesRootForm = pokemon.species.getRootSpeciesId();
|
||||||
|
@ -20,7 +20,8 @@ import i18next from "#app/plugins/i18n";
|
|||||||
import { doPokemonTransformationSequence, TransformationScreenPosition } from "#app/data/mystery-encounters/utils/encounter-transformation-sequence";
|
import { doPokemonTransformationSequence, TransformationScreenPosition } from "#app/data/mystery-encounters/utils/encounter-transformation-sequence";
|
||||||
import { getLevelTotalExp } from "#app/data/exp";
|
import { getLevelTotalExp } from "#app/data/exp";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES, GameModes } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import { Challenges } from "#enums/challenges";
|
||||||
|
|
||||||
/** i18n namespace for encounter */
|
/** i18n namespace for encounter */
|
||||||
const namespace = "mysteryEncounter:weirdDream";
|
const namespace = "mysteryEncounter:weirdDream";
|
||||||
@ -82,6 +83,9 @@ const SUPER_LEGENDARY_BST_THRESHOLD = 600;
|
|||||||
const NON_LEGENDARY_BST_THRESHOLD = 570;
|
const NON_LEGENDARY_BST_THRESHOLD = 570;
|
||||||
const GAIN_OLD_GATEAU_ITEM_BST_THRESHOLD = 450;
|
const GAIN_OLD_GATEAU_ITEM_BST_THRESHOLD = 450;
|
||||||
|
|
||||||
|
/** 0-100 */
|
||||||
|
const PERCENT_LEVEL_LOSS_ON_REFUSE = 12.5;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Value ranges of the resulting species BST transformations after adding values to original species
|
* Value ranges of the resulting species BST transformations after adding values to original species
|
||||||
* 2 Pokemon in the party use this range
|
* 2 Pokemon in the party use this range
|
||||||
@ -101,7 +105,7 @@ const STANDARD_BST_TRANSFORM_BASE_VALUES: [number, number] = [40, 50];
|
|||||||
export const WeirdDreamEncounter: MysteryEncounter =
|
export const WeirdDreamEncounter: MysteryEncounter =
|
||||||
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM)
|
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM)
|
||||||
.withEncounterTier(MysteryEncounterTier.ROGUE)
|
.withEncounterTier(MysteryEncounterTier.ROGUE)
|
||||||
.withDisabledGameModes(GameModes.CHALLENGE)
|
.withDisallowedChallenges(Challenges.SINGLE_TYPE)
|
||||||
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
@ -207,7 +211,7 @@ export const WeirdDreamEncounter: MysteryEncounter =
|
|||||||
async (scene: BattleScene) => {
|
async (scene: BattleScene) => {
|
||||||
// Reduce party levels by 20%
|
// Reduce party levels by 20%
|
||||||
for (const pokemon of scene.getParty()) {
|
for (const pokemon of scene.getParty()) {
|
||||||
pokemon.level = Math.max(Math.ceil(0.8 * pokemon.level), 1);
|
pokemon.level = Math.max(Math.ceil((100 - PERCENT_LEVEL_LOSS_ON_REFUSE) / 100 * pokemon.level), 1);
|
||||||
pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate);
|
pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate);
|
||||||
pokemon.levelExp = 0;
|
pokemon.levelExp = 0;
|
||||||
|
|
||||||
@ -339,6 +343,9 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the previous pokemon had pokerus, transfer to new pokemon
|
||||||
|
newPokemon.pokerus = previousPokemon.pokerus;
|
||||||
|
|
||||||
// If the previous pokemon had higher IVs, override to those (after updating dex IVs > prevents perfect 31s on a new unlock)
|
// If the previous pokemon had higher IVs, override to those (after updating dex IVs > prevents perfect 31s on a new unlock)
|
||||||
newPokemon.ivs = newPokemon.ivs.map((iv, index) => {
|
newPokemon.ivs = newPokemon.ivs.map((iv, index) => {
|
||||||
return previousPokemon.ivs[index] > iv ? previousPokemon.ivs[index] : iv;
|
return previousPokemon.ivs[index] > iv ? previousPokemon.ivs[index] : iv;
|
||||||
@ -349,22 +356,46 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon
|
|||||||
scene.gameData.addStarterCandy(getPokemonSpecies(speciesRootForm), 1);
|
scene.gameData.addStarterCandy(getPokemonSpecies(speciesRootForm), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the moveset of the new pokemon to be the same as previous, but with 1 egg move of the new species
|
// Set the moveset of the new pokemon to be the same as previous, but with 1 egg move and 1 (attempted) STAB move of the new species
|
||||||
|
newPokemon.generateAndPopulateMoveset();
|
||||||
|
|
||||||
|
// Try to find a favored STAB move
|
||||||
|
let favoredMove;
|
||||||
|
for (const move of newPokemon.moveset) {
|
||||||
|
// Needs to match first type, second type will be replaced
|
||||||
|
if (move?.getMove().type === newPokemon.getTypes()[0]) {
|
||||||
|
favoredMove = move;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If was unable to find a move, uses first move in moveset (typically a high power STAB move)
|
||||||
|
favoredMove = favoredMove ?? newPokemon.moveset[0];
|
||||||
|
|
||||||
newPokemon.moveset = previousPokemon.moveset;
|
newPokemon.moveset = previousPokemon.moveset;
|
||||||
|
let eggMoveIndex: null | number = null;
|
||||||
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
|
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
|
||||||
const eggMoves = speciesEggMoves[speciesRootForm];
|
const eggMoves = speciesEggMoves[speciesRootForm];
|
||||||
const eggMoveIndex = randSeedInt(4);
|
const randomEggMoveIndex = randSeedInt(4);
|
||||||
const randomEggMove = eggMoves[eggMoveIndex];
|
const randomEggMove = eggMoves[randomEggMoveIndex];
|
||||||
if (newPokemon.moveset.length < 4) {
|
if (newPokemon.moveset.length < 4) {
|
||||||
newPokemon.moveset.push(new PokemonMove(randomEggMove));
|
newPokemon.moveset.push(new PokemonMove(randomEggMove));
|
||||||
} else {
|
} else {
|
||||||
newPokemon.moveset[randSeedInt(4)] = new PokemonMove(randomEggMove);
|
eggMoveIndex = randSeedInt(4);
|
||||||
|
newPokemon.moveset[eggMoveIndex] = new PokemonMove(randomEggMove);
|
||||||
}
|
}
|
||||||
// For pokemon that the player owns (including ones just caught), unlock the egg move
|
// For pokemon that the player owns (including ones just caught), unlock the egg move
|
||||||
if (!!scene.gameData.dexData[speciesRootForm].caughtAttr) {
|
if (!!scene.gameData.dexData[speciesRootForm].caughtAttr) {
|
||||||
await scene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), eggMoveIndex, true);
|
await scene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), randomEggMoveIndex, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (favoredMove) {
|
||||||
|
let favoredMoveIndex = randSeedInt(4);
|
||||||
|
while (favoredMoveIndex === eggMoveIndex) {
|
||||||
|
favoredMoveIndex = randSeedInt(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
newPokemon.moveset[favoredMoveIndex] = favoredMove;
|
||||||
|
}
|
||||||
|
|
||||||
// Randomize the second type of the pokemon
|
// Randomize the second type of the pokemon
|
||||||
// If the pokemon does not normally have a second type, it will gain 1
|
// If the pokemon does not normally have a second type, it will gain 1
|
||||||
|
@ -259,23 +259,23 @@ export class WeatherRequirement extends EncounterSceneRequirement {
|
|||||||
|
|
||||||
export class PartySizeRequirement extends EncounterSceneRequirement {
|
export class PartySizeRequirement extends EncounterSceneRequirement {
|
||||||
partySizeRange: [number, number];
|
partySizeRange: [number, number];
|
||||||
excludeFainted: boolean;
|
excludeDisallowedPokemon: boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used for specifying a party size requirement
|
* Used for specifying a party size requirement
|
||||||
* If min and max are equivalent, will check for exact size
|
* If min and max are equivalent, will check for exact size
|
||||||
* @param partySizeRange
|
* @param partySizeRange
|
||||||
* @param excludeFainted
|
* @param excludeDisallowedPokemon
|
||||||
*/
|
*/
|
||||||
constructor(partySizeRange: [number, number], excludeFainted: boolean) {
|
constructor(partySizeRange: [number, number], excludeDisallowedPokemon: boolean) {
|
||||||
super();
|
super();
|
||||||
this.partySizeRange = partySizeRange;
|
this.partySizeRange = partySizeRange;
|
||||||
this.excludeFainted = excludeFainted;
|
this.excludeDisallowedPokemon = excludeDisallowedPokemon;
|
||||||
}
|
}
|
||||||
|
|
||||||
override meetsRequirement(scene: BattleScene): boolean {
|
override meetsRequirement(scene: BattleScene): boolean {
|
||||||
if (!isNullOrUndefined(this.partySizeRange) && this.partySizeRange?.[0] <= this.partySizeRange?.[1]) {
|
if (!isNullOrUndefined(this.partySizeRange) && this.partySizeRange?.[0] <= this.partySizeRange?.[1]) {
|
||||||
const partySize = this.excludeFainted ? scene.getParty().filter(p => p.isAllowedInBattle()).length : scene.getParty().length;
|
const partySize = this.excludeDisallowedPokemon ? scene.getParty().filter(p => p.isAllowedInBattle()).length : scene.getParty().length;
|
||||||
if (partySize >= 0 && (this.partySizeRange?.[0] >= 0 && this.partySizeRange?.[0] > partySize) || (this.partySizeRange?.[1] >= 0 && this.partySizeRange?.[1] < partySize)) {
|
if (partySize >= 0 && (this.partySizeRange?.[0] >= 0 && this.partySizeRange?.[0] > partySize) || (this.partySizeRange?.[1] >= 0 && this.partySizeRange?.[1] < partySize)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -767,12 +767,14 @@ export class HeldItemRequirement extends EncounterPokemonRequirement {
|
|||||||
requiredHeldItemModifiers: string[];
|
requiredHeldItemModifiers: string[];
|
||||||
minNumberOfPokemon: number;
|
minNumberOfPokemon: number;
|
||||||
invertQuery: boolean;
|
invertQuery: boolean;
|
||||||
|
requireTransferable: boolean;
|
||||||
|
|
||||||
constructor(heldItem: string | string[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) {
|
constructor(heldItem: string | string[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) {
|
||||||
super();
|
super();
|
||||||
this.minNumberOfPokemon = minNumberOfPokemon;
|
this.minNumberOfPokemon = minNumberOfPokemon;
|
||||||
this.invertQuery = invertQuery;
|
this.invertQuery = invertQuery;
|
||||||
this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem];
|
this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem];
|
||||||
|
this.requireTransferable = requireTransferable;
|
||||||
}
|
}
|
||||||
|
|
||||||
override meetsRequirement(scene: BattleScene): boolean {
|
override meetsRequirement(scene: BattleScene): boolean {
|
||||||
@ -787,21 +789,23 @@ export class HeldItemRequirement extends EncounterPokemonRequirement {
|
|||||||
if (!this.invertQuery) {
|
if (!this.invertQuery) {
|
||||||
return partyPokemon.filter((pokemon) => this.requiredHeldItemModifiers.some((heldItem) => {
|
return partyPokemon.filter((pokemon) => this.requiredHeldItemModifiers.some((heldItem) => {
|
||||||
return pokemon.getHeldItems().some((it) => {
|
return pokemon.getHeldItems().some((it) => {
|
||||||
return it.constructor.name === heldItem;
|
return it.constructor.name === heldItem && (!this.requireTransferable || it.isTransferable);
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
// for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers
|
// for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers
|
||||||
// E.g. functions as a blacklist
|
// E.g. functions as a blacklist
|
||||||
return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => {
|
return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => {
|
||||||
return !this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem);
|
return !this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem)
|
||||||
|
&& (!this.requireTransferable || it.isTransferable);
|
||||||
}).length > 0);
|
}).length > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
||||||
const requiredItems = pokemon?.getHeldItems().filter((it) => {
|
const requiredItems = pokemon?.getHeldItems().filter((it) => {
|
||||||
return this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem);
|
return this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem)
|
||||||
|
&& (!this.requireTransferable || it.isTransferable);
|
||||||
});
|
});
|
||||||
if (requiredItems && requiredItems.length > 0) {
|
if (requiredItems && requiredItems.length > 0) {
|
||||||
return ["heldItem", requiredItems[0].type.name];
|
return ["heldItem", requiredItems[0].type.name];
|
||||||
@ -814,12 +818,14 @@ export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRe
|
|||||||
requiredHeldItemTypes: Type[];
|
requiredHeldItemTypes: Type[];
|
||||||
minNumberOfPokemon: number;
|
minNumberOfPokemon: number;
|
||||||
invertQuery: boolean;
|
invertQuery: boolean;
|
||||||
|
requireTransferable: boolean;
|
||||||
|
|
||||||
constructor(heldItemTypes: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) {
|
constructor(heldItemTypes: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) {
|
||||||
super();
|
super();
|
||||||
this.minNumberOfPokemon = minNumberOfPokemon;
|
this.minNumberOfPokemon = minNumberOfPokemon;
|
||||||
this.invertQuery = invertQuery;
|
this.invertQuery = invertQuery;
|
||||||
this.requiredHeldItemTypes = Array.isArray(heldItemTypes) ? heldItemTypes : [heldItemTypes];
|
this.requiredHeldItemTypes = Array.isArray(heldItemTypes) ? heldItemTypes : [heldItemTypes];
|
||||||
|
this.requireTransferable = requireTransferable;
|
||||||
}
|
}
|
||||||
|
|
||||||
override meetsRequirement(scene: BattleScene): boolean {
|
override meetsRequirement(scene: BattleScene): boolean {
|
||||||
@ -834,21 +840,29 @@ export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRe
|
|||||||
if (!this.invertQuery) {
|
if (!this.invertQuery) {
|
||||||
return partyPokemon.filter((pokemon) => this.requiredHeldItemTypes.some((heldItemType) => {
|
return partyPokemon.filter((pokemon) => this.requiredHeldItemTypes.some((heldItemType) => {
|
||||||
return pokemon.getHeldItems().some((it) => {
|
return pokemon.getHeldItems().some((it) => {
|
||||||
return it instanceof AttackTypeBoosterModifier && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType;
|
return it instanceof AttackTypeBoosterModifier
|
||||||
|
&& (it.type as AttackTypeBoosterModifierType).moveType === heldItemType
|
||||||
|
&& (!this.requireTransferable || it.isTransferable);
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
// for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers
|
// for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers
|
||||||
// E.g. functions as a blacklist
|
// E.g. functions as a blacklist
|
||||||
return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => {
|
return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => {
|
||||||
return !this.requiredHeldItemTypes.some(heldItemType => it instanceof AttackTypeBoosterModifier && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType);
|
return !this.requiredHeldItemTypes.some(heldItemType =>
|
||||||
|
it instanceof AttackTypeBoosterModifier
|
||||||
|
&& (it.type as AttackTypeBoosterModifierType).moveType === heldItemType
|
||||||
|
&& (!this.requireTransferable || it.isTransferable));
|
||||||
}).length > 0);
|
}).length > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
||||||
const requiredItems = pokemon?.getHeldItems().filter((it) => {
|
const requiredItems = pokemon?.getHeldItems().filter((it) => {
|
||||||
return this.requiredHeldItemTypes.some(heldItemType => it instanceof AttackTypeBoosterModifier && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType);
|
return this.requiredHeldItemTypes.some(heldItemType =>
|
||||||
|
it instanceof AttackTypeBoosterModifier
|
||||||
|
&& (it.type as AttackTypeBoosterModifierType).moveType === heldItemType)
|
||||||
|
&& (!this.requireTransferable || it.isTransferable);
|
||||||
});
|
});
|
||||||
if (requiredItems && requiredItems.length > 0) {
|
if (requiredItems && requiredItems.length > 0) {
|
||||||
return ["heldItem", requiredItems[0].type.name];
|
return ["heldItem", requiredItems[0].type.name];
|
||||||
|
@ -15,6 +15,7 @@ import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
|
|||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { GameModes } from "#app/game-mode";
|
import { GameModes } from "#app/game-mode";
|
||||||
import { EncounterAnim } from "#enums/encounter-anims";
|
import { EncounterAnim } from "#enums/encounter-anims";
|
||||||
|
import { Challenges } from "#enums/challenges";
|
||||||
|
|
||||||
export interface EncounterStartOfBattleEffect {
|
export interface EncounterStartOfBattleEffect {
|
||||||
sourcePokemon?: Pokemon;
|
sourcePokemon?: Pokemon;
|
||||||
@ -40,7 +41,8 @@ export interface IMysteryEncounter {
|
|||||||
spriteConfigs: MysteryEncounterSpriteConfig[];
|
spriteConfigs: MysteryEncounterSpriteConfig[];
|
||||||
encounterTier: MysteryEncounterTier;
|
encounterTier: MysteryEncounterTier;
|
||||||
encounterAnimations?: EncounterAnim[];
|
encounterAnimations?: EncounterAnim[];
|
||||||
disabledGameModes?: GameModes[];
|
disallowedGameModes?: GameModes[];
|
||||||
|
disallowedChallenges?: Challenges[];
|
||||||
hideBattleIntroMessage: boolean;
|
hideBattleIntroMessage: boolean;
|
||||||
autoHideIntroVisuals: boolean;
|
autoHideIntroVisuals: boolean;
|
||||||
enterIntroVisualsFromRight: boolean;
|
enterIntroVisualsFromRight: boolean;
|
||||||
@ -93,7 +95,11 @@ export default class MysteryEncounter implements IMysteryEncounter {
|
|||||||
/**
|
/**
|
||||||
* If specified, defines any game modes where the {@linkcode MysteryEncounter} should *NOT* spawn
|
* If specified, defines any game modes where the {@linkcode MysteryEncounter} should *NOT* spawn
|
||||||
*/
|
*/
|
||||||
disabledGameModes?: GameModes[];
|
disallowedGameModes?: GameModes[];
|
||||||
|
/**
|
||||||
|
* If specified, defines any challenges (from Challenge game mode) where the {@linkcode MysteryEncounter} should *NOT* spawn
|
||||||
|
*/
|
||||||
|
disallowedChallenges?: Challenges[];
|
||||||
/**
|
/**
|
||||||
* If true, hides "A Wild X Appeared" etc. messages
|
* If true, hides "A Wild X Appeared" etc. messages
|
||||||
* Default true
|
* Default true
|
||||||
@ -161,6 +167,11 @@ export default class MysteryEncounter implements IMysteryEncounter {
|
|||||||
doEncounterRewards?: (scene: BattleScene) => boolean;
|
doEncounterRewards?: (scene: BattleScene) => boolean;
|
||||||
/** Will execute callback during VictoryPhase of a continuousEncounter */
|
/** Will execute callback during VictoryPhase of a continuousEncounter */
|
||||||
doContinueEncounter?: (scene: BattleScene) => Promise<void>;
|
doContinueEncounter?: (scene: BattleScene) => Promise<void>;
|
||||||
|
/**
|
||||||
|
* Can perform special logic when a ME battle is lost, before GameOver/battle retry prompt.
|
||||||
|
* Should return `true` if it is treated as "real" Game Over, `false` if not.
|
||||||
|
*/
|
||||||
|
onGameOver?: (scene: BattleScene) => boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requirements
|
* Requirements
|
||||||
@ -656,11 +667,21 @@ export class MysteryEncounterBuilder implements Partial<IMysteryEncounter> {
|
|||||||
/**
|
/**
|
||||||
* Defines any game modes where the Mystery Encounter should *NOT* spawn
|
* Defines any game modes where the Mystery Encounter should *NOT* spawn
|
||||||
* @returns
|
* @returns
|
||||||
* @param disabledGameModes
|
* @param disallowedGameModes
|
||||||
*/
|
*/
|
||||||
withDisabledGameModes(...disabledGameModes: GameModes[]): this & Required<Pick<IMysteryEncounter, "disabledGameModes">> {
|
withDisallowedGameModes(...disallowedGameModes: GameModes[]): this & Required<Pick<IMysteryEncounter, "disallowedGameModes">> {
|
||||||
const gameModes = Array.isArray(disabledGameModes) ? disabledGameModes : [disabledGameModes];
|
const gameModes = Array.isArray(disallowedGameModes) ? disallowedGameModes : [disallowedGameModes];
|
||||||
return Object.assign(this, { disabledGameModes: gameModes });
|
return Object.assign(this, { disallowedGameModes: gameModes });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines any challenges (from Challenge game mode) where the Mystery Encounter should *NOT* spawn
|
||||||
|
* @returns
|
||||||
|
* @param disallowedChallenges
|
||||||
|
*/
|
||||||
|
withDisallowedChallenges(...disallowedChallenges: Challenges[]): this & Required<Pick<IMysteryEncounter, "disallowedChallenges">> {
|
||||||
|
const challenges = Array.isArray(disallowedChallenges) ? disallowedChallenges : [disallowedChallenges];
|
||||||
|
return Object.assign(this, { disallowedChallenges: challenges });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -742,11 +763,11 @@ export class MysteryEncounterBuilder implements Partial<IMysteryEncounter> {
|
|||||||
*
|
*
|
||||||
* @param min min wave (or exact size if only min is given)
|
* @param min min wave (or exact size if only min is given)
|
||||||
* @param max optional max size. If not given, defaults to min => exact wave
|
* @param max optional max size. If not given, defaults to min => exact wave
|
||||||
* @param excludeFainted if true, only counts unfainted mons
|
* @param excludeDisallowedPokemon if true, only counts allowed (legal in Challenge/unfainted) mons
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
withScenePartySizeRequirement(min: number, max?: number, excludeFainted: boolean = false): this & Required<Pick<IMysteryEncounter, "requirements">> {
|
withScenePartySizeRequirement(min: number, max?: number, excludeDisallowedPokemon: boolean = false): this & Required<Pick<IMysteryEncounter, "requirements">> {
|
||||||
return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min], excludeFainted));
|
return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min], excludeDisallowedPokemon));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,7 +43,7 @@ import { Variant } from "#app/data/variant";
|
|||||||
* @param scene
|
* @param scene
|
||||||
*/
|
*/
|
||||||
export function doTrainerExclamation(scene: BattleScene) {
|
export function doTrainerExclamation(scene: BattleScene) {
|
||||||
const exclamationSprite = scene.add.sprite(0, 0, "exclaim");
|
const exclamationSprite = scene.add.sprite(0, 0, "encounter_exclaim");
|
||||||
exclamationSprite.setName("exclamation");
|
exclamationSprite.setName("exclamation");
|
||||||
scene.field.add(exclamationSprite);
|
scene.field.add(exclamationSprite);
|
||||||
scene.field.moveTo(exclamationSprite, scene.field.getAll().length - 1);
|
scene.field.moveTo(exclamationSprite, scene.field.getAll().length - 1);
|
||||||
@ -744,6 +744,37 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to {@linkcode handleMysteryEncounterVictory}, but for cases where the player lost a battle or failed a challenge
|
||||||
|
* @param scene
|
||||||
|
* @param addHealPhase
|
||||||
|
*/
|
||||||
|
export function handleMysteryEncounterBattleFailed(scene: BattleScene, addHealPhase: boolean = false, doNotContinue: boolean = false) {
|
||||||
|
const allowedPkm = scene.getParty().filter((pkm) => pkm.isAllowedInBattle());
|
||||||
|
|
||||||
|
if (allowedPkm.length === 0) {
|
||||||
|
scene.clearPhaseQueue();
|
||||||
|
scene.unshiftPhase(new GameOverPhase(scene));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If in repeated encounter variant, do nothing
|
||||||
|
// Variant must eventually be swapped in order to handle "true" end of the encounter
|
||||||
|
const encounter = scene.currentBattle.mysteryEncounter!;
|
||||||
|
if (encounter.continuousEncounter || doNotContinue) {
|
||||||
|
return;
|
||||||
|
} else if (encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE) {
|
||||||
|
scene.pushPhase(new BattleEndPhase(scene, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase));
|
||||||
|
|
||||||
|
if (!encounter.doContinueEncounter) {
|
||||||
|
// Only lapse eggs once for multi-battle encounters
|
||||||
|
scene.pushPhase(new EggLapsePhase(scene));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param scene
|
* @param scene
|
||||||
|
@ -13,7 +13,7 @@ import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler";
|
|||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { Type } from "#app/data/type";
|
import { Type } from "#app/data/type";
|
||||||
import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species";
|
import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species";
|
||||||
import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { getEncounterText, queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
||||||
import { Gender } from "#app/data/gender";
|
import { Gender } from "#app/data/gender";
|
||||||
@ -50,28 +50,39 @@ export function getSpriteKeysFromPokemon(pokemon: Pokemon): { spriteKey: string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* Will never remove the player's last non-fainted Pokemon (if they only have 1)
|
* Will never remove the player's last non-fainted Pokemon (if they only have 1)
|
||||||
* Otherwise, picks a Pokemon completely at random and removes from the party
|
* Otherwise, picks a Pokemon completely at random and removes from the party
|
||||||
* @param scene
|
* @param scene
|
||||||
* @param isAllowedInBattle Default false. If true, only picks from unfainted mons. If there is only 1 unfainted mon left and doNotReturnLastAbleMon is also true, will return fainted mon
|
* @param isAllowed Default false. If true, only picks from legal mons. If no legal mons are found (or there is 1, with `doNotReturnLastAllowedMon = true), will return a mon that is not allowed.
|
||||||
* @param doNotReturnLastAbleMon Default false. If true, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted)
|
* @param isFainted Default false. If true, includes fainted mons.
|
||||||
|
* @param doNotReturnLastAllowedMon Default false. If true, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted)
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: boolean = false, doNotReturnLastAbleMon: boolean = false): PlayerPokemon {
|
export function getRandomPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false, doNotReturnLastAllowedMon: boolean = false): PlayerPokemon {
|
||||||
const party = scene.getParty();
|
const party = scene.getParty();
|
||||||
let chosenIndex: number;
|
let chosenIndex: number;
|
||||||
let chosenPokemon: PlayerPokemon;
|
let chosenPokemon: PlayerPokemon | null = null;
|
||||||
const unfaintedMons = party.filter(p => p.isAllowedInBattle());
|
const fullyLegalMons = party.filter(p => (!isAllowed || p.isAllowed()) && (isFainted || !p.isFainted()));
|
||||||
const faintedMons = party.filter(p => !p.isAllowedInBattle());
|
const allowedOnlyMons = party.filter(p => p.isAllowed());
|
||||||
|
|
||||||
if (doNotReturnLastAbleMon && unfaintedMons.length === 1) {
|
if (doNotReturnLastAllowedMon && fullyLegalMons.length === 1) {
|
||||||
chosenIndex = randSeedInt(faintedMons.length);
|
// If there is only 1 legal/unfainted mon left, select from fainted legal mons
|
||||||
chosenPokemon = faintedMons[chosenIndex];
|
const faintedLegalMons = party.filter(p => (!isAllowed || p.isAllowed()) && p.isFainted());
|
||||||
} else if (isAllowedInBattle) {
|
if (faintedLegalMons.length > 0) {
|
||||||
chosenIndex = randSeedInt(unfaintedMons.length);
|
chosenIndex = randSeedInt(faintedLegalMons.length);
|
||||||
chosenPokemon = unfaintedMons[chosenIndex];
|
chosenPokemon = faintedLegalMons[chosenIndex];
|
||||||
} else {
|
}
|
||||||
|
}
|
||||||
|
if (!chosenPokemon && fullyLegalMons.length > 0) {
|
||||||
|
chosenIndex = randSeedInt(fullyLegalMons.length);
|
||||||
|
chosenPokemon = fullyLegalMons[chosenIndex];
|
||||||
|
}
|
||||||
|
if (!chosenPokemon && isAllowed && allowedOnlyMons.length > 0) {
|
||||||
|
chosenIndex = randSeedInt(allowedOnlyMons.length);
|
||||||
|
chosenPokemon = allowedOnlyMons[chosenIndex];
|
||||||
|
}
|
||||||
|
if (!chosenPokemon) {
|
||||||
|
// If no other options worked, returns fully random
|
||||||
chosenIndex = randSeedInt(party.length);
|
chosenIndex = randSeedInt(party.length);
|
||||||
chosenPokemon = party[chosenIndex];
|
chosenPokemon = party[chosenIndex];
|
||||||
}
|
}
|
||||||
@ -82,15 +93,19 @@ export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: bo
|
|||||||
/**
|
/**
|
||||||
* Ties are broken by whatever mon is closer to the front of the party
|
* Ties are broken by whatever mon is closer to the front of the party
|
||||||
* @param scene
|
* @param scene
|
||||||
* @param unfainted Default false. If true, only picks from unfainted mons.
|
* @param isAllowed Default false. If true, only picks from legal mons.
|
||||||
|
* @param isFainted Default false. If true, includes fainted mons.
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon {
|
export function getHighestLevelPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon {
|
||||||
const party = scene.getParty();
|
const party = scene.getParty();
|
||||||
let pokemon: PlayerPokemon | null = null;
|
let pokemon: PlayerPokemon | null = null;
|
||||||
|
|
||||||
for (const p of party) {
|
for (const p of party) {
|
||||||
if (unfainted && p.isFainted()) {
|
if (isAllowed && !p.isAllowed()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!isFainted && p.isFainted()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,15 +119,19 @@ export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: bool
|
|||||||
* Ties are broken by whatever mon is closer to the front of the party
|
* Ties are broken by whatever mon is closer to the front of the party
|
||||||
* @param scene
|
* @param scene
|
||||||
* @param stat Stat to search for
|
* @param stat Stat to search for
|
||||||
* @param unfainted Default false. If true, only picks from unfainted mons.
|
* @param isAllowed Default false. If true, only picks from legal mons.
|
||||||
|
* @param isFainted Default false. If true, includes fainted mons.
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export function getHighestStatPlayerPokemon(scene: BattleScene, stat: PermanentStat, unfainted: boolean = false): PlayerPokemon {
|
export function getHighestStatPlayerPokemon(scene: BattleScene, stat: PermanentStat, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon {
|
||||||
const party = scene.getParty();
|
const party = scene.getParty();
|
||||||
let pokemon: PlayerPokemon | null = null;
|
let pokemon: PlayerPokemon | null = null;
|
||||||
|
|
||||||
for (const p of party) {
|
for (const p of party) {
|
||||||
if (unfainted && p.isFainted()) {
|
if (isAllowed && !p.isAllowed()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!isFainted && p.isFainted()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,15 +144,19 @@ export function getHighestStatPlayerPokemon(scene: BattleScene, stat: PermanentS
|
|||||||
/**
|
/**
|
||||||
* Ties are broken by whatever mon is closer to the front of the party
|
* Ties are broken by whatever mon is closer to the front of the party
|
||||||
* @param scene
|
* @param scene
|
||||||
* @param unfainted - default false. If true, only picks from unfainted mons.
|
* @param isAllowed Default false. If true, only picks from legal mons.
|
||||||
|
* @param isFainted Default false. If true, includes fainted mons.
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon {
|
export function getLowestLevelPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon {
|
||||||
const party = scene.getParty();
|
const party = scene.getParty();
|
||||||
let pokemon: PlayerPokemon | null = null;
|
let pokemon: PlayerPokemon | null = null;
|
||||||
|
|
||||||
for (const p of party) {
|
for (const p of party) {
|
||||||
if (unfainted && p.isFainted()) {
|
if (isAllowed && !p.isAllowed()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!isFainted && p.isFainted()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,15 +169,19 @@ export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boole
|
|||||||
/**
|
/**
|
||||||
* Ties are broken by whatever mon is closer to the front of the party
|
* Ties are broken by whatever mon is closer to the front of the party
|
||||||
* @param scene
|
* @param scene
|
||||||
* @param unfainted - default false. If true, only picks from unfainted mons.
|
* @param isAllowed Default false. If true, only picks from legal mons.
|
||||||
|
* @param isFainted Default false. If true, includes fainted mons.
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export function getHighestStatTotalPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon {
|
export function getHighestStatTotalPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon {
|
||||||
const party = scene.getParty();
|
const party = scene.getParty();
|
||||||
let pokemon: PlayerPokemon | null = null;
|
let pokemon: PlayerPokemon | null = null;
|
||||||
|
|
||||||
for (const p of party) {
|
for (const p of party) {
|
||||||
if (unfainted && p.isFainted()) {
|
if (isAllowed && !p.isAllowed()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!isFainted && p.isFainted()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,15 +197,24 @@ export function getHighestStatTotalPlayerPokemon(scene: BattleScene, unfainted:
|
|||||||
* @param starterTiers
|
* @param starterTiers
|
||||||
* @param excludedSpecies
|
* @param excludedSpecies
|
||||||
* @param types
|
* @param types
|
||||||
|
* @param allowSubLegendary
|
||||||
|
* @param allowLegendary
|
||||||
|
* @param allowMythical
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[]): Species {
|
export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[], allowSubLegendary: boolean = true, allowLegendary: boolean = true, allowMythical: boolean = true): Species {
|
||||||
let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers;
|
let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers;
|
||||||
let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers;
|
let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers;
|
||||||
|
|
||||||
let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters)
|
let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters)
|
||||||
.map(s => [parseInt(s) as Species, speciesStarters[s] as number])
|
.map(s => [parseInt(s) as Species, speciesStarters[s] as number])
|
||||||
.filter(s => getPokemonSpecies(s[0]) && (!excludedSpecies || !excludedSpecies.includes(s[0])))
|
.filter(s => {
|
||||||
|
const pokemonSpecies = getPokemonSpecies(s[0]);
|
||||||
|
return pokemonSpecies && (!excludedSpecies || !excludedSpecies.includes(s[0])
|
||||||
|
&& (allowSubLegendary || !pokemonSpecies.subLegendary)
|
||||||
|
&& (allowLegendary || !pokemonSpecies.legendary)
|
||||||
|
&& (allowMythical || !pokemonSpecies.mythical));
|
||||||
|
})
|
||||||
.map(s => [getPokemonSpecies(s[0]), s[1]]);
|
.map(s => [getPokemonSpecies(s[0]), s[1]]);
|
||||||
|
|
||||||
if (types && types.length > 0) {
|
if (types && types.length > 0) {
|
||||||
@ -773,3 +809,23 @@ export async function addPokemonDataToDexAndValidateAchievements(scene: BattleSc
|
|||||||
scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs);
|
scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs);
|
||||||
return scene.gameData.setPokemonCaught(pokemon, true, false, false);
|
return scene.gameData.setPokemonCaught(pokemon, true, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a Pokemon is allowed under a challenge, and allowed in battle.
|
||||||
|
* If both are true, returns `null`.
|
||||||
|
* If one of them is not true, returns message content that the Pokemon is invalid.
|
||||||
|
* Typically used for cheecking whether a Pokemon can be selected for a {@linkcode MysteryEncounterOption}
|
||||||
|
* @param pokemon
|
||||||
|
* @param scene
|
||||||
|
* @param invalidSelectionKey
|
||||||
|
*/
|
||||||
|
export function isPokemonValidForEncounterOptionSelection(pokemon: Pokemon, scene: BattleScene, invalidSelectionKey: string): string | null {
|
||||||
|
if (!pokemon.isAllowed()) {
|
||||||
|
return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null;
|
||||||
|
}
|
||||||
|
if (!pokemon.isAllowedInBattle()) {
|
||||||
|
return getEncounterText(scene, invalidSelectionKey) ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
@ -597,7 +597,7 @@ export class TrainerConfig {
|
|||||||
case "flare": {
|
case "flare": {
|
||||||
return {
|
return {
|
||||||
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY],
|
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY],
|
||||||
[TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.BERGMITE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO],
|
[TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO],
|
||||||
[TrainerPoolTier.RARE]: [Species.NOIVERN, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO]
|
[TrainerPoolTier.RARE]: [Species.NOIVERN, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -640,14 +640,14 @@ export class TrainerConfig {
|
|||||||
return {
|
return {
|
||||||
[TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ],
|
[TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ],
|
||||||
[TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ],
|
[TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ],
|
||||||
[TrainerPoolTier.RARE]: [ Species.BULBASAUR, Species.GLIMMET ]
|
[TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "star_4": {
|
case "star_4": {
|
||||||
return {
|
return {
|
||||||
[TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ],
|
[TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ],
|
||||||
[TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ],
|
[TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ],
|
||||||
[TrainerPoolTier.RARE]: [ Species.POPPLIO, Species.GALAR_PONYTA ]
|
[TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "star_5": {
|
case "star_5": {
|
||||||
@ -1509,7 +1509,7 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
.setSpeciesPools({
|
.setSpeciesPools({
|
||||||
[TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH],
|
[TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH],
|
||||||
[TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA],
|
[TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA],
|
||||||
[TrainerPoolTier.RARE]: [Species.MANTINE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP],
|
[TrainerPoolTier.RARE]: [Species.MANTYKE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP],
|
||||||
[TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO, Species.BASCULEGION]
|
[TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO, Species.BASCULEGION]
|
||||||
}),
|
}),
|
||||||
[TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
[TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||||
@ -1527,8 +1527,8 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
[TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
[TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||||
.setSpeciesPools({
|
.setSpeciesPools({
|
||||||
[TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE],
|
[TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE],
|
||||||
[TrainerPoolTier.UNCOMMON]: [Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK],
|
[TrainerPoolTier.UNCOMMON]: [Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK, Species.CUBCHOO, Species.KLINK],
|
||||||
[TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.CUBCHOO, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT],
|
[TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT],
|
||||||
[TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO]
|
[TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO]
|
||||||
}),
|
}),
|
||||||
[TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
[TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||||
@ -1537,7 +1537,7 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
.setSpeciesPools({
|
.setSpeciesPools({
|
||||||
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR],
|
[TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR],
|
||||||
[TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP],
|
[TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP],
|
||||||
[TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.BERGMITE, Species.SLIGGOO],
|
[TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.SLIGGOO],
|
||||||
[TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG]
|
[TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG]
|
||||||
}),
|
}),
|
||||||
[TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
[TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||||
@ -1545,15 +1545,15 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
[TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
[TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||||
.setSpeciesPools({
|
.setSpeciesPools({
|
||||||
[TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU],
|
[TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU],
|
||||||
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK],
|
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK],
|
||||||
[TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.TURTONATOR, Species.DRAMPA],
|
[TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.TURTONATOR, Species.MIMIKYU, Species.MAGNEMITE, Species.DRAMPA],
|
||||||
[TrainerPoolTier.SUPER_RARE]: [Species.JANGMO_O, Species.PORYGON]
|
[TrainerPoolTier.SUPER_RARE]: [Species.JANGMO_O, Species.PORYGON]
|
||||||
}),
|
}),
|
||||||
[TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
[TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
|
||||||
[TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
[TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
|
||||||
.setSpeciesPools({
|
.setSpeciesPools({
|
||||||
[TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH],
|
[TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH, Species.DROWZEE],
|
||||||
[TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.DROWZEE, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY],
|
[TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY],
|
||||||
[TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE],
|
[TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE],
|
||||||
[TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER]
|
[TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER]
|
||||||
}),
|
}),
|
||||||
@ -1916,7 +1916,14 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
p.formIndex = 1; // Mega Kangaskhan
|
p.formIndex = 1; // Mega Kangaskhan
|
||||||
p.generateName();
|
p.generateName();
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GASTRODON, Species.SEISMITOAD]))
|
.setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GASTRODON, Species.SEISMITOAD], TrainerSlot.TRAINER, true, p => {
|
||||||
|
//Storm Drain Gastrodon, Water Absorb Seismitoad
|
||||||
|
if (p.species.speciesId === Species.GASTRODON) {
|
||||||
|
p.abilityIndex = 0;
|
||||||
|
} else if (p.species.speciesId === Species.SEISMITOAD) {
|
||||||
|
p.abilityIndex = 2;
|
||||||
|
}
|
||||||
|
}))
|
||||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.MEWTWO], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.MEWTWO], TrainerSlot.TRAINER, true, p => {
|
||||||
p.setBoss(true, 2);
|
p.setBoss(true, 2);
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
@ -2153,9 +2160,23 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
p.pokeball = PokeballType.MASTER_BALL;
|
p.pokeball = PokeballType.MASTER_BALL;
|
||||||
})),
|
})),
|
||||||
[TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
|
[TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LOKIX, Species.YANMEGA ]))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LOKIX, Species.YANMEGA ], TrainerSlot.TRAINER, true, p => {
|
||||||
|
//Tinted Lens Lokix, Tinted Lens Yanmega
|
||||||
|
if (p.species.speciesId === Species.LOKIX) {
|
||||||
|
p.abilityIndex = 2;
|
||||||
|
} else if (p.species.speciesId === Species.YANMEGA) {
|
||||||
|
p.abilityIndex = 1;
|
||||||
|
}
|
||||||
|
}))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ]))
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ]))
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ], TrainerSlot.TRAINER, true, p => {
|
||||||
|
//Technician Scizor, Sharpness Kleavor
|
||||||
|
if (p.species.speciesId === Species.SCIZOR) {
|
||||||
|
p.abilityIndex = 1;
|
||||||
|
} else if (p.species.speciesId === Species.KLEAVOR) {
|
||||||
|
p.abilityIndex = 2;
|
||||||
|
}
|
||||||
|
}))
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT]))
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT]))
|
||||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
@ -2175,25 +2196,32 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
p.abilityIndex = 2; //Anticipation
|
p.abilityIndex = 2; //Anticipation
|
||||||
p.pokeball = PokeballType.ULTRA_BALL;
|
p.pokeball = PokeballType.ULTRA_BALL;
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_SAMUROTT, Species.CRAWDAUNT ], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ], TrainerSlot.TRAINER, true, p => {
|
||||||
|
//Technician Scizor, Sharpness Kleavor
|
||||||
|
if (p.species.speciesId === Species.SCIZOR) {
|
||||||
|
p.abilityIndex = 1;
|
||||||
|
} else if (p.species.speciesId === Species.KLEAVOR) {
|
||||||
|
p.abilityIndex = 2;
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HISUI_SAMUROTT, Species.CRAWDAUNT ], TrainerSlot.TRAINER, true, p => {
|
||||||
p.abilityIndex = 2; //Sharpness Hisui Samurott, Adaptability Crawdaunt
|
p.abilityIndex = 2; //Sharpness Hisui Samurott, Adaptability Crawdaunt
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => {
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
|
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
|
p.pokeball = PokeballType.ROGUE_BALL;
|
||||||
|
}))
|
||||||
|
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => {
|
||||||
|
p.setBoss(true, 2);
|
||||||
|
p.generateAndPopulateMoveset();
|
||||||
|
p.pokeball = PokeballType.ROGUE_BALL;
|
||||||
|
}))
|
||||||
|
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
|
||||||
|
p.setBoss(true, 2);
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
p.pokeball = PokeballType.ULTRA_BALL;
|
p.pokeball = PokeballType.ULTRA_BALL;
|
||||||
}))
|
|
||||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => {
|
|
||||||
p.setBoss(true, 2);
|
|
||||||
p.generateAndPopulateMoveset();
|
|
||||||
p.pokeball = PokeballType.ROGUE_BALL;
|
|
||||||
}))
|
|
||||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => {
|
|
||||||
p.setBoss(true, 2);
|
|
||||||
p.generateAndPopulateMoveset();
|
|
||||||
p.pokeball = PokeballType.ROGUE_BALL;
|
|
||||||
})),
|
})),
|
||||||
[TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
|
[TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ]))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ]))
|
||||||
@ -2209,17 +2237,16 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
p.pokeball = PokeballType.ULTRA_BALL;
|
p.pokeball = PokeballType.ULTRA_BALL;
|
||||||
})),
|
})),
|
||||||
[TrainerType.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
|
[TrainerType.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MELMETAL ], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
|
||||||
p.setBoss(true, 2);
|
p.setBoss(true, 2);
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.pokeball = PokeballType.ULTRA_BALL;
|
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ]))
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ]))
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOVISH, Species.DRACOZOLT ], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOVISH, Species.DRACOZOLT ], TrainerSlot.TRAINER, true, p => {
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.abilityIndex = 1; //Strong Jaw Dracovish, Hustle Dracozolt
|
p.abilityIndex = 1; //Strong Jaw Dracovish, Hustle Dracozolt
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.ARCHALUDON ]))
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ]))
|
||||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => {
|
||||||
p.setBoss(true, 2);
|
p.setBoss(true, 2);
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
@ -2261,8 +2288,8 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
[TrainerType.PENNY_2]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", [], true).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma")
|
[TrainerType.PENNY_2]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", [], true).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma")
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => {
|
||||||
p.setBoss(true, 2);
|
p.setBoss(true, 2);
|
||||||
p.generateAndPopulateMoveset();
|
|
||||||
p.formIndex = Utils.randSeedInt(5, 1); //Random Starmobile form
|
p.formIndex = Utils.randSeedInt(5, 1); //Random Starmobile form
|
||||||
|
p.generateAndPopulateMoveset();
|
||||||
p.pokeball = PokeballType.ULTRA_BALL;
|
p.pokeball = PokeballType.ULTRA_BALL;
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ENTEI, Species.RAIKOU, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ENTEI, Species.RAIKOU, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => {
|
||||||
|
@ -80,4 +80,5 @@ export enum BattlerTagType {
|
|||||||
BURNED_UP = "BURNED_UP",
|
BURNED_UP = "BURNED_UP",
|
||||||
DOUBLE_SHOCKED = "DOUBLE_SHOCKED",
|
DOUBLE_SHOCKED = "DOUBLE_SHOCKED",
|
||||||
MYSTERY_ENCOUNTER_POST_SUMMON = "MYSTERY_ENCOUNTER_POST_SUMMON",
|
MYSTERY_ENCOUNTER_POST_SUMMON = "MYSTERY_ENCOUNTER_POST_SUMMON",
|
||||||
|
HEAL_BLOCK = "HEAL_BLOCK",
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ export class Arena {
|
|||||||
public tags: ArenaTag[];
|
public tags: ArenaTag[];
|
||||||
public bgm: string;
|
public bgm: string;
|
||||||
public ignoreAbilities: boolean;
|
public ignoreAbilities: boolean;
|
||||||
|
public ignoringEffectSource: BattlerIndex | null;
|
||||||
|
|
||||||
private lastTimeOfDay: TimeOfDay;
|
private lastTimeOfDay: TimeOfDay;
|
||||||
|
|
||||||
@ -569,8 +570,9 @@ export class Arena {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setIgnoreAbilities(ignoreAbilities: boolean = true): void {
|
setIgnoreAbilities(ignoreAbilities: boolean, ignoringEffectSource: BattlerIndex | null = null): void {
|
||||||
this.ignoreAbilities = ignoreAbilities;
|
this.ignoreAbilities = ignoreAbilities;
|
||||||
|
this.ignoringEffectSource = ignoreAbilities ? ignoringEffectSource : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,7 +20,7 @@ import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
|
|||||||
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag } from "../data/battler-tags";
|
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag } from "../data/battler-tags";
|
||||||
import { WeatherType } from "../data/weather";
|
import { WeatherType } from "../data/weather";
|
||||||
import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag";
|
import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag";
|
||||||
import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr } from "../data/ability";
|
import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs } from "../data/ability";
|
||||||
import PokemonData from "../system/pokemon-data";
|
import PokemonData from "../system/pokemon-data";
|
||||||
import { BattlerIndex } from "../battle";
|
import { BattlerIndex } from "../battle";
|
||||||
import { Mode } from "../ui/ui";
|
import { Mode } from "../ui/ui";
|
||||||
@ -109,6 +109,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
public fusionVariant: Variant;
|
public fusionVariant: Variant;
|
||||||
public fusionGender: Gender;
|
public fusionGender: Gender;
|
||||||
public fusionLuck: integer;
|
public fusionLuck: integer;
|
||||||
|
public fusionMysteryEncounterPokemonData: MysteryEncounterPokemonData | null;
|
||||||
|
|
||||||
private summonDataPrimer: PokemonSummonData | null;
|
private summonDataPrimer: PokemonSummonData | null;
|
||||||
|
|
||||||
@ -206,6 +207,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
this.fusionVariant = dataSource.fusionVariant || 0;
|
this.fusionVariant = dataSource.fusionVariant || 0;
|
||||||
this.fusionGender = dataSource.fusionGender;
|
this.fusionGender = dataSource.fusionGender;
|
||||||
this.fusionLuck = dataSource.fusionLuck;
|
this.fusionLuck = dataSource.fusionLuck;
|
||||||
|
this.fusionMysteryEncounterPokemonData = dataSource.fusionMysteryEncounterPokemonData;
|
||||||
this.usedTMs = dataSource.usedTMs ?? [];
|
this.usedTMs = dataSource.usedTMs ?? [];
|
||||||
this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(dataSource.mysteryEncounterPokemonData);
|
this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(dataSource.mysteryEncounterPokemonData);
|
||||||
} else {
|
} else {
|
||||||
@ -343,7 +345,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
isAllowed(): boolean {
|
isAllowed(): boolean {
|
||||||
const challengeAllowed = new Utils.BooleanHolder(true);
|
const challengeAllowed = new Utils.BooleanHolder(true);
|
||||||
applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed);
|
applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed);
|
||||||
return !this.isFainted() && challengeAllowed.value;
|
return challengeAllowed.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
isActive(onField?: boolean): boolean {
|
isActive(onField?: boolean): boolean {
|
||||||
@ -1164,11 +1166,31 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!types.length || !includeTeraType) {
|
if (!types.length || !includeTeraType) {
|
||||||
if (this.mysteryEncounterPokemonData.types && this.mysteryEncounterPokemonData.types.length > 0) {
|
if (!ignoreOverride && this.summonData?.types && this.summonData.types.length > 0) {
|
||||||
// "Permanent" override for a Pokemon's normal types, currently only used by Mystery Encounters
|
|
||||||
this.mysteryEncounterPokemonData.types.forEach(t => types.push(t));
|
|
||||||
} else if (!ignoreOverride && this.summonData?.types && this.summonData.types.length > 0) {
|
|
||||||
this.summonData.types.forEach(t => types.push(t));
|
this.summonData.types.forEach(t => types.push(t));
|
||||||
|
} else if (this.mysteryEncounterPokemonData.types && this.mysteryEncounterPokemonData.types.length > 0) {
|
||||||
|
// "Permanent" override for a Pokemon's normal types, currently only used by Mystery Encounters
|
||||||
|
types.push(this.mysteryEncounterPokemonData.types[0]);
|
||||||
|
|
||||||
|
// Fusing a Pokemon onto something with "permanently changed" types will still apply the fusion's types as normal
|
||||||
|
const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride);
|
||||||
|
if (fusionSpeciesForm) {
|
||||||
|
// Check if the fusion Pokemon also had "permanently changed" types
|
||||||
|
const fusionMETypes = this.fusionMysteryEncounterPokemonData?.types;
|
||||||
|
if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) {
|
||||||
|
types.push(fusionMETypes[1]);
|
||||||
|
} else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) {
|
||||||
|
types.push(fusionMETypes[0]);
|
||||||
|
} else if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== types[0]) {
|
||||||
|
types.push(fusionSpeciesForm.type2);
|
||||||
|
} else if (fusionSpeciesForm.type1 !== types[0]) {
|
||||||
|
types.push(fusionSpeciesForm.type1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (types.length === 1 && this.mysteryEncounterPokemonData.types.length >= 2) {
|
||||||
|
types.push(this.mysteryEncounterPokemonData.types[1]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const speciesForm = this.getSpeciesForm(ignoreOverride);
|
const speciesForm = this.getSpeciesForm(ignoreOverride);
|
||||||
|
|
||||||
@ -1176,7 +1198,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
|
|
||||||
const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride);
|
const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride);
|
||||||
if (fusionSpeciesForm) {
|
if (fusionSpeciesForm) {
|
||||||
if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== speciesForm.type1) {
|
// Check if the fusion Pokemon also had "permanently changed" types
|
||||||
|
// Otherwise, use standard fusion type logic
|
||||||
|
const fusionMETypes = this.fusionMysteryEncounterPokemonData?.types;
|
||||||
|
if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) {
|
||||||
|
types.push(fusionMETypes[1]);
|
||||||
|
} else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) {
|
||||||
|
types.push(fusionMETypes[0]);
|
||||||
|
} else if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== speciesForm.type1) {
|
||||||
types.push(fusionSpeciesForm.type2);
|
types.push(fusionSpeciesForm.type2);
|
||||||
} else if (fusionSpeciesForm.type1 !== speciesForm.type1) {
|
} else if (fusionSpeciesForm.type1 !== speciesForm.type1) {
|
||||||
types.push(fusionSpeciesForm.type1);
|
types.push(fusionSpeciesForm.type1);
|
||||||
@ -1228,12 +1257,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (Overrides.OPP_ABILITY_OVERRIDE && !this.isPlayer()) {
|
if (Overrides.OPP_ABILITY_OVERRIDE && !this.isPlayer()) {
|
||||||
return allAbilities[Overrides.OPP_ABILITY_OVERRIDE];
|
return allAbilities[Overrides.OPP_ABILITY_OVERRIDE];
|
||||||
}
|
}
|
||||||
|
if (this.isFusion()) {
|
||||||
|
if (!isNullOrUndefined(this.fusionMysteryEncounterPokemonData?.ability) && this.fusionMysteryEncounterPokemonData!.ability !== -1) {
|
||||||
|
return allAbilities[this.fusionMysteryEncounterPokemonData!.ability];
|
||||||
|
} else {
|
||||||
|
return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)];
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!isNullOrUndefined(this.mysteryEncounterPokemonData.ability) && this.mysteryEncounterPokemonData.ability !== -1) {
|
if (!isNullOrUndefined(this.mysteryEncounterPokemonData.ability) && this.mysteryEncounterPokemonData.ability !== -1) {
|
||||||
return allAbilities[this.mysteryEncounterPokemonData.ability];
|
return allAbilities[this.mysteryEncounterPokemonData.ability];
|
||||||
}
|
}
|
||||||
if (this.isFusion()) {
|
|
||||||
return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)];
|
|
||||||
}
|
|
||||||
let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex);
|
let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex);
|
||||||
if (abilityId === Abilities.NONE) {
|
if (abilityId === Abilities.NONE) {
|
||||||
abilityId = this.species.ability1;
|
abilityId = this.species.ability1;
|
||||||
@ -1331,7 +1364,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (this.isFusion() && ability.hasAttr(NoFusionAbilityAbAttr)) {
|
if (this.isFusion() && ability.hasAttr(NoFusionAbilityAbAttr)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (this.scene?.arena.ignoreAbilities && ability.isIgnorable) {
|
const arena = this.scene?.arena;
|
||||||
|
if (arena.ignoreAbilities && arena.ignoringEffectSource !== this.getBattlerIndex() && ability.isIgnorable) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) {
|
if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) {
|
||||||
@ -1927,6 +1961,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
this.fusionVariant = 0;
|
this.fusionVariant = 0;
|
||||||
this.fusionGender = 0;
|
this.fusionGender = 0;
|
||||||
this.fusionLuck = 0;
|
this.fusionLuck = 0;
|
||||||
|
this.fusionMysteryEncounterPokemonData = null;
|
||||||
|
|
||||||
this.generateName();
|
this.generateName();
|
||||||
this.calculateStats();
|
this.calculateStats();
|
||||||
@ -2971,16 +3006,40 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
return this.getRestrictingTag(moveId) !== null;
|
return this.getRestrictingTag(moveId) !== null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets whether the given move is currently disabled for the user based on the player's target selection
|
||||||
|
*
|
||||||
|
* @param {Moves} moveId {@linkcode Moves} ID of the move to check
|
||||||
|
* @param {Pokemon} user {@linkcode Pokemon} the move user
|
||||||
|
* @param {Pokemon} target {@linkcode Pokemon} the target of the move
|
||||||
|
*
|
||||||
|
* @returns {boolean} `true` if the move is disabled for this Pokemon due to the player's target selection
|
||||||
|
*
|
||||||
|
* @see {@linkcode MoveRestrictionBattlerTag}
|
||||||
|
*/
|
||||||
|
isMoveTargetRestricted(moveId: Moves, user: Pokemon, target: Pokemon): boolean {
|
||||||
|
for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) {
|
||||||
|
if ((tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) {
|
||||||
|
return (tag as MoveRestrictionBattlerTag !== null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the {@link MoveRestrictionBattlerTag} that is restricting a move, if it exists.
|
* Gets the {@link MoveRestrictionBattlerTag} that is restricting a move, if it exists.
|
||||||
*
|
*
|
||||||
* @param {Moves} moveId {@linkcode Moves} ID of the move to check
|
* @param {Moves} moveId {@linkcode Moves} ID of the move to check
|
||||||
|
* @param {Pokemon} user {@linkcode Pokemon} the move user, optional and used when the target is a factor in the move's restricted status
|
||||||
|
* @param {Pokemon} target {@linkcode Pokemon} the target of the move, optional and used when the target is a factor in the move's restricted status
|
||||||
* @returns {MoveRestrictionBattlerTag | null} the first tag on this Pokemon that restricts the move, or `null` if the move is not restricted.
|
* @returns {MoveRestrictionBattlerTag | null} the first tag on this Pokemon that restricts the move, or `null` if the move is not restricted.
|
||||||
*/
|
*/
|
||||||
getRestrictingTag(moveId: Moves): MoveRestrictionBattlerTag | null {
|
getRestrictingTag(moveId: Moves, user?: Pokemon, target?: Pokemon): MoveRestrictionBattlerTag | null {
|
||||||
for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) {
|
for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) {
|
||||||
if ((tag as MoveRestrictionBattlerTag).isMoveRestricted(moveId)) {
|
if ((tag as MoveRestrictionBattlerTag).isMoveRestricted(moveId)) {
|
||||||
return tag as MoveRestrictionBattlerTag;
|
return tag as MoveRestrictionBattlerTag;
|
||||||
|
} else if (user && target && (tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) {
|
||||||
|
return tag as MoveRestrictionBattlerTag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -3307,7 +3366,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (asPhase) {
|
if (asPhase) {
|
||||||
this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText!, sourcePokemon!)); // TODO: are these bangs correct?
|
this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3341,6 +3400,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
|
|
||||||
if (effect !== StatusEffect.FAINT) {
|
if (effect !== StatusEffect.FAINT) {
|
||||||
this.scene.triggerPokemonFormChange(this, SpeciesFormChangeStatusEffectTrigger, true);
|
this.scene.triggerPokemonFormChange(this, SpeciesFormChangeStatusEffectTrigger, true);
|
||||||
|
applyPostSetStatusAbAttrs(PostSetStatusAbAttr, this, effect, sourcePokemon);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -4207,6 +4267,7 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
this.fusionVariant = pokemon.variant;
|
this.fusionVariant = pokemon.variant;
|
||||||
this.fusionGender = pokemon.gender;
|
this.fusionGender = pokemon.gender;
|
||||||
this.fusionLuck = pokemon.luck;
|
this.fusionLuck = pokemon.luck;
|
||||||
|
this.fusionMysteryEncounterPokemonData = pokemon.mysteryEncounterPokemonData;
|
||||||
if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) {
|
if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) {
|
||||||
this.pauseEvolutions = true;
|
this.pauseEvolutions = true;
|
||||||
}
|
}
|
||||||
|
@ -425,14 +425,32 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retry && (attempt || 0) < 10) {
|
// Prompts reroll of party member species if species already present in the enemy party
|
||||||
|
if (this.checkDuplicateSpecies(ret)) {
|
||||||
|
console.log("Duplicate species detected, prompting reroll...");
|
||||||
|
retry = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retry && (attempt ?? 0) < 10) {
|
||||||
console.log("Rerolling party member...");
|
console.log("Rerolling party member...");
|
||||||
ret = this.genNewPartyMemberSpecies(level, strength, (attempt || 0) + 1);
|
ret = this.genNewPartyMemberSpecies(level, strength, (attempt ?? 0) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the enemy trainer already has the Pokemon species in their party
|
||||||
|
* @param {PokemonSpecies} species {@linkcode PokemonSpecies}
|
||||||
|
* @returns `true` if the species is already present in the party
|
||||||
|
*/
|
||||||
|
checkDuplicateSpecies(species: PokemonSpecies): boolean {
|
||||||
|
const currentPartySpecies = this.scene.getEnemyParty().map(p => {
|
||||||
|
return p.species.speciesId;
|
||||||
|
});
|
||||||
|
return currentPartySpecies.includes(species.speciesId);
|
||||||
|
}
|
||||||
|
|
||||||
getPartyMemberMatchupScores(trainerSlot: TrainerSlot = TrainerSlot.NONE, forSwitch: boolean = false): [integer, integer][] {
|
getPartyMemberMatchupScores(trainerSlot: TrainerSlot = TrainerSlot.NONE, forSwitch: boolean = false): [integer, integer][] {
|
||||||
if (trainerSlot && !this.isDouble()) {
|
if (trainerSlot && !this.isDouble()) {
|
||||||
trainerSlot = TrainerSlot.NONE;
|
trainerSlot = TrainerSlot.NONE;
|
||||||
|
@ -1237,6 +1237,6 @@
|
|||||||
},
|
},
|
||||||
"poisonPuppeteer": {
|
"poisonPuppeteer": {
|
||||||
"name": "Giftpuppenspiel",
|
"name": "Giftpuppenspiel",
|
||||||
"description": "Wenn Infamomo ein Ziel mit einer Attacke vergiftet, so wird dieses auch verwirrt."
|
"description": "Wenn das Pokémon ein Ziel mit einer Attacke vergiftet, so wird dieses auch verwirrt."
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -96,5 +96,7 @@
|
|||||||
"unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.",
|
"unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.",
|
||||||
"congratulations": "Glückwunsch!",
|
"congratulations": "Glückwunsch!",
|
||||||
"beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!",
|
"beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!",
|
||||||
"eggSkipPrompt": "Zur Ei-Zusammenfassung springen?"
|
"eggSkipPrompt": "Zur Ei-Zusammenfassung springen?",
|
||||||
|
"battlerTagsHealBlock": "{{pokemonNameWithAffix}} kann nicht geheilt werden, da die Heilung blockiert wird!",
|
||||||
|
"battlerTagsHealBlockOnRemove": "{{pokemonNameWithAffix}} kann wieder geheilt werden!"
|
||||||
}
|
}
|
||||||
|
@ -83,9 +83,11 @@
|
|||||||
"battle_aether_grunt": "SM Vs. Æther Foundation",
|
"battle_aether_grunt": "SM Vs. Æther Foundation",
|
||||||
"battle_skull_grunt": "SM Vs. Team Skull Rüpel",
|
"battle_skull_grunt": "SM Vs. Team Skull Rüpel",
|
||||||
"battle_macro_grunt": "SWSH Vs. Trainer",
|
"battle_macro_grunt": "SWSH Vs. Trainer",
|
||||||
|
"battle_star_grunt": "KAPU Vs. Team Star",
|
||||||
"battle_galactic_admin": "BDSP Vs. Team Galactic Commander",
|
"battle_galactic_admin": "BDSP Vs. Team Galactic Commander",
|
||||||
"battle_skull_admin": "SM Vs. Team Skull Vorstand",
|
"battle_skull_admin": "SM Vs. Team Skull Vorstand",
|
||||||
"battle_oleana": "SWSH Vs. Oleana",
|
"battle_oleana": "SWSH Vs. Olivia",
|
||||||
|
"battle_star_admin": "KAPU Vs. Team Star Boss",
|
||||||
"battle_rocket_boss": "USUM Vs. Giovanni",
|
"battle_rocket_boss": "USUM Vs. Giovanni",
|
||||||
"battle_aqua_magma_boss": "ORAS Vs. Team Aqua & Magma Boss",
|
"battle_aqua_magma_boss": "ORAS Vs. Team Aqua & Magma Boss",
|
||||||
"battle_galactic_boss": "BDSP Vs. Zyrus",
|
"battle_galactic_boss": "BDSP Vs. Zyrus",
|
||||||
@ -94,6 +96,7 @@
|
|||||||
"battle_aether_boss": "SM Vs. Samantha",
|
"battle_aether_boss": "SM Vs. Samantha",
|
||||||
"battle_skull_boss": "SM Vs. Bromley",
|
"battle_skull_boss": "SM Vs. Bromley",
|
||||||
"battle_macro_boss": "SWSH Vs. Rose",
|
"battle_macro_boss": "SWSH Vs. Rose",
|
||||||
|
"battle_star_boss": "KAPU Vs. Cosima",
|
||||||
|
|
||||||
"abyss": "PMD Erkundungsteam Himmel Dunkelkrater",
|
"abyss": "PMD Erkundungsteam Himmel Dunkelkrater",
|
||||||
"badlands": "PMD Erkundungsteam Himmel Kargtal",
|
"badlands": "PMD Erkundungsteam Himmel Kargtal",
|
||||||
@ -108,17 +111,17 @@
|
|||||||
"forest": "PMD Erkundungsteam Himmel Düsterwald",
|
"forest": "PMD Erkundungsteam Himmel Düsterwald",
|
||||||
"grass": "PMD Erkundungsteam Himmel Apfelwald",
|
"grass": "PMD Erkundungsteam Himmel Apfelwald",
|
||||||
"graveyard": "PMD Erkundungsteam Himmel Verwirrwald",
|
"graveyard": "PMD Erkundungsteam Himmel Verwirrwald",
|
||||||
"ice_cave": "PMD Erkundungsteam Himmel Rieseneisberg",
|
"ice_cave": "Firel - -50°C",
|
||||||
"island": "PMD Erkundungsteam Himmel Schroffküste",
|
"island": "PMD Erkundungsteam Himmel Schroffküste",
|
||||||
"jungle": "Lmz - Jungle",
|
"jungle": "Lmz - Jungle",
|
||||||
"laboratory": "Firel - Laboratory",
|
"laboratory": "Firel - Laboratory",
|
||||||
"lake": "PMD Erkundungsteam Himmel Kristallhöhle",
|
"lake": "Lmz - Lake",
|
||||||
"meadow": "PMD Erkundungsteam Himmel Himmelsgipfel-Wald",
|
"meadow": "PMD Erkundungsteam Himmel Himmelsgipfel-Wald",
|
||||||
"metropolis": "Firel - Metropolis",
|
"metropolis": "Firel - Metropolis",
|
||||||
"mountain": "PMD Erkundungsteam Himmel Hornberg",
|
"mountain": "PMD Erkundungsteam Himmel Hornberg",
|
||||||
"plains": "PMD Erkundungsteam Himmel Himmelsgipfel-Prärie",
|
"plains": "Firel - Route 888",
|
||||||
"power_plant": "PMD Erkundungsteam Himmel Weite Ampere-Ebene",
|
"power_plant": "Firel - The Klink",
|
||||||
"ruins": "PMD Erkundungsteam Himmel Tiefes Ruinenverlies",
|
"ruins": "Lmz - Ancient Ruins",
|
||||||
"sea": "Andr06 - Marine Mystique",
|
"sea": "Andr06 - Marine Mystique",
|
||||||
"seabed": "Firel - Seabed",
|
"seabed": "Firel - Seabed",
|
||||||
"slum": "Andr06 - Sneaky Snom",
|
"slum": "Andr06 - Sneaky Snom",
|
||||||
@ -128,7 +131,7 @@
|
|||||||
"tall_grass": "PMD Erkundungsteam Himmel Nebelwald",
|
"tall_grass": "PMD Erkundungsteam Himmel Nebelwald",
|
||||||
"temple": "PMD Erkundungsteam Himmel Ägishöhle",
|
"temple": "PMD Erkundungsteam Himmel Ägishöhle",
|
||||||
"town": "PMD Erkundungsteam Himmel Zufälliges Dungeon-Theme 3",
|
"town": "PMD Erkundungsteam Himmel Zufälliges Dungeon-Theme 3",
|
||||||
"volcano": "PMD Erkundungsteam Himmel Dunsthöhle",
|
"volcano": "Firel - Twisturn Volcano",
|
||||||
"wasteland": "PMD Erkundungsteam Himmel Verborgenes Hochland",
|
"wasteland": "PMD Erkundungsteam Himmel Verborgenes Hochland",
|
||||||
"encounter_ace_trainer": "SW Trainerblicke treffen sich (Ass-Trainer)",
|
"encounter_ace_trainer": "SW Trainerblicke treffen sich (Ass-Trainer)",
|
||||||
"encounter_backpacker": "SW Trainerblicke treffen sich (Backpacker)",
|
"encounter_backpacker": "SW Trainerblicke treffen sich (Backpacker)",
|
||||||
|
@ -715,12 +715,16 @@
|
|||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Achtung hier ist Endstation für dich!",
|
"1": "Achtung hier ist Endstation für dich!",
|
||||||
"2": "Du bist ein Trainer, oder? Wir von MC Wertpapiere wissen so etwas.\n$Ich fürchte, das gibt dir trotzdem nicht das Recht, sich in unsere Arbeit einzumischen.",
|
"2": "Du bist ein Trainer, oder? Wir von MC Wertpapiere wissen so etwas.\n$Ich fürchte, das gibt dir trotzdem nicht das Recht, sich in unsere Arbeit einzumischen.",
|
||||||
"3": "Ich bin von MC Versicherungen! Hast du eine Lebensversicherung?"
|
"3": "Ich bin von MC Versicherungen! Hast du eine Lebensversicherung?",
|
||||||
|
"4": "Ich habe dich gefunden! Das bedeutet es ist Zeit für einen Pokémon-Kampf!",
|
||||||
|
"5": "Eine Standpauke von Frau Olivia ist schlimmer als alles, was Sie tun können!"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Ich habe keine andere Wahl, als respektvoll zurückzutreten.",
|
"1": "Ich habe keine andere Wahl, als respektvoll zurückzutreten.",
|
||||||
"2": "Mein Erspartes aufzugeben bringt mich in die roten Zahlen...",
|
"2": "Mein Erspartes aufzugeben bringt mich in die roten Zahlen...",
|
||||||
"3": "Okay zurück an die Arbeit. Versicherungen verkauft sich nicht von alleine."
|
"3": "Okay zurück an die Arbeit. Versicherungen verkauft sich nicht von alleine.",
|
||||||
|
"4": "Ich habe sogar meine Pokémon ausgetauscht...",
|
||||||
|
"5": "Kämpfen hat nicht funktioniert... Jetzt können wir nur noch rennen!"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"oleana": {
|
"oleana": {
|
||||||
@ -735,6 +739,73 @@
|
|||||||
"3": "Ich bin eine müde Olivia... Ob es Macro Cosmos Betten gibt?"
|
"3": "Ich bin eine müde Olivia... Ob es Macro Cosmos Betten gibt?"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"star_grunt": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "Wir sind von Team Star, wo jeder nach den Sternen greifen kann!",
|
||||||
|
"2": "Wir werden mit voller Kraft auf dich losgehen - Hasta la vistar! ★",
|
||||||
|
"3": "Könntest du bitte wieder abzischen? Sonst muss ich dich davonjagen. Aus reinem Selbstschutz!",
|
||||||
|
"4": "Es tut mir furchtbar leid, aber wenn du nicht umkehrst, könnte es ungemütlich für dich werden.",
|
||||||
|
"4_female": "Es tut mir furchtbar leid, aber wenn du nicht umkehrst, könnte es ungemütlich für dich werden.",
|
||||||
|
"5": "Och nee, nicht noch so ein Clown..."
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": "Jetzt bin ich die Person, die Sterne sieht...",
|
||||||
|
"2": "Jemand wie du wäre bei Team Star wahrscheinlich im Nullkommanichts an der Spitze.$Alle hätten Angst vor dir. Trotzdem...",
|
||||||
|
"3": "Da war meine Selbstverteidigung wohl nicht gut genug...",
|
||||||
|
"4": "H-hasta la vistar... ★",
|
||||||
|
"5": "Als neues Mitglied bei Team Star bekommt man echt nur die Drecksarbeit ab..."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"giacomo": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "Du willst dich echt mit Team Star anlegen? Bist du lebensmüde, oder was?",
|
||||||
|
"2": "Weil ich so nett bin, leg ich zu deinem Abgang auch ein fettes Requiem auf!$Lass uns die Party in Schwung bringen"
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": " Besser hätte ich es auch nicht sagen können...",
|
||||||
|
"2": "Uff, da hab ich schon bessere Shows gegeben... Schade, aber verloren ist verloren."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mela": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "Du bist also diese Pfeife, die sich unbedingt mit uns anlegen will...$Dir werd ich zeigen, was mit Leuten passiert, die sich mit uns anlegen!",
|
||||||
|
"2": "Yeah, lassen wir’s krachen!"
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": "Uff, ich hab echt versagt... Das war’s dann wohl...",
|
||||||
|
"2": "Ich... brannte so sehr auf diesen Kampf. Doch jetzt ist meine Flamme erloschen..."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"atticus": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "hr habt Team Star Leid angetan, unverschämter Schurke! Mein Gift soll Euer Niedergang sein!",
|
||||||
|
"2": "Eure Bereitschaft zum Duell erfreut mich! Möge der Kampf ein ehrwürdiger sein!"
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": "Meine Gefährten... Vergebt mir...",
|
||||||
|
"2": "Ich habe eine klare Niederlage erlitten, bei der Groll und Bitterkeit fehl am Platz wären."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ortega": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "Wenn ich mit dir fertig bin, wirst du heulend nach Hause rennen!",
|
||||||
|
"2": "Ich werde gewinnen, also spar dir deinen überheblichen Auftritt!"
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": "Was?! Wie konnte ich nur verlieren? Warum? Warum nur?!",
|
||||||
|
"2": "Graaaah! Du bist viel zu stark, das ist so was von unfair!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"eri": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "Wer auch immer es auf Team Star abgesehen hat, wird zerschmettert!",
|
||||||
|
"2": "Ich kann genauso gut austeilen wie einstecken! Wer am Ende noch steht, gewinnt."
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": "Leute, es tut mir so leid...",
|
||||||
|
"2": "Ich habe alles gegeben... Ich bereue nichts..."
|
||||||
|
}
|
||||||
|
},
|
||||||
"rocket_boss_giovanni_1": {
|
"rocket_boss_giovanni_1": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!"
|
"1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!"
|
||||||
@ -933,6 +1004,28 @@
|
|||||||
"1": "Ich nehme an, es muss den Anschein haben, dass ich etwas Schreckliches tue.\n$Ich erwarte nicht, dass du es verstehst. Aber ich muss der Galar-Region grenzenlose Energie\n$bereitstellen, um ewigen Wohlstand zu gewährleisten."
|
"1": "Ich nehme an, es muss den Anschein haben, dass ich etwas Schreckliches tue.\n$Ich erwarte nicht, dass du es verstehst. Aber ich muss der Galar-Region grenzenlose Energie\n$bereitstellen, um ewigen Wohlstand zu gewährleisten."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"star_boss_penny_1": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "Ich bin Team Stars Big Boss. Mein Name ist Cassiopeia...$Die Gründerin von Team Star ist kampfbereit! Verneigt euch vor meiner unermesslichen Kraft!"
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": "... ... .."
|
||||||
|
},
|
||||||
|
"defeat": {
|
||||||
|
"1": "Heh..."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"star_boss_penny_2": {
|
||||||
|
"encounter": {
|
||||||
|
"1": "Ich werde mich in diesem Kampf nicht zurückhalten! Ich werde dem Kodex von Team Star treu bleiben!$Unsere Evoli-Power verwandelt euch in Sternenstaub!"
|
||||||
|
},
|
||||||
|
"victory": {
|
||||||
|
"1": "Es ist vorbei..."
|
||||||
|
},
|
||||||
|
"defeat": {
|
||||||
|
"1": "Du bist unfassbar stark. Kein Wunder, dass die anderen Bosse gegen dich verloren haben..."
|
||||||
|
}
|
||||||
|
},
|
||||||
"brock": {
|
"brock": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!",
|
"1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!",
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
"suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!",
|
"suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!",
|
||||||
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
|
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
|
||||||
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
|
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
|
||||||
|
"chillyReception": "{{pokemonName}} erzählt einen schlechten Witz, der nicht besonders gut ankommt...",
|
||||||
"exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!",
|
"exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!",
|
||||||
"safeguard": "{{targetName}} wird durch Bodyguard geschützt!",
|
"safeguard": "{{targetName}} wird durch Bodyguard geschützt!",
|
||||||
"afterYou": "{{targetName}} lässt sich auf Galanterie ein!"
|
"afterYou": "{{targetName}} lässt sich auf Galanterie ein!"
|
||||||
|
@ -3129,7 +3129,7 @@
|
|||||||
},
|
},
|
||||||
"auraWheel": {
|
"auraWheel": {
|
||||||
"name": "Aura-Rad",
|
"name": "Aura-Rad",
|
||||||
"effect": "Mithilfe der in den Backentaschen gespeicherten Energie greift der Anwender an und erhöht seine Initiative. Der Typ der Attacke hängt von Morpekos Form ab."
|
"effect": "Mithilfe der in den Backentaschen gespeicherten Energie greift der Anwender an und erhöht seine Initiative. Wenn dies von Morpeko verwendet wird hängt der Typ der Attacke von dessen Form ab."
|
||||||
},
|
},
|
||||||
"breakingSwipe": {
|
"breakingSwipe": {
|
||||||
"name": "Breitseite",
|
"name": "Breitseite",
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"pikachu": "Normal",
|
||||||
"pikachuCosplay": "Cosplay",
|
"pikachuCosplay": "Cosplay",
|
||||||
"pikachuCoolCosplay": "Rocker-Pikachu",
|
"pikachuCoolCosplay": "Rocker-Pikachu",
|
||||||
"pikachuBeautyCosplay": "Damen-Pikachu",
|
"pikachuBeautyCosplay": "Damen-Pikachu",
|
||||||
@ -6,7 +7,9 @@
|
|||||||
"pikachuSmartCosplay": "Professoren-Pikachu",
|
"pikachuSmartCosplay": "Professoren-Pikachu",
|
||||||
"pikachuToughCosplay": "Wrestler-Pikachu",
|
"pikachuToughCosplay": "Wrestler-Pikachu",
|
||||||
"pikachuPartner": "Partner-Pikachu",
|
"pikachuPartner": "Partner-Pikachu",
|
||||||
|
"eevee": "Normal",
|
||||||
"eeveePartner": "Partner-Evoli",
|
"eeveePartner": "Partner-Evoli",
|
||||||
|
"pichu": "Normal",
|
||||||
"pichuSpiky": "Strubbelohr-Pichu",
|
"pichuSpiky": "Strubbelohr-Pichu",
|
||||||
"unownA": "A",
|
"unownA": "A",
|
||||||
"unownB": "B",
|
"unownB": "B",
|
||||||
@ -36,36 +39,65 @@
|
|||||||
"unownZ": "Z",
|
"unownZ": "Z",
|
||||||
"unownExclamation": "!",
|
"unownExclamation": "!",
|
||||||
"unownQuestion": "?",
|
"unownQuestion": "?",
|
||||||
|
"castform": "Normalform",
|
||||||
"castformSunny": "Sonnenform",
|
"castformSunny": "Sonnenform",
|
||||||
"castformRainy": "Regenform",
|
"castformRainy": "Regenform",
|
||||||
"castformSnowy": "Schneeform",
|
"castformSnowy": "Schneeform",
|
||||||
"deoxysNormal": "Normalform",
|
"deoxysNormal": "Normalform",
|
||||||
|
"deoxysAttack": "Angriffsform",
|
||||||
|
"deoxysDefense": "Verteidigungsform",
|
||||||
|
"deoxysSpeed": "Initiativeform",
|
||||||
"burmyPlant": "Pflanzenumhang",
|
"burmyPlant": "Pflanzenumhang",
|
||||||
"burmySandy": "Sandumhang",
|
"burmySandy": "Sandumhang",
|
||||||
"burmyTrash": "Lumpenumhang",
|
"burmyTrash": "Lumpenumhang",
|
||||||
|
"cherubiOvercast": "Wolkenform",
|
||||||
|
"cherubiSunshine": "Sonnenform",
|
||||||
"shellosEast": "Östliches Meer",
|
"shellosEast": "Östliches Meer",
|
||||||
"shellosWest": "Westliches Meer",
|
"shellosWest": "Westliches Meer",
|
||||||
|
"rotom": "Normalform",
|
||||||
"rotomHeat": "Hitze-Rotom",
|
"rotomHeat": "Hitze-Rotom",
|
||||||
"rotomWash": "Wasch-Rotom",
|
"rotomWash": "Wasch-Rotom",
|
||||||
"rotomFrost": "Frost-Rotom",
|
"rotomFrost": "Frost-Rotom",
|
||||||
"rotomFan": "Wirbel-Rotom",
|
"rotomFan": "Wirbel-Rotom",
|
||||||
"rotomMow": "Schneid-Rotom",
|
"rotomMow": "Schneid-Rotom",
|
||||||
|
"dialga": "Normalform",
|
||||||
|
"dialgaOrigin": "Urform",
|
||||||
|
"palkia": "Normalform",
|
||||||
|
"palkiaOrigin": "Urform",
|
||||||
"giratinaAltered": "Wandelform",
|
"giratinaAltered": "Wandelform",
|
||||||
|
"giratinaOrigin": "Urform",
|
||||||
"shayminLand": "Landform",
|
"shayminLand": "Landform",
|
||||||
|
"shayminSky": "Zenitform",
|
||||||
"basculinRedStriped": "Rotlinige Form",
|
"basculinRedStriped": "Rotlinige Form",
|
||||||
"basculinBlueStriped": "Blaulinige Form",
|
"basculinBlueStriped": "Blaulinige Form",
|
||||||
"basculinWhiteStriped": "Weißlinige Form",
|
"basculinWhiteStriped": "Weißlinige Form",
|
||||||
|
"darumaka": "Normalmodus",
|
||||||
|
"darumakaZen": "Trance-Modus",
|
||||||
"deerlingSpring": "Frühlingsform",
|
"deerlingSpring": "Frühlingsform",
|
||||||
"deerlingSummer": "Sommerform",
|
"deerlingSummer": "Sommerform",
|
||||||
"deerlingAutumn": "Herbstform",
|
"deerlingAutumn": "Herbstform",
|
||||||
"deerlingWinter": "Winterform",
|
"deerlingWinter": "Winterform",
|
||||||
"tornadusIncarnate": "Inkarnationsform",
|
"tornadusIncarnate": "Inkarnationsform",
|
||||||
|
"tornadusTherian": "Tiergeistform",
|
||||||
"thundurusIncarnate": "Inkarnationsform",
|
"thundurusIncarnate": "Inkarnationsform",
|
||||||
|
"thundurusTherian": "Tiergeistform",
|
||||||
"landorusIncarnate": "Inkarnationsform",
|
"landorusIncarnate": "Inkarnationsform",
|
||||||
|
"landorusTherian": "Tiergeistform",
|
||||||
|
"kyurem": "Normal",
|
||||||
|
"kyuremBlack": "Schwarzes Kyurem",
|
||||||
|
"kyuremWhite": "Weißes Kyurem",
|
||||||
"keldeoOrdinary": "Standardform",
|
"keldeoOrdinary": "Standardform",
|
||||||
|
"keldeoResolute": "Resolutform",
|
||||||
"meloettaAria": "Gesangsform",
|
"meloettaAria": "Gesangsform",
|
||||||
"meloettaPirouette": "Tanzform",
|
"meloettaPirouette": "Tanzform",
|
||||||
"froakieBattleBond": "Ash-Form",
|
"genesect": "Normal",
|
||||||
|
"genesectShock": "Blitzmodul",
|
||||||
|
"genesectBurn": "Flammenmodul",
|
||||||
|
"genesectChill": "Gefriermodul",
|
||||||
|
"genesectDouse": "Aquamodul",
|
||||||
|
"froakie": "Normalform",
|
||||||
|
"froakieBattleBond": "Freundschaftsakt",
|
||||||
|
"froakieAsh": "Ash-Form",
|
||||||
"scatterbugMeadow": "Blumenmeermuster",
|
"scatterbugMeadow": "Blumenmeermuster",
|
||||||
"scatterbugIcySnow": "Frostmuster",
|
"scatterbugIcySnow": "Frostmuster",
|
||||||
"scatterbugPolar": "Schneefeldmuster",
|
"scatterbugPolar": "Schneefeldmuster",
|
||||||
@ -91,6 +123,7 @@
|
|||||||
"flabebeOrange": "Orangeblütler",
|
"flabebeOrange": "Orangeblütler",
|
||||||
"flabebeBlue": "Blaublütler",
|
"flabebeBlue": "Blaublütler",
|
||||||
"flabebeWhite": "Weißblütler",
|
"flabebeWhite": "Weißblütler",
|
||||||
|
"furfrou": "Zottelform",
|
||||||
"furfrouHeart": "Herzchenschnitt",
|
"furfrouHeart": "Herzchenschnitt",
|
||||||
"furfrouStar": "Sternchenschnitt",
|
"furfrouStar": "Sternchenschnitt",
|
||||||
"furfrouDiamond": "Diamantenschitt",
|
"furfrouDiamond": "Diamantenschitt",
|
||||||
@ -100,6 +133,11 @@
|
|||||||
"furfrouLaReine": "Königinnenschnitt",
|
"furfrouLaReine": "Königinnenschnitt",
|
||||||
"furfrouKabuki": "Kabuki-Schnitt",
|
"furfrouKabuki": "Kabuki-Schnitt",
|
||||||
"furfrouPharaoh": "Herrscherschnitt",
|
"furfrouPharaoh": "Herrscherschnitt",
|
||||||
|
"espurrMale": "männlich",
|
||||||
|
"espurrFemale": "weiblich",
|
||||||
|
"honedgeShiled": "Schildform",
|
||||||
|
"honedgeBlade": "Klingenform",
|
||||||
|
"pumpkaboo": "Größe M",
|
||||||
"pumpkabooSmall": "Größe S",
|
"pumpkabooSmall": "Größe S",
|
||||||
"pumpkabooLarge": "Größe L",
|
"pumpkabooLarge": "Größe L",
|
||||||
"pumpkabooSuper": "Größe XL",
|
"pumpkabooSuper": "Größe XL",
|
||||||
@ -110,11 +148,37 @@
|
|||||||
"zygarde50Pc": "50% Form Scharwandel",
|
"zygarde50Pc": "50% Form Scharwandel",
|
||||||
"zygarde10Pc": "10% Form Scharwandel",
|
"zygarde10Pc": "10% Form Scharwandel",
|
||||||
"zygardeComplete": "Optimum-Form",
|
"zygardeComplete": "Optimum-Form",
|
||||||
|
"hoopa": "Gebanntes Hoopa",
|
||||||
|
"hoopaUnbound": "Entfesseltes Hoopa",
|
||||||
"oricorioBaile": "Flamenco-Stil",
|
"oricorioBaile": "Flamenco-Stil",
|
||||||
"oricorioPompom": "Cheerleading-Stil",
|
"oricorioPompom": "Cheerleading-Stil",
|
||||||
"oricorioPau": "Hula-Stil",
|
"oricorioPau": "Hula-Stil",
|
||||||
"oricorioSensu": "Buyo-Stil",
|
"oricorioSensu": "Buyo-Stil",
|
||||||
|
"rockruff": "Normalform",
|
||||||
"rockruffOwnTempo": "Gleichmut",
|
"rockruffOwnTempo": "Gleichmut",
|
||||||
|
"rockruffMidday": "Tagform",
|
||||||
|
"rockruffMidnight": "Nachtform",
|
||||||
|
"rockruffDusk": "Zwielichtform",
|
||||||
|
"wishiwashi": "Einzelform",
|
||||||
|
"wishiwashiSchool": "Schwarmform",
|
||||||
|
"typeNullNormal": "Typ:Normal",
|
||||||
|
"typeNullFighting": "Typ:Kampf",
|
||||||
|
"typeNullFlying": "Typ:Flug",
|
||||||
|
"typeNullPoison": "Typ:Gift",
|
||||||
|
"typeNullGround": "Typ:Boden",
|
||||||
|
"typeNullRock": "Typ:Gestein",
|
||||||
|
"typeNullBug": "Typ:Käfer",
|
||||||
|
"typeNullGhost": "Typ:Geist",
|
||||||
|
"typeNullSteel": "Typ:Stahl",
|
||||||
|
"typeNullFire": "Typ:Feuer",
|
||||||
|
"typeNullWater": "Typ:Wasser",
|
||||||
|
"typeNullGrass": "Typ:Pflanze",
|
||||||
|
"typeNullElectric": "Typ:Elektro",
|
||||||
|
"typeNullPsychic": "Typ:Psycho",
|
||||||
|
"typeNullIce": "Typ:Eis",
|
||||||
|
"typeNullDragon": "Typ:Drache",
|
||||||
|
"typeNullDark": "Typ:Unlicht",
|
||||||
|
"typeNullFairy": "Typ:Fee",
|
||||||
"miniorRedMeteor": "Rote-Meteorform",
|
"miniorRedMeteor": "Rote-Meteorform",
|
||||||
"miniorOrangeMeteor": "Oranger-Meteorform",
|
"miniorOrangeMeteor": "Oranger-Meteorform",
|
||||||
"miniorYellowMeteor": "Gelber-Meteorform",
|
"miniorYellowMeteor": "Gelber-Meteorform",
|
||||||
@ -131,25 +195,66 @@
|
|||||||
"miniorViolet": "Violetter Kern",
|
"miniorViolet": "Violetter Kern",
|
||||||
"mimikyuDisguised": "Verkleidete Form",
|
"mimikyuDisguised": "Verkleidete Form",
|
||||||
"mimikyuBusted": "Entlarvte Form",
|
"mimikyuBusted": "Entlarvte Form",
|
||||||
|
"necrozma": "Normalform",
|
||||||
|
"necrozmaDuskMane": "Abendmähne",
|
||||||
|
"necrozmaDawnWings": "Morgenschwingen",
|
||||||
|
"necrozmaUltra": "Ultra-Necrozma",
|
||||||
|
"magearna": "Normalform",
|
||||||
"magearnaOriginal": "Originalfarbe",
|
"magearnaOriginal": "Originalfarbe",
|
||||||
|
"marshadow": "Normalform",
|
||||||
"marshadowZenith": "Zenitform",
|
"marshadowZenith": "Zenitform",
|
||||||
|
"cramorant": "Normalform",
|
||||||
|
"cramorantGulping": "Schlingform",
|
||||||
|
"cramorantGorging": "Stopfform",
|
||||||
|
"toxelAmped": "Hoch-Form",
|
||||||
|
"toxelLowkey": "Tief-Form",
|
||||||
"sinisteaPhony": "Fälschungsform",
|
"sinisteaPhony": "Fälschungsform",
|
||||||
"sinisteaAntique": "Originalform",
|
"sinisteaAntique": "Originalform",
|
||||||
|
"milceryVanillaCream": "Vanille-Creme",
|
||||||
|
"milceryRubyCream": "Ruby-Creme",
|
||||||
|
"milceryMatchaCream": "Matcha-Creme",
|
||||||
|
"milceryMintCream": "Minz-Creme",
|
||||||
|
"milceryLemonCream": "Zitronen-Creme",
|
||||||
|
"milcerySaltedCream": "Salz-Creme",
|
||||||
|
"milceryRubySwirl": "Ruby-Mix",
|
||||||
|
"milceryCaramelSwirl": "Karamell-Mix",
|
||||||
|
"milceryRainbowSwirl": "Trio-Mix",
|
||||||
|
"eiscue": "Tiefkühlkopf",
|
||||||
"eiscueNoIce": "Wohlfühlkopf",
|
"eiscueNoIce": "Wohlfühlkopf",
|
||||||
"indeedeeMale": "männlich",
|
"indeedeeMale": "männlich",
|
||||||
"indeedeeFemale": "weiblich",
|
"indeedeeFemale": "weiblich",
|
||||||
"morpekoFullBelly": "Pappsattmuster",
|
"morpekoFullBelly": "Pappsattmuster",
|
||||||
|
"morpekoHangry": "Kohldampfmuster",
|
||||||
"zacianHeroOfManyBattles": "Heldenhafter Krieger",
|
"zacianHeroOfManyBattles": "Heldenhafter Krieger",
|
||||||
|
"zacianCrowned": "König des Schwertes",
|
||||||
"zamazentaHeroOfManyBattles": "Heldenhafter Krieger",
|
"zamazentaHeroOfManyBattles": "Heldenhafter Krieger",
|
||||||
|
"zamazentaCrowned": "König des Schildes",
|
||||||
|
"kubfuSingleStrike": "Fokussierter Stil",
|
||||||
|
"kubfuRapidStrike": "Fließender Stil",
|
||||||
|
"zarude": "Normalform",
|
||||||
"zarudeDada": "Papa",
|
"zarudeDada": "Papa",
|
||||||
|
"calyrex": "Normalform",
|
||||||
|
"calyrexIce": "Schimmelreiter",
|
||||||
|
"calyrexShadow": "Rappenreiter",
|
||||||
|
"basculinMale": "männlich",
|
||||||
|
"basculinFemale": "weiblich",
|
||||||
"enamorusIncarnate": "Inkarnationsform",
|
"enamorusIncarnate": "Inkarnationsform",
|
||||||
|
"enamorusTherian": "Tiergeistform",
|
||||||
|
"lechonkMale": "männlich",
|
||||||
|
"lechonkFemale": "weiblich",
|
||||||
|
"tandemausFour": "Dreierfamilie",
|
||||||
|
"tandemausThree": "Viererfamilie",
|
||||||
"squawkabillyGreenPlumage": "Grüngefiedert",
|
"squawkabillyGreenPlumage": "Grüngefiedert",
|
||||||
"squawkabillyBluePlumage": "Blaugefiedert",
|
"squawkabillyBluePlumage": "Blaugefiedert",
|
||||||
"squawkabillyYellowPlumage": "Gelbgefiedert",
|
"squawkabillyYellowPlumage": "Gelbgefiedert",
|
||||||
"squawkabillyWhitePlumage": "Weißgefiedert",
|
"squawkabillyWhitePlumage": "Weißgefiedert",
|
||||||
|
"finizenZero": "Alltagsform",
|
||||||
|
"finizenHero": "Heldenform",
|
||||||
"tatsugiriCurly": "Gebogene Form",
|
"tatsugiriCurly": "Gebogene Form",
|
||||||
"tatsugiriDroopy": "Hängende Form",
|
"tatsugiriDroopy": "Hängende Form",
|
||||||
"tatsugiriStretchy": "Gestrekte Form",
|
"tatsugiriStretchy": "Gestrekte Form",
|
||||||
|
"dunsparceTwo": "Zweisegmentform",
|
||||||
|
"dunsparceThree": "Dreisegmentform",
|
||||||
"gimmighoulChest": "Truhenform",
|
"gimmighoulChest": "Truhenform",
|
||||||
"gimmighoulRoaming": "Wanderform",
|
"gimmighoulRoaming": "Wanderform",
|
||||||
"koraidonApexBuild": "Vollkommene Gestalt",
|
"koraidonApexBuild": "Vollkommene Gestalt",
|
||||||
@ -164,6 +269,21 @@
|
|||||||
"miraidonGlideMode": "Gleitmodus",
|
"miraidonGlideMode": "Gleitmodus",
|
||||||
"poltchageistCounterfeit": "Imitationsform",
|
"poltchageistCounterfeit": "Imitationsform",
|
||||||
"poltchageistArtisan": "Kostbarkeitsform",
|
"poltchageistArtisan": "Kostbarkeitsform",
|
||||||
|
"poltchageistUnremarkable": "Simple Form",
|
||||||
|
"poltchageistMasterpiece": "Edle Form",
|
||||||
|
"ogerponTealMask": "Türkisgrüne Maske",
|
||||||
|
"ogerponTealMaskTera": "Türkisgrüne Maske (Terakristallisiert)",
|
||||||
|
"ogerponWellspringMask": "Brunnenmaske",
|
||||||
|
"ogerponWellspringMaskTera": "Brunnenmaske (Terakristallisiert)",
|
||||||
|
"ogerponHearthflameMask": "Ofenmaske",
|
||||||
|
"ogerponHearthflameMaskTera": "Ofenmaske (Terakristallisiert)",
|
||||||
|
"ogerponCornerstoneMask": "Fundamentmaske",
|
||||||
|
"ogerponCornerstoneMaskTera": "Fundamentmaske (Terakristallisiert)",
|
||||||
|
"terpagos": "Normalform",
|
||||||
|
"terpagosTerastal": "Terakristall-Form",
|
||||||
|
"terpagosStellar": "Stellarform",
|
||||||
|
"galarDarumaka": "Normalmodus",
|
||||||
|
"galarDarumakaZen": "Trance-Modus",
|
||||||
"paldeaTaurosCombat": "Gefechtsvariante",
|
"paldeaTaurosCombat": "Gefechtsvariante",
|
||||||
"paldeaTaurosBlaze": "Flammenvariante",
|
"paldeaTaurosBlaze": "Flammenvariante",
|
||||||
"paldeaTaurosAqua": "Flutenvariante"
|
"paldeaTaurosAqua": "Flutenvariante"
|
||||||
|
@ -126,5 +126,8 @@
|
|||||||
"skull_grunts": "Rüpel von Team Skull",
|
"skull_grunts": "Rüpel von Team Skull",
|
||||||
"macro_grunt": "Angestellter von Macro Cosmos",
|
"macro_grunt": "Angestellter von Macro Cosmos",
|
||||||
"macro_grunt_female": "Angestellte von Macro Cosmos",
|
"macro_grunt_female": "Angestellte von Macro Cosmos",
|
||||||
"macro_grunts": "Angestellte von Macro Cosmos"
|
"macro_grunts": "Angestellte von Macro Cosmos",
|
||||||
|
"star_grunt": "Rüpel von Team Star",
|
||||||
|
"star_grunt_female": "Rüpel von Team Star",
|
||||||
|
"star_grunts": "Rüpel von Team Star"
|
||||||
}
|
}
|
||||||
|
@ -142,6 +142,11 @@
|
|||||||
"faba": "Fabian",
|
"faba": "Fabian",
|
||||||
"plumeria": "Fran",
|
"plumeria": "Fran",
|
||||||
"oleana": "Olivia",
|
"oleana": "Olivia",
|
||||||
|
"giacomo": "Pinio",
|
||||||
|
"mela": "Irsa",
|
||||||
|
"atticus": "Shugi",
|
||||||
|
"ortega": "Otis",
|
||||||
|
"eri": "Rioba",
|
||||||
|
|
||||||
"maxie": "Marc",
|
"maxie": "Marc",
|
||||||
"archie": "Adrian",
|
"archie": "Adrian",
|
||||||
@ -151,6 +156,7 @@
|
|||||||
"lusamine": "Samantha",
|
"lusamine": "Samantha",
|
||||||
"guzma": "Bromley",
|
"guzma": "Bromley",
|
||||||
"rose": "Rose",
|
"rose": "Rose",
|
||||||
|
"cassiopeia": "Cosima",
|
||||||
|
|
||||||
"blue_red_double": "Blau & Rot",
|
"blue_red_double": "Blau & Rot",
|
||||||
"red_blue_double": "Rot & Blau",
|
"red_blue_double": "Rot & Blau",
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
"aether_boss": "Æther-Präsidentin",
|
"aether_boss": "Æther-Präsidentin",
|
||||||
"skull_boss": "Skull-Boss",
|
"skull_boss": "Skull-Boss",
|
||||||
"macro_boss": "Geschäftsführer von Macro Cosmos",
|
"macro_boss": "Geschäftsführer von Macro Cosmos",
|
||||||
|
"star_boss": "Team Star Big Boss",
|
||||||
"rocket_admin": "Team Rocket Vorstand",
|
"rocket_admin": "Team Rocket Vorstand",
|
||||||
"rocket_admin_female": "Team Rocket Vorstand",
|
"rocket_admin_female": "Team Rocket Vorstand",
|
||||||
"magma_admin": "Team Magma Vorstand",
|
"magma_admin": "Team Magma Vorstand",
|
||||||
@ -33,6 +34,6 @@
|
|||||||
"flare_admin_female": "Team Flare Vorstand",
|
"flare_admin_female": "Team Flare Vorstand",
|
||||||
"aether_admin": "Æther-Regionalleiter",
|
"aether_admin": "Æther-Regionalleiter",
|
||||||
"skull_admin": "Team Skull Vorstand",
|
"skull_admin": "Team Skull Vorstand",
|
||||||
"macro_admin": "Vizepräsidentin von Macro Cosmos"
|
"macro_admin": "Vizepräsidentin von Macro Cosmos",
|
||||||
|
"star_admin": "Team Star Boss"
|
||||||
}
|
}
|
||||||
|
@ -1237,6 +1237,6 @@
|
|||||||
},
|
},
|
||||||
"poisonPuppeteer": {
|
"poisonPuppeteer": {
|
||||||
"name": "Poison Puppeteer",
|
"name": "Poison Puppeteer",
|
||||||
"description": "Pokémon poisoned by Pecharunt's moves will also become confused."
|
"description": "Pokémon poisoned by this Pokémon's moves will also become confused."
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -105,5 +105,7 @@
|
|||||||
"congratulations": "Congratulations!",
|
"congratulations": "Congratulations!",
|
||||||
"beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!",
|
"beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!",
|
||||||
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
"mysteryEncounterAppeared": "What's this?"
|
"mysteryEncounterAppeared": "What's this?",
|
||||||
|
"battlerTagsHealBlock": "{{pokemonNameWithAffix}} can't restore its HP!",
|
||||||
|
"battlerTagsHealBlockOnRemove": "{{pokemonNameWithAffix}} can restore its HP again!"
|
||||||
}
|
}
|
@ -111,7 +111,7 @@
|
|||||||
"forest": "PMD EoS Dusk Forest",
|
"forest": "PMD EoS Dusk Forest",
|
||||||
"grass": "PMD EoS Apple Woods",
|
"grass": "PMD EoS Apple Woods",
|
||||||
"graveyard": "PMD EoS Mystifying Forest",
|
"graveyard": "PMD EoS Mystifying Forest",
|
||||||
"ice_cave": "Firel - -60F",
|
"ice_cave": "Firel - -50°C",
|
||||||
"island": "PMD EoS Craggy Coast",
|
"island": "PMD EoS Craggy Coast",
|
||||||
"jungle": "Lmz - Jungle",
|
"jungle": "Lmz - Jungle",
|
||||||
"laboratory": "Firel - Laboratory",
|
"laboratory": "Firel - Laboratory",
|
||||||
|
@ -766,6 +766,7 @@
|
|||||||
"2_female": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
|
"2_female": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
|
||||||
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?",
|
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?",
|
||||||
"4": "I found you! In that case, time for a Pokémon battle!",
|
"4": "I found you! In that case, time for a Pokémon battle!",
|
||||||
|
"4_female": "I found you! In that case, time for a Pokémon battle!",
|
||||||
"5": "An earful from Ms. Oleana is way worse than anything you can do!"
|
"5": "An earful from Ms. Oleana is way worse than anything you can do!"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
@ -796,7 +797,8 @@
|
|||||||
"3": "If you don't clear out real quick-like, I'll hafta come at you in self-defense. You get me?",
|
"3": "If you don't clear out real quick-like, I'll hafta come at you in self-defense. You get me?",
|
||||||
"4": "Sorry, but if you don't turn yourself around here, amigo, we'll have to send you packing!",
|
"4": "Sorry, but if you don't turn yourself around here, amigo, we'll have to send you packing!",
|
||||||
"4_female": "Sorry, but if you don't turn yourself around here, amiga, we'll have to send you packing!",
|
"4_female": "Sorry, but if you don't turn yourself around here, amiga, we'll have to send you packing!",
|
||||||
"5": "Oh great. Here comes another rando to ruin my day."
|
"5": "Oh great. Here comes another rando to ruin my day.",
|
||||||
|
"5_female": "Oh great. Here comes another rando to ruin my day."
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "How come I'M the one seeing stars?!",
|
"1": "How come I'M the one seeing stars?!",
|
||||||
@ -819,6 +821,7 @@
|
|||||||
"mela": {
|
"mela": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "So you're the dope who picked a fight with Team Star... Prepare to get messed up.",
|
"1": "So you're the dope who picked a fight with Team Star... Prepare to get messed up.",
|
||||||
|
"1_female": "So you're the dope who picked a fight with Team Star... Prepare to get messed up.",
|
||||||
"2": "All riiight, BRING IT! I'll blow everythin' sky high!"
|
"2": "All riiight, BRING IT! I'll blow everythin' sky high!"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
@ -829,6 +832,7 @@
|
|||||||
"atticus": {
|
"atticus": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "You have some nerve baring your fangs at Team Star. Come, then, villainous wretch!",
|
"1": "You have some nerve baring your fangs at Team Star. Come, then, villainous wretch!",
|
||||||
|
"1_female": "You have some nerve baring your fangs at Team Star. Come, then, villainous wretch!",
|
||||||
"2": "Be warned—I shall spare thee no mercy! En garde!"
|
"2": "Be warned—I shall spare thee no mercy! En garde!"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
@ -839,7 +843,8 @@
|
|||||||
"ortega": {
|
"ortega": {
|
||||||
"encounter": {
|
"encounter": {
|
||||||
"1": "I promise I'll play nice, so don't blame me when this battle sends you blubbering back home!",
|
"1": "I promise I'll play nice, so don't blame me when this battle sends you blubbering back home!",
|
||||||
"2": "I'll wipe that smug look off your face for sure! You're going down!"
|
"2": "I'll wipe that smug look off your face for sure! You're going down!",
|
||||||
|
"2_female": "I'll wipe that smug look off your face for sure! You're going down!"
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
"1": "Ugh! How could I LOSE! What the HECK!",
|
"1": "Ugh! How could I LOSE! What the HECK!",
|
||||||
|
@ -66,6 +66,7 @@
|
|||||||
"suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!",
|
"suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!",
|
||||||
"revivalBlessing": "{{pokemonName}} was revived!",
|
"revivalBlessing": "{{pokemonName}} was revived!",
|
||||||
"swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!",
|
"swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!",
|
||||||
|
"chillyReception": "{{pokemonName}} is preparing to tell a chillingly bad joke!",
|
||||||
"exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
|
"exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
|
||||||
"safeguard": "{{targetName}} is protected by Safeguard!",
|
"safeguard": "{{targetName}} is protected by Safeguard!",
|
||||||
"substituteOnOverlap": "{{pokemonName}} already\nhas a substitute!",
|
"substituteOnOverlap": "{{pokemonName}} already\nhas a substitute!",
|
||||||
|
@ -3129,7 +3129,7 @@
|
|||||||
},
|
},
|
||||||
"auraWheel": {
|
"auraWheel": {
|
||||||
"name": "Aura Wheel",
|
"name": "Aura Wheel",
|
||||||
"effect": "Morpeko attacks and raises its Speed with the energy stored in its cheeks. This move's type changes depending on the user's form."
|
"effect": "The user attacks and raises its Speed with the energy stored in its cheeks. If used by Morpeko, this move's type changes depending on the user's form."
|
||||||
},
|
},
|
||||||
"breakingSwipe": {
|
"breakingSwipe": {
|
||||||
"name": "Breaking Swipe",
|
"name": "Breaking Swipe",
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
"selected": "Let's do this!"
|
"selected": "Let's do this!"
|
||||||
},
|
},
|
||||||
"outro": "Look how happy your {{chosenPokemon}} is now!$Here, you can have these as well.",
|
"outro": "Look how happy your {{chosenPokemon}} is now!$Here, you can have these as well.",
|
||||||
|
"outro_failed": "How disappointing...$It looks like you still have a long way\nto go to earn your Pokémon's trust!",
|
||||||
"gained_eggs": "@s{item_fanfare}You received {{numEggs}}!",
|
"gained_eggs": "@s{item_fanfare}You received {{numEggs}}!",
|
||||||
"eggs_tooltip": "\n(+) Earn {{eggs}}",
|
"eggs_tooltip": "\n(+) Earn {{eggs}}",
|
||||||
"numEggs_one": "{{count}} {{rarity}} Egg",
|
"numEggs_one": "{{count}} {{rarity}} Egg",
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"pikachu": "Normal",
|
||||||
"pikachuCosplay": "Cosplay",
|
"pikachuCosplay": "Cosplay",
|
||||||
"pikachuCoolCosplay": "Cool Cosplay",
|
"pikachuCoolCosplay": "Cool Cosplay",
|
||||||
"pikachuBeautyCosplay": "Beauty Cosplay",
|
"pikachuBeautyCosplay": "Beauty Cosplay",
|
||||||
@ -6,8 +7,10 @@
|
|||||||
"pikachuSmartCosplay": "Smart Cosplay",
|
"pikachuSmartCosplay": "Smart Cosplay",
|
||||||
"pikachuToughCosplay": "Tough Cosplay",
|
"pikachuToughCosplay": "Tough Cosplay",
|
||||||
"pikachuPartner": "Partner",
|
"pikachuPartner": "Partner",
|
||||||
|
"eevee": "Normal",
|
||||||
"eeveePartner": "Partner",
|
"eeveePartner": "Partner",
|
||||||
"pichuSpiky": "Spiky",
|
"pichu": "Normal",
|
||||||
|
"pichuSpiky": "Spiky-Eared",
|
||||||
"unownA": "A",
|
"unownA": "A",
|
||||||
"unownB": "B",
|
"unownB": "B",
|
||||||
"unownC": "C",
|
"unownC": "C",
|
||||||
@ -36,135 +39,252 @@
|
|||||||
"unownZ": "Z",
|
"unownZ": "Z",
|
||||||
"unownExclamation": "!",
|
"unownExclamation": "!",
|
||||||
"unownQuestion": "?",
|
"unownQuestion": "?",
|
||||||
"castformSunny": "Sunny",
|
"castform": "Normal Form",
|
||||||
"castformRainy": "Rainy",
|
"castformSunny": "Sunny Form",
|
||||||
"castformSnowy": "Snowy",
|
"castformRainy": "Rainy Form",
|
||||||
"deoxysNormal": "Normal",
|
"castformSnowy": "Snowy Form",
|
||||||
"burmyPlant": "Plant",
|
"deoxysNormal": "Normal Forme",
|
||||||
"burmySandy": "Sandy",
|
"deoxysAttack": "Attack Forme",
|
||||||
"burmyTrash": "Trash",
|
"deoxysDefense": "Defense Forme",
|
||||||
"shellosEast": "East",
|
"deoxysSpeed": "Speed Forme",
|
||||||
"shellosWest": "West",
|
"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",
|
"rotomHeat": "Heat",
|
||||||
"rotomWash": "Wash",
|
"rotomWash": "Wash",
|
||||||
"rotomFrost": "Frost",
|
"rotomFrost": "Frost",
|
||||||
"rotomFan": "Fan",
|
"rotomFan": "Fan",
|
||||||
"rotomMow": "Mow",
|
"rotomMow": "Mow",
|
||||||
"giratinaAltered": "Altered",
|
"dialga": "Normal",
|
||||||
"shayminLand": "Land",
|
"dialgaOrigin": "Origin Forme",
|
||||||
"basculinRedStriped": "Red Striped",
|
"palkia": "Normal",
|
||||||
"basculinBlueStriped": "Blue Striped",
|
"palkiaOrigin": "Origin Forme",
|
||||||
"basculinWhiteStriped": "White Striped",
|
"giratinaAltered": "Altered Forme",
|
||||||
"deerlingSpring": "Spring",
|
"giratinaOrigin": "Origin Forme",
|
||||||
"deerlingSummer": "Summer",
|
"shayminLand": "Land Forme",
|
||||||
"deerlingAutumn": "Autumn",
|
"shayminSky": "Sky Forme",
|
||||||
"deerlingWinter": "Winter",
|
"basculinRedStriped": "Red-Striped Form",
|
||||||
"tornadusIncarnate": "Incarnate",
|
"basculinBlueStriped": "Blue-Striped Form",
|
||||||
"thundurusIncarnate": "Incarnate",
|
"basculinWhiteStriped": "White-Striped Form",
|
||||||
"landorusIncarnate": "Incarnate",
|
"darumaka": "Standard Mode",
|
||||||
"keldeoOrdinary": "Ordinary",
|
"darumakaZen": "Zen Mode",
|
||||||
"meloettaAria": "Aria",
|
"deerlingSpring": "Spring Form",
|
||||||
"meloettaPirouette": "Pirouette",
|
"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 Form",
|
||||||
|
"keldeoResolute": "Resolute",
|
||||||
|
"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",
|
"froakieBattleBond": "Battle Bond",
|
||||||
"scatterbugMeadow": "Meadow",
|
"froakieAsh": "Ash",
|
||||||
"scatterbugIcySnow": "Icy Snow",
|
"scatterbugMeadow": "Meadow Pattern",
|
||||||
"scatterbugPolar": "Polar",
|
"scatterbugIcySnow": "Icy Snow Pattern",
|
||||||
"scatterbugTundra": "Tundra",
|
"scatterbugPolar": "Polar Pattern",
|
||||||
"scatterbugContinental": "Continental",
|
"scatterbugTundra": "Tundra Pattern",
|
||||||
"scatterbugGarden": "Garden",
|
"scatterbugContinental": "Continental Pattern",
|
||||||
"scatterbugElegant": "Elegant",
|
"scatterbugGarden": "Garden Pattern",
|
||||||
"scatterbugModern": "Modern",
|
"scatterbugElegant": "Elegant Pattern",
|
||||||
"scatterbugMarine": "Marine",
|
"scatterbugModern": "Modern Pattern",
|
||||||
"scatterbugArchipelago": "Archipelago",
|
"scatterbugMarine": "Marine Pattern",
|
||||||
"scatterbugHighPlains": "High Plains",
|
"scatterbugArchipelago": "Archipelago Pattern",
|
||||||
"scatterbugSandstorm": "Sandstorm",
|
"scatterbugHighPlains": "High Plains Pattern",
|
||||||
"scatterbugRiver": "River",
|
"scatterbugSandstorm": "Sandstorm Pattern",
|
||||||
"scatterbugMonsoon": "Monsoon",
|
"scatterbugRiver": "River Pattern",
|
||||||
"scatterbugSavanna": "Savanna",
|
"scatterbugMonsoon": "Monsoon Pattern",
|
||||||
"scatterbugSun": "Sun",
|
"scatterbugSavanna": "Savanna Pattern",
|
||||||
"scatterbugOcean": "Ocean",
|
"scatterbugSun": "Sun Pattern",
|
||||||
"scatterbugJungle": "Jungle",
|
"scatterbugOcean": "Ocean Pattern",
|
||||||
"scatterbugFancy": "Fancy",
|
"scatterbugJungle": "Jungle Pattern",
|
||||||
"scatterbugPokeBall": "Poké Ball",
|
"scatterbugFancy": "Fancy Pattern",
|
||||||
"flabebeRed": "Red",
|
"scatterbugPokeBall": "Poké Ball Pattern",
|
||||||
"flabebeYellow": "Yellow",
|
"flabebeRed": "Red Flower",
|
||||||
"flabebeOrange": "Orange",
|
"flabebeYellow": "Yellow Flower",
|
||||||
"flabebeBlue": "Blue",
|
"flabebeOrange": "Orange Flower",
|
||||||
"flabebeWhite": "White",
|
"flabebeBlue": "Blue Flower",
|
||||||
"furfrouHeart": "Heart",
|
"flabebeWhite": "White Flower",
|
||||||
"furfrouStar": "Star",
|
"furfrou": "Natural Form",
|
||||||
"furfrouDiamond": "Diamond",
|
"furfrouHeart": "Heart Trim",
|
||||||
"furfrouDebutante": "Debutante",
|
"furfrouStar": "Star Trim",
|
||||||
"furfrouMatron": "Matron",
|
"furfrouDiamond": "Diamond Trim",
|
||||||
"furfrouDandy": "Dandy",
|
"furfrouDebutante": "Debutante Trim",
|
||||||
"furfrouLaReine": "La Reine",
|
"furfrouMatron": "Matron Trim",
|
||||||
"furfrouKabuki": "Kabuki",
|
"furfrouDandy": "Dandy Trim",
|
||||||
"furfrouPharaoh": "Pharaoh",
|
"furfrouLaReine": "La Reine Trim",
|
||||||
"pumpkabooSmall": "Small",
|
"furfrouKabuki": "Kabuki Trim",
|
||||||
"pumpkabooLarge": "Large",
|
"furfrouPharaoh": "Pharaoh Trim",
|
||||||
"pumpkabooSuper": "Super",
|
"espurrMale": "Male",
|
||||||
"xerneasNeutral": "Neutral",
|
"espurrFemale": "Female",
|
||||||
"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",
|
"zygarde50": "50% Forme",
|
||||||
"zygarde10": "10% Forme",
|
"zygarde10": "10% Forme",
|
||||||
"zygarde50Pc": "50% Forme Power Construct",
|
"zygarde50Pc": "50% Forme Power Construct",
|
||||||
"zygarde10Pc": "10% Forme Power Construct",
|
"zygarde10Pc": "10% Forme Power Construct",
|
||||||
"zygardeComplete": "Complete Forme",
|
"zygardeComplete": "Complete Forme",
|
||||||
"oricorioBaile": "Baile",
|
"hoopa": "Confined",
|
||||||
"oricorioPompom": "Pom-Pom",
|
"hoopaUnbound": "Unbound",
|
||||||
"oricorioPau": "Pau",
|
"oricorioBaile": "Baile Style",
|
||||||
"oricorioSensu": "Sensu",
|
"oricorioPompom": "Pom-Pom Style",
|
||||||
|
"oricorioPau": "Pau Style",
|
||||||
|
"oricorioSensu": "Sensu Style",
|
||||||
|
"rockruff": "Normal",
|
||||||
"rockruffOwnTempo": "Own Tempo",
|
"rockruffOwnTempo": "Own Tempo",
|
||||||
"miniorRedMeteor": "Red Meteor",
|
"rockruffMidday": "Midday Form",
|
||||||
"miniorOrangeMeteor": "Orange Meteor",
|
"rockruffMidnight": "Midnight Form",
|
||||||
"miniorYellowMeteor": "Yellow Meteor",
|
"rockruffDusk": "Dusk Form",
|
||||||
"miniorGreenMeteor": "Green Meteor",
|
"wishiwashi": "Solo Form",
|
||||||
"miniorBlueMeteor": "Blue Meteor",
|
"wishiwashiSchool": "School",
|
||||||
"miniorIndigoMeteor": "Indigo Meteor",
|
"typeNullNormal": "Type: Normal",
|
||||||
"miniorVioletMeteor": "Violet Meteor",
|
"typeNullFighting": "Type: Fighting",
|
||||||
"miniorRed": "Red",
|
"typeNullFlying": "Type: Flying",
|
||||||
"miniorOrange": "Orange",
|
"typeNullPoison": "Type: Poison",
|
||||||
"miniorYellow": "Yellow",
|
"typeNullGround": "Type: Ground",
|
||||||
"miniorGreen": "Green",
|
"typeNullRock": "Type: Rock",
|
||||||
"miniorBlue": "Blue",
|
"typeNullBug": "Type: Bug",
|
||||||
"miniorIndigo": "Indigo",
|
"typeNullGhost": "Type: Ghost",
|
||||||
"miniorViolet": "Violet",
|
"typeNullSteel": "Type: Steel",
|
||||||
"mimikyuDisguised": "Disguised",
|
"typeNullFire": "Type: Fire",
|
||||||
"mimikyuBusted": "Busted",
|
"typeNullWater": "Type: Water",
|
||||||
|
"typeNullGrass": "Type: Grass",
|
||||||
|
"typeNullElectric": "Type: Electric",
|
||||||
|
"typeNullPsychic": "Type: Psychic",
|
||||||
|
"typeNullIce": "Type: Ice",
|
||||||
|
"typeNullDragon": "Type: Dragon",
|
||||||
|
"typeNullDark": "Type: Dark",
|
||||||
|
"typeNullFairy": "Type: Fairy",
|
||||||
|
"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",
|
"magearnaOriginal": "Original",
|
||||||
|
"marshadow": "Normal",
|
||||||
"marshadowZenith": "Zenith",
|
"marshadowZenith": "Zenith",
|
||||||
"sinisteaPhony": "Phony",
|
"cramorant": "Normal",
|
||||||
"sinisteaAntique": "Antique",
|
"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",
|
||||||
|
"milceryMintCream": "Mint Cream",
|
||||||
|
"milceryLemonCream": "Lemon Cream",
|
||||||
|
"milcerySaltedCream": "Salted Cream",
|
||||||
|
"milceryRubySwirl": "Ruby Swirl",
|
||||||
|
"milceryCaramelSwirl": "Caramel Swirl",
|
||||||
|
"milceryRainbowSwirl": "Rainbow Swirl",
|
||||||
|
"eiscue": "Ice Face",
|
||||||
"eiscueNoIce": "No Ice",
|
"eiscueNoIce": "No Ice",
|
||||||
"indeedeeMale": "Male",
|
"indeedeeMale": "Male",
|
||||||
"indeedeeFemale": "Female",
|
"indeedeeFemale": "Female",
|
||||||
"morpekoFullBelly": "Full Belly",
|
"morpekoFullBelly": "Full Belly Mode",
|
||||||
|
"morpekoHangry": "Hangry Mode",
|
||||||
"zacianHeroOfManyBattles": "Hero Of Many Battles",
|
"zacianHeroOfManyBattles": "Hero Of Many Battles",
|
||||||
|
"zacianCrowned": "Crowned",
|
||||||
"zamazentaHeroOfManyBattles": "Hero Of Many Battles",
|
"zamazentaHeroOfManyBattles": "Hero Of Many Battles",
|
||||||
|
"zamazentaCrowned": "Crowned",
|
||||||
|
"kubfuSingleStrike": "Single Strike Style",
|
||||||
|
"kubfuRapidStrike": "Rapid Strike Style",
|
||||||
|
"zarude": "Normal",
|
||||||
"zarudeDada": "Dada",
|
"zarudeDada": "Dada",
|
||||||
"enamorusIncarnate": "Incarnate",
|
"calyrex": "Normal",
|
||||||
|
"calyrexIce": "Ice Rider",
|
||||||
|
"calyrexShadow": "Shadow Rider",
|
||||||
|
"basculinMale": "Male",
|
||||||
|
"basculinFemale": "Female",
|
||||||
|
"enamorusIncarnate": "Incarnate Forme",
|
||||||
|
"enamorusTherian": "Therian Forme",
|
||||||
|
"lechonkMale": "Male",
|
||||||
|
"lechonkFemale": "Female",
|
||||||
|
"tandemausFour": "Family of Four",
|
||||||
|
"tandemausThree": "Family of Three",
|
||||||
"squawkabillyGreenPlumage": "Green Plumage",
|
"squawkabillyGreenPlumage": "Green Plumage",
|
||||||
"squawkabillyBluePlumage": "Blue Plumage",
|
"squawkabillyBluePlumage": "Blue Plumage",
|
||||||
"squawkabillyYellowPlumage": "Yellow Plumage",
|
"squawkabillyYellowPlumage": "Yellow Plumage",
|
||||||
"squawkabillyWhitePlumage": "White Plumage",
|
"squawkabillyWhitePlumage": "White Plumage",
|
||||||
"tatsugiriCurly": "Curly",
|
"finizenZero": "Zero Form",
|
||||||
"tatsugiriDroopy": "Droopy",
|
"finizenHero": "Hero Form",
|
||||||
"tatsugiriStretchy": "Stretchy",
|
"tatsugiriCurly": "Curly Form",
|
||||||
"gimmighoulChest": "Chest",
|
"tatsugiriDroopy": "Droopy Form",
|
||||||
"gimmighoulRoaming": "Roaming",
|
"tatsugiriStretchy": "Stretchy Form",
|
||||||
|
"dunsparceTwo": "Two-Segment Form",
|
||||||
|
"dunsparceThree": "Three-Segment Form",
|
||||||
|
"gimmighoulChest": "Chest Form",
|
||||||
|
"gimmighoulRoaming": "Roaming Form",
|
||||||
"koraidonApexBuild": "Apex Build",
|
"koraidonApexBuild": "Apex Build",
|
||||||
"koraidonLimitedBuild": "Limited Build",
|
"koraidonLimitedBuild": "Limited Build",
|
||||||
"koraidonSprintingBuild": "Sprinting Build",
|
"koraidonSprintingBuild": "Sprinting Build",
|
||||||
"koraidonSwimmingBuild": "Swimming Build",
|
"koraidonSwimmingBuild": "Swimming Build",
|
||||||
"koraidonGlidingBuild": "Gliding Build",
|
"koraidonGlidingBuild": "Gliding Build",
|
||||||
"miraidonUltimateMode": "Ultimate Mode",
|
"miraidonUltimateMode": "Ultimate Mode",
|
||||||
"miraidonLowPowerMode": "Low Power Mode",
|
"miraidonLowPowerMode": "Low-Power Mode",
|
||||||
"miraidonDriveMode": "Drive Mode",
|
"miraidonDriveMode": "Drive Mode",
|
||||||
"miraidonAquaticMode": "Aquatic Mode",
|
"miraidonAquaticMode": "Aquatic Mode",
|
||||||
"miraidonGlideMode": "Glide Mode",
|
"miraidonGlideMode": "Glide Mode",
|
||||||
"poltchageistCounterfeit": "Counterfeit",
|
"poltchageistCounterfeit": "Counterfeit Form",
|
||||||
"poltchageistArtisan": "Artisan",
|
"poltchageistArtisan": "Artisan Form",
|
||||||
"paldeaTaurosCombat": "Combat",
|
"poltchageistUnremarkable": "Unremarkable Form",
|
||||||
"paldeaTaurosBlaze": "Blaze",
|
"poltchageistMasterpiece": "Masterpiece Form",
|
||||||
"paldeaTaurosAqua": "Aqua"
|
"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",
|
||||||
|
"terpagos": "Normal Form",
|
||||||
|
"terpagosTerastal": "Terastal Form",
|
||||||
|
"terpagosStellar": "Stellar Form",
|
||||||
|
"galarDarumaka": "Standard Mode",
|
||||||
|
"galarDarumakaZen": "Zen Mode",
|
||||||
|
"paldeaTaurosCombat": "Combat Breed",
|
||||||
|
"paldeaTaurosBlaze": "Blaze Breed",
|
||||||
|
"paldeaTaurosAqua": "Aqua Breed"
|
||||||
}
|
}
|
@ -155,7 +155,7 @@
|
|||||||
"lusamine": "Lusamine",
|
"lusamine": "Lusamine",
|
||||||
"guzma": "Guzma",
|
"guzma": "Guzma",
|
||||||
"rose": "Rose",
|
"rose": "Rose",
|
||||||
"cassiopeia": "Cassiopeia",
|
"cassiopeia": "Penny",
|
||||||
|
|
||||||
"blue_red_double": "Blue & Red",
|
"blue_red_double": "Blue & Red",
|
||||||
"red_blue_double": "Red & Blue",
|
"red_blue_double": "Red & Blue",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"costar": "¡{{pokemonName}} copió los cambios de características de {{allyName}}!",
|
"costar": "¡{{pokemonName}} copió los cambios de características de {{allyName}}!",
|
||||||
"iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!",
|
"iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!",
|
||||||
"perishBody": "¡{{abilityName}} de {{pokemonName}} debilitará a ambos Pokémon en 3 turnos!",
|
"perishBody": "¡{{abilityName}} de {{pokemonName}} debilitará a ambos Pokémon en 3 turnos!",
|
||||||
"poisonHeal": "¡{{pokemonNameWithAffix}} restauró algunos de sus PS gracias a {{abilityName}}!",
|
"poisonHeal": "¡{{pokemonName}} restauró algunos de sus PS gracias a {{abilityName}}!",
|
||||||
"trace": "¡{{pokemonName}} ha copiado la habilidad {{abilityName}} \nde {{targetName}}!",
|
"trace": "¡{{pokemonName}} ha copiado la habilidad {{abilityName}} \nde {{targetName}}!",
|
||||||
"windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!",
|
"windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!",
|
||||||
"quickDraw": "¡{{pokemonName}} ataca primero gracias a la habilidad Mano Rápida!",
|
"quickDraw": "¡{{pokemonName}} ataca primero gracias a la habilidad Mano Rápida!",
|
||||||
|
@ -1237,6 +1237,6 @@
|
|||||||
},
|
},
|
||||||
"poisonPuppeteer": {
|
"poisonPuppeteer": {
|
||||||
"name": "Títere Tóxico",
|
"name": "Títere Tóxico",
|
||||||
"description": "Los rivales que Pecharunt envenene con sus movimientos también sufrirán confusión."
|
"description": "Los rivales que el usuario envenene con sus movimientos también sufrirán confusión."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,5 +85,7 @@
|
|||||||
"statSeverelyFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!",
|
"statSeverelyFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!",
|
||||||
"statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!",
|
"statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!",
|
||||||
"statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!",
|
"statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!",
|
||||||
"statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!"
|
"statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!",
|
||||||
|
"battlerTagsHealBlock": "¡{{pokemonNameWithAffix}} no puede restaurar sus PS!",
|
||||||
|
"battlerTagsHealBlockOnRemove": "¡{{pokemonNameWithAffix}} ya puede recuperar PS!"
|
||||||
}
|
}
|
||||||
|
@ -107,17 +107,17 @@
|
|||||||
"forest": "PMD EoS - Bosque Sombrío",
|
"forest": "PMD EoS - Bosque Sombrío",
|
||||||
"grass": "PMD EoS - Manzanar",
|
"grass": "PMD EoS - Manzanar",
|
||||||
"graveyard": "PMD EoS - Bosque Misterio",
|
"graveyard": "PMD EoS - Bosque Misterio",
|
||||||
"ice_cave": "PMD EoS - Gran Iceberg",
|
"ice_cave": "Firel - -50°C",
|
||||||
"island": "PMD EoS - Costa Escarpada",
|
"island": "PMD EoS - Costa Escarpada",
|
||||||
"jungle": "Lmz - Jungla",
|
"jungle": "Lmz - Jungla",
|
||||||
"laboratory": "Firel - Laboratorio",
|
"laboratory": "Firel - Laboratorio",
|
||||||
"lake": "PMD EoS - Cueva Cristal",
|
"lake": "Lmz - Lake",
|
||||||
"meadow": "PMD EoS - Bosque de la Cumbre del Cielo",
|
"meadow": "PMD EoS - Bosque de la Cumbre del Cielo",
|
||||||
"metropolis": "Firel - Metrópolis",
|
"metropolis": "Firel - Metrópolis",
|
||||||
"mountain": "PMD EoS - Monte Cuerno",
|
"mountain": "PMD EoS - Monte Cuerno",
|
||||||
"plains": "PMD EoS - Pradera de la Cumbre del Cielo",
|
"plains": "Firel - Route 888",
|
||||||
"power_plant": "PMD EoS - Pradera Destello",
|
"power_plant": "Firel - The Klink",
|
||||||
"ruins": "PMD EoS - Sima Hermética",
|
"ruins": "Lmz - Ancient Ruins",
|
||||||
"sea": "Andr06 - Misticismo marino",
|
"sea": "Andr06 - Misticismo marino",
|
||||||
"seabed": "Firel - Lecho del mar",
|
"seabed": "Firel - Lecho del mar",
|
||||||
"slum": "Andr06 - Snom sigiloso",
|
"slum": "Andr06 - Snom sigiloso",
|
||||||
@ -127,7 +127,7 @@
|
|||||||
"tall_grass": "PMD EoS - Bosque Niebla",
|
"tall_grass": "PMD EoS - Bosque Niebla",
|
||||||
"temple": "PMD EoS - Cueva Regia",
|
"temple": "PMD EoS - Cueva Regia",
|
||||||
"town": "PMD EoS - Tema del territorio aleatorio 3",
|
"town": "PMD EoS - Tema del territorio aleatorio 3",
|
||||||
"volcano": "PMD EoS - Cueva Vapor",
|
"volcano": "Firel - Twisturn Volcano",
|
||||||
"wasteland": "PMD EoS - Corazón Tierra Oculta",
|
"wasteland": "PMD EoS - Corazón Tierra Oculta",
|
||||||
"encounter_ace_trainer": "BW - ¡Vs. entrenador guay!",
|
"encounter_ace_trainer": "BW - ¡Vs. entrenador guay!",
|
||||||
"encounter_backpacker": "BW - ¡Vs. mochilero!",
|
"encounter_backpacker": "BW - ¡Vs. mochilero!",
|
||||||
|
@ -3129,7 +3129,7 @@
|
|||||||
},
|
},
|
||||||
"auraWheel": {
|
"auraWheel": {
|
||||||
"name": "Rueda Aural",
|
"name": "Rueda Aural",
|
||||||
"effect": "La energía que acumula en las mejillas le sirve para atacar y aumentar su Velocidad. Este movimiento cambia de tipo según la forma que adopte Morpeko."
|
"effect": "La energía que acumula en las mejillas le sirve para atacar y aumentar su Velocidad. Si es utilizado por Morpeko, este movimiento cambia de tipo según la forma que adopte."
|
||||||
},
|
},
|
||||||
"breakingSwipe": {
|
"breakingSwipe": {
|
||||||
"name": "Vasto Impacto",
|
"name": "Vasto Impacto",
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"pikachu": "Normal",
|
||||||
"pikachuCosplay": "Coqueta",
|
"pikachuCosplay": "Coqueta",
|
||||||
"pikachuCoolCosplay": "Roquera",
|
"pikachuCoolCosplay": "Roquera",
|
||||||
"pikachuBeautyCosplay": "Aristócrata",
|
"pikachuBeautyCosplay": "Aristócrata",
|
||||||
@ -6,7 +7,9 @@
|
|||||||
"pikachuSmartCosplay": "Erudita",
|
"pikachuSmartCosplay": "Erudita",
|
||||||
"pikachuToughCosplay": "Enmascarada",
|
"pikachuToughCosplay": "Enmascarada",
|
||||||
"pikachuPartner": "Compañero",
|
"pikachuPartner": "Compañero",
|
||||||
|
"eevee": "Normal",
|
||||||
"eeveePartner": "Compañero",
|
"eeveePartner": "Compañero",
|
||||||
|
"pichu": "Normal",
|
||||||
"pichuSpiky": "Picoreja",
|
"pichuSpiky": "Picoreja",
|
||||||
"unownA": "A",
|
"unownA": "A",
|
||||||
"unownB": "B",
|
"unownB": "B",
|
||||||
@ -36,36 +39,65 @@
|
|||||||
"unownZ": "Z",
|
"unownZ": "Z",
|
||||||
"unownExclamation": "!",
|
"unownExclamation": "!",
|
||||||
"unownQuestion": "?",
|
"unownQuestion": "?",
|
||||||
|
"castform": "Normal Form",
|
||||||
"castformSunny": "Sol",
|
"castformSunny": "Sol",
|
||||||
"castformRainy": "Lluvia",
|
"castformRainy": "Lluvia",
|
||||||
"castformSnowy": "Nieve",
|
"castformSnowy": "Nieve",
|
||||||
"deoxysNormal": "Normal",
|
"deoxysNormal": "Normal",
|
||||||
|
"deoxysAttack": "Ataque",
|
||||||
|
"deoxysDefense": "Defensa",
|
||||||
|
"deoxysSpeed": "Velocidad",
|
||||||
"burmyPlant": "Planta",
|
"burmyPlant": "Planta",
|
||||||
"burmySandy": "Arena",
|
"burmySandy": "Arena",
|
||||||
"burmyTrash": "Basura",
|
"burmyTrash": "Basura",
|
||||||
|
"cherubiOvercast": "Encapotado",
|
||||||
|
"cherubiSunshine": "Soleado",
|
||||||
"shellosEast": "Este",
|
"shellosEast": "Este",
|
||||||
"shellosWest": "Oeste",
|
"shellosWest": "Oeste",
|
||||||
|
"rotom": "Normal",
|
||||||
"rotomHeat": "Calor",
|
"rotomHeat": "Calor",
|
||||||
"rotomWash": "Lavado",
|
"rotomWash": "Lavado",
|
||||||
"rotomFrost": "Frío",
|
"rotomFrost": "Frío",
|
||||||
"rotomFan": "Ventilador",
|
"rotomFan": "Ventilador",
|
||||||
"rotomMow": "Corte",
|
"rotomMow": "Corte",
|
||||||
|
"dialga": "Normal",
|
||||||
|
"dialgaOrigin": "Origen",
|
||||||
|
"palkia": "Normal",
|
||||||
|
"palkiaOrigin": "Origen",
|
||||||
"giratinaAltered": "Modificada",
|
"giratinaAltered": "Modificada",
|
||||||
|
"giratinaOrigin": "Origen",
|
||||||
"shayminLand": "Tierra",
|
"shayminLand": "Tierra",
|
||||||
|
"shayminSky": "Cielo",
|
||||||
"basculinRedStriped": "Raya Roja",
|
"basculinRedStriped": "Raya Roja",
|
||||||
"basculinBlueStriped": "Raya Azul",
|
"basculinBlueStriped": "Raya Azul",
|
||||||
"basculinWhiteStriped": "Raya Blanca",
|
"basculinWhiteStriped": "Raya Blanca",
|
||||||
|
"darumaka": "Modo Normal",
|
||||||
|
"darumakaZen": "Modo Daruma",
|
||||||
"deerlingSpring": "Primavera",
|
"deerlingSpring": "Primavera",
|
||||||
"deerlingSummer": "Verano",
|
"deerlingSummer": "Verano",
|
||||||
"deerlingAutumn": "Otoño",
|
"deerlingAutumn": "Otoño",
|
||||||
"deerlingWinter": "Invierno",
|
"deerlingWinter": "Invierno",
|
||||||
"tornadusIncarnate": "Avatar",
|
"tornadusIncarnate": "Avatar",
|
||||||
|
"tornadusTherian": "Tótem",
|
||||||
"thundurusIncarnate": "Avatar",
|
"thundurusIncarnate": "Avatar",
|
||||||
|
"thundurusTherian": "Tótem",
|
||||||
"landorusIncarnate": "Avatar",
|
"landorusIncarnate": "Avatar",
|
||||||
|
"landorusTherian": "Tótem",
|
||||||
|
"kyurem": "Normal",
|
||||||
|
"kyuremBlack": "Negro",
|
||||||
|
"kyuremWhite": "Blanco",
|
||||||
"keldeoOrdinary": "Habitual",
|
"keldeoOrdinary": "Habitual",
|
||||||
|
"keldeoResolute": "Brío",
|
||||||
"meloettaAria": "Lírica",
|
"meloettaAria": "Lírica",
|
||||||
"meloettaPirouette": "Danza",
|
"meloettaPirouette": "Danza",
|
||||||
|
"genesect": "Normal",
|
||||||
|
"genesectShock": "FulgoROM",
|
||||||
|
"genesectBurn": "PiroROM",
|
||||||
|
"genesectChill": "CrioROM",
|
||||||
|
"genesectDouse": "HidroROM",
|
||||||
|
"froakie": "Normal",
|
||||||
"froakieBattleBond": "Fuerte Afecto",
|
"froakieBattleBond": "Fuerte Afecto",
|
||||||
|
"froakieAsh": "Ash",
|
||||||
"scatterbugMeadow": "Floral",
|
"scatterbugMeadow": "Floral",
|
||||||
"scatterbugIcySnow": "Polar",
|
"scatterbugIcySnow": "Polar",
|
||||||
"scatterbugPolar": "Taiga",
|
"scatterbugPolar": "Taiga",
|
||||||
@ -91,6 +123,7 @@
|
|||||||
"flabebeOrange": "Naranja",
|
"flabebeOrange": "Naranja",
|
||||||
"flabebeBlue": "Azul",
|
"flabebeBlue": "Azul",
|
||||||
"flabebeWhite": "Blanco",
|
"flabebeWhite": "Blanco",
|
||||||
|
"furfrou": "Salvaje",
|
||||||
"furfrouHeart": "Corazón",
|
"furfrouHeart": "Corazón",
|
||||||
"furfrouStar": "Estrella",
|
"furfrouStar": "Estrella",
|
||||||
"furfrouDiamond": "Diamante",
|
"furfrouDiamond": "Diamante",
|
||||||
@ -100,9 +133,14 @@
|
|||||||
"furfrouLaReine": "Aristócrata",
|
"furfrouLaReine": "Aristócrata",
|
||||||
"furfrouKabuki": "Kabuki",
|
"furfrouKabuki": "Kabuki",
|
||||||
"furfrouPharaoh": "Faraónico",
|
"furfrouPharaoh": "Faraónico",
|
||||||
"pumpkabooSmall": "Pequeño",
|
"espurrMale": "Macho",
|
||||||
"pumpkabooLarge": "Grande",
|
"espurrFemale": "Hembra",
|
||||||
"pumpkabooSuper": "Enorme",
|
"honedgeShiled": "Escudo",
|
||||||
|
"honedgeBlade": "Filo",
|
||||||
|
"pumpkaboo": "Tamaño Normal",
|
||||||
|
"pumpkabooSmall": "Tamaño Pequeño",
|
||||||
|
"pumpkabooLarge": "Tamaño Grande",
|
||||||
|
"pumpkabooSuper": "Tamaño Extragrande",
|
||||||
"xerneasNeutral": "Relajado",
|
"xerneasNeutral": "Relajado",
|
||||||
"xerneasActive": "Activo",
|
"xerneasActive": "Activo",
|
||||||
"zygarde50": "Al 50%",
|
"zygarde50": "Al 50%",
|
||||||
@ -110,11 +148,37 @@
|
|||||||
"zygarde50Pc": "Zygarde al 50%",
|
"zygarde50Pc": "Zygarde al 50%",
|
||||||
"zygarde10Pc": "Zygarde al 10%",
|
"zygarde10Pc": "Zygarde al 10%",
|
||||||
"zygardeComplete": "Zygarde Completo",
|
"zygardeComplete": "Zygarde Completo",
|
||||||
|
"hoopa": "Contenido",
|
||||||
|
"hoopaUnbound": "Desatado",
|
||||||
"oricorioBaile": "Apasionado",
|
"oricorioBaile": "Apasionado",
|
||||||
"oricorioPompom": "Animado",
|
"oricorioPompom": "Animado",
|
||||||
"oricorioPau": "Plácido",
|
"oricorioPau": "Plácido",
|
||||||
"oricorioSensu": "Refinado",
|
"oricorioSensu": "Refinado",
|
||||||
|
"rockruff": "Normal",
|
||||||
"rockruffOwnTempo": "Ritmo Propio",
|
"rockruffOwnTempo": "Ritmo Propio",
|
||||||
|
"rockruffMidday": "Diurna",
|
||||||
|
"rockruffMidnight": "Nocturna",
|
||||||
|
"rockruffDusk": "Crepuscular",
|
||||||
|
"wishiwashi": "Solo Form",
|
||||||
|
"wishiwashiSchool": "Banco",
|
||||||
|
"typeNullNormal": "Tipo Normal",
|
||||||
|
"typeNullFighting": "Tipo Lucha",
|
||||||
|
"typeNullFlying": "Tipo Volador",
|
||||||
|
"typeNullPoison": "Tipo Veneno",
|
||||||
|
"typeNullGround": "Tipo Tierra",
|
||||||
|
"typeNullRock": "Tipo Roca",
|
||||||
|
"typeNullBug": "Tipo Bicho",
|
||||||
|
"typeNullGhost": "Tipo Fantasma",
|
||||||
|
"typeNullSteel": "Tipo Acero",
|
||||||
|
"typeNullFire": "Tipo Fuego",
|
||||||
|
"typeNullWater": "Tipo Agua",
|
||||||
|
"typeNullGrass": "Tipo Planta",
|
||||||
|
"typeNullElectric": "Tipo Eléctrico",
|
||||||
|
"typeNullPsychic": "Tipo Psíquico",
|
||||||
|
"typeNullIce": "Tipo Hielo",
|
||||||
|
"typeNullDragon": "Tipo Dragón",
|
||||||
|
"typeNullDark": "Tipo Siniestro",
|
||||||
|
"typeNullFairy": "Tipo Hada",
|
||||||
"miniorRedMeteor": "Núcleo Rojo",
|
"miniorRedMeteor": "Núcleo Rojo",
|
||||||
"miniorOrangeMeteor": "Núcleo Naranja",
|
"miniorOrangeMeteor": "Núcleo Naranja",
|
||||||
"miniorYellowMeteor": "Núcleo Amarillo",
|
"miniorYellowMeteor": "Núcleo Amarillo",
|
||||||
@ -131,25 +195,66 @@
|
|||||||
"miniorViolet": "Violeta",
|
"miniorViolet": "Violeta",
|
||||||
"mimikyuDisguised": "Encubierta",
|
"mimikyuDisguised": "Encubierta",
|
||||||
"mimikyuBusted": "Descubierta",
|
"mimikyuBusted": "Descubierta",
|
||||||
|
"necrozma": "Normal",
|
||||||
|
"necrozmaDuskMane": "Melena Crepuscular",
|
||||||
|
"necrozmaDawnWings": "Asas Alvorada",
|
||||||
|
"necrozmaUltra": "Ultra",
|
||||||
|
"magearna": "Normal",
|
||||||
"magearnaOriginal": "Vetusto",
|
"magearnaOriginal": "Vetusto",
|
||||||
|
"marshadow": "Normal",
|
||||||
"marshadowZenith": "Cénit",
|
"marshadowZenith": "Cénit",
|
||||||
|
"cramorant": "Normal",
|
||||||
|
"cramorantGulping": "Tragatodo",
|
||||||
|
"cramorantGorging": "Engulletodo",
|
||||||
|
"toxelAmped": "Agudo",
|
||||||
|
"toxelLowkey": "Grave",
|
||||||
"sinisteaPhony": "Falsificada",
|
"sinisteaPhony": "Falsificada",
|
||||||
"sinisteaAntique": "Genuina",
|
"sinisteaAntique": "Genuina",
|
||||||
|
"milceryVanillaCream": "Crema de Vainilla",
|
||||||
|
"milceryRubyCream": "Crema Rosa",
|
||||||
|
"milceryMatchaCream": "Crema de Té",
|
||||||
|
"milceryMintCream": "Crema de Menta",
|
||||||
|
"milceryLemonCream": "Crema de Limón",
|
||||||
|
"milcerySaltedCream": "Crema Salada",
|
||||||
|
"milceryRubySwirl": "Mezcla Rosa",
|
||||||
|
"milceryCaramelSwirl": "Mezcla Caramelo",
|
||||||
|
"milceryRainbowSwirl": "Tres Sabores",
|
||||||
|
"eiscue": "Cara de Hielo",
|
||||||
"eiscueNoIce": "Cara Deshielo",
|
"eiscueNoIce": "Cara Deshielo",
|
||||||
"indeedeeMale": "Macho",
|
"indeedeeMale": "Macho",
|
||||||
"indeedeeFemale": "Hembra",
|
"indeedeeFemale": "Hembra",
|
||||||
"morpekoFullBelly": "Saciada",
|
"morpekoFullBelly": "Saciada",
|
||||||
|
"morpekoHangry": "Voraz",
|
||||||
"zacianHeroOfManyBattles": "Guerrero avezado",
|
"zacianHeroOfManyBattles": "Guerrero avezado",
|
||||||
|
"zacianCrowned": "Espada Suprema",
|
||||||
"zamazentaHeroOfManyBattles": "Guerrero avezado",
|
"zamazentaHeroOfManyBattles": "Guerrero avezado",
|
||||||
|
"zamazentaCrowned": "Escudo Supremo",
|
||||||
|
"kubfuSingleStrike": "Estilo Brusco",
|
||||||
|
"kubfuRapidStrike": "Estilo Fluido",
|
||||||
|
"zarude": "Normal",
|
||||||
"zarudeDada": "Papá",
|
"zarudeDada": "Papá",
|
||||||
|
"calyrex": "Normal",
|
||||||
|
"calyrexIce": "Jinete Glacial",
|
||||||
|
"calyrexShadow": "Jinete Espectral",
|
||||||
|
"basculinMale": "Macho",
|
||||||
|
"basculinFemale": "Hembra",
|
||||||
"enamorusIncarnate": "Avatar",
|
"enamorusIncarnate": "Avatar",
|
||||||
|
"enamorusTherian": "Tótem",
|
||||||
|
"lechonkMale": "Macho",
|
||||||
|
"lechonkFemale": "Hembra",
|
||||||
|
"tandemausFour": "Familia de Cuatro",
|
||||||
|
"tandemausThree": "Familia de Tres",
|
||||||
"squawkabillyGreenPlumage": "Plumaje Verde",
|
"squawkabillyGreenPlumage": "Plumaje Verde",
|
||||||
"squawkabillyBluePlumage": "Plumaje Azul",
|
"squawkabillyBluePlumage": "Plumaje Azul",
|
||||||
"squawkabillyYellowPlumage": "Plumaje Amarillo",
|
"squawkabillyYellowPlumage": "Plumaje Amarillo",
|
||||||
"squawkabillyWhitePlumage": "Plumaje Blanco",
|
"squawkabillyWhitePlumage": "Plumaje Blanco",
|
||||||
|
"finizenZero": "Ingenua",
|
||||||
|
"finizenHero": "Heroica",
|
||||||
"tatsugiriCurly": "Curvada",
|
"tatsugiriCurly": "Curvada",
|
||||||
"tatsugiriDroopy": "Lánguida",
|
"tatsugiriDroopy": "Lánguida",
|
||||||
"tatsugiriStretchy": "Estirada",
|
"tatsugiriStretchy": "Estirada",
|
||||||
|
"dunsparceTwo": "Binodular",
|
||||||
|
"dunsparceThree": "Trinodular",
|
||||||
"gimmighoulChest": "Cofre",
|
"gimmighoulChest": "Cofre",
|
||||||
"gimmighoulRoaming": "Andante",
|
"gimmighoulRoaming": "Andante",
|
||||||
"koraidonApexBuild": "Forma Plena",
|
"koraidonApexBuild": "Forma Plena",
|
||||||
@ -164,6 +269,21 @@
|
|||||||
"miraidonGlideMode": "Modo Planeo",
|
"miraidonGlideMode": "Modo Planeo",
|
||||||
"poltchageistCounterfeit": "Fraudulenta",
|
"poltchageistCounterfeit": "Fraudulenta",
|
||||||
"poltchageistArtisan": "Opulenta",
|
"poltchageistArtisan": "Opulenta",
|
||||||
|
"poltchageistUnremarkable": "Mediocre",
|
||||||
|
"poltchageistMasterpiece": "Exquisita",
|
||||||
|
"ogerponTealMask": "Máscara Turquesa",
|
||||||
|
"ogerponTealMaskTera": "Máscara Turquesa Teracristal",
|
||||||
|
"ogerponWellspringMask": "Máscara Fuente",
|
||||||
|
"ogerponWellspringMaskTera": "Máscara Fuente Teracristal",
|
||||||
|
"ogerponHearthflameMask": "Máscara Horno",
|
||||||
|
"ogerponHearthflameMaskTera": "Máscara Horno Teracristal",
|
||||||
|
"ogerponCornerstoneMask": "Máscara Cimiento",
|
||||||
|
"ogerponCornerstoneMaskTera": "Máscara Cimiento Teracristal",
|
||||||
|
"terpagos": "Normal",
|
||||||
|
"terpagosTerastal": "Teracristal",
|
||||||
|
"terpagosStellar": "Astral",
|
||||||
|
"galarDarumaka": "Modo Normal",
|
||||||
|
"galarDarumakaZen": "Modo Daruma",
|
||||||
"paldeaTaurosCombat": "Combatiente",
|
"paldeaTaurosCombat": "Combatiente",
|
||||||
"paldeaTaurosBlaze": "Ardiente",
|
"paldeaTaurosBlaze": "Ardiente",
|
||||||
"paldeaTaurosAqua": "Acuático"
|
"paldeaTaurosAqua": "Acuático"
|
||||||
|
@ -98,5 +98,8 @@
|
|||||||
"youngster": "Joven",
|
"youngster": "Joven",
|
||||||
"aether_grunt": "Empleado de la Fundación Æther",
|
"aether_grunt": "Empleado de la Fundación Æther",
|
||||||
"aether_grunt_female": "Empleada de la Fundación Æther",
|
"aether_grunt_female": "Empleada de la Fundación Æther",
|
||||||
"aether_grunts": "Empleados de la Fundación Æther"
|
"aether_grunts": "Empleados de la Fundación Æther",
|
||||||
|
"star_grunt": "Star Grunt",
|
||||||
|
"star_grunt_female": "Star Grunt",
|
||||||
|
"star_grunts": "Star Grunts"
|
||||||
}
|
}
|
||||||
|
@ -138,6 +138,15 @@
|
|||||||
"rood": "Ruga",
|
"rood": "Ruga",
|
||||||
"xerosic": "Xero",
|
"xerosic": "Xero",
|
||||||
"bryony": "Begonia",
|
"bryony": "Begonia",
|
||||||
|
"faba": "Fabio",
|
||||||
|
"plumeria": "Francine",
|
||||||
|
"oleana": "Olivia",
|
||||||
|
"giacomo": "Anán",
|
||||||
|
"mela": "Melo",
|
||||||
|
"atticus": "Henzo",
|
||||||
|
"ortega": "Gus",
|
||||||
|
"eri": "Erin",
|
||||||
|
|
||||||
"maxie": "Magno",
|
"maxie": "Magno",
|
||||||
"archie": "Aquiles",
|
"archie": "Aquiles",
|
||||||
"cyrus": "Helio",
|
"cyrus": "Helio",
|
||||||
@ -145,6 +154,10 @@
|
|||||||
"lysandre": "Lysson",
|
"lysandre": "Lysson",
|
||||||
"faba": "Fabio",
|
"faba": "Fabio",
|
||||||
"lusamine": "Samina",
|
"lusamine": "Samina",
|
||||||
|
"guzma": "Guzmán",
|
||||||
|
"rose": "Rose",
|
||||||
|
"cassiopeia": "Noa",
|
||||||
|
|
||||||
"blue_red_double": "Azul y Rojo",
|
"blue_red_double": "Azul y Rojo",
|
||||||
"red_blue_double": "Rojo y Azul",
|
"red_blue_double": "Rojo y Azul",
|
||||||
"tate_liza_double": "Vito y Leti",
|
"tate_liza_double": "Vito y Leti",
|
||||||
|