mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-06-21 09:02:47 +02:00
[Misc] Improve enum naming (#5933)
* Rename `Abilities` to `AbilityId` * Rename `abilities.ts` to `ability-id.ts` * Rename `Moves` to `MoveId` * Rename `moves.ts` to `move-id.ts` * Rename `Species` to `SpeciesId` * Rename `species.ts` to `species-id.ts` * Rename `Biome` to `BiomeId` * Rename `biome.ts` to `biome-id.ts` * Replace `Abilities` with `AbilityId` in comments * Replace `Biome` with `BiomeId` in comments * Replace `Moves` with `MoveId` in comments * Replace `Species` with `SpeciesId` in comments
This commit is contained in:
parent
dd2f475ded
commit
9dcb904649
@ -129,12 +129,12 @@ import { ArenaFlyout } from "#app/ui/arena-flyout";
|
|||||||
import { EaseType } from "#enums/ease-type";
|
import { EaseType } from "#enums/ease-type";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { BattleStyle } from "#enums/battle-style";
|
import { BattleStyle } from "#enums/battle-style";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import type { ExpNotification } from "#enums/exp-notification";
|
import type { ExpNotification } from "#enums/exp-notification";
|
||||||
import { MoneyFormat } from "#enums/money-format";
|
import { MoneyFormat } from "#enums/money-format";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { UiTheme } from "#enums/ui-theme";
|
import { UiTheme } from "#enums/ui-theme";
|
||||||
import { TimedEventManager } from "#app/timed-event-manager";
|
import { TimedEventManager } from "#app/timed-event-manager";
|
||||||
import type { PokemonAnimType } from "#enums/pokemon-anim-type";
|
import type { PokemonAnimType } from "#enums/pokemon-anim-type";
|
||||||
@ -707,14 +707,14 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
ui.setup();
|
ui.setup();
|
||||||
|
|
||||||
const defaultMoves = [Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE];
|
const defaultMoves = [MoveId.TACKLE, MoveId.TAIL_WHIP, MoveId.FOCUS_ENERGY, MoveId.STRUGGLE];
|
||||||
|
|
||||||
Promise.all([
|
Promise.all([
|
||||||
Promise.all(loadPokemonAssets),
|
Promise.all(loadPokemonAssets),
|
||||||
initCommonAnims().then(() => loadCommonAnimAssets(true)),
|
initCommonAnims().then(() => loadCommonAnimAssets(true)),
|
||||||
Promise.all([Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE].map(m => initMoveAnim(m))).then(
|
Promise.all(
|
||||||
() => loadMoveAnimAssets(defaultMoves, true),
|
[MoveId.TACKLE, MoveId.TAIL_WHIP, MoveId.FOCUS_ENERGY, MoveId.STRUGGLE].map(m => initMoveAnim(m)),
|
||||||
),
|
).then(() => loadMoveAnimAssets(defaultMoves, true)),
|
||||||
this.initStarterColors(),
|
this.initStarterColors(),
|
||||||
]).then(() => {
|
]).then(() => {
|
||||||
this.pushPhase(new LoginPhase());
|
this.pushPhase(new LoginPhase());
|
||||||
@ -1225,7 +1225,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
[this.luckLabelText, this.luckText].map(t => t.setVisible(false));
|
[this.luckLabelText, this.luckText].map(t => t.setVisible(false));
|
||||||
|
|
||||||
this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN);
|
this.newArena(Overrides.STARTING_BIOME_OVERRIDE || BiomeId.TOWN);
|
||||||
|
|
||||||
this.field.setVisible(true);
|
this.field.setVisible(true);
|
||||||
|
|
||||||
@ -1501,7 +1501,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
pokemon.resetTera();
|
pokemon.resetTera();
|
||||||
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon);
|
applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon);
|
||||||
if (
|
if (
|
||||||
pokemon.hasSpecies(Species.TERAPAGOS) ||
|
pokemon.hasSpecies(SpeciesId.TERAPAGOS) ||
|
||||||
(this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190)
|
(this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190)
|
||||||
) {
|
) {
|
||||||
this.arena.playerTerasUsed = 0;
|
this.arena.playerTerasUsed = 0;
|
||||||
@ -1532,8 +1532,8 @@ export default class BattleScene extends SceneBase {
|
|||||||
return this.currentBattle;
|
return this.currentBattle;
|
||||||
}
|
}
|
||||||
|
|
||||||
newArena(biome: Biome, playerFaints?: number): Arena {
|
newArena(biome: BiomeId, playerFaints?: number): Arena {
|
||||||
this.arena = new Arena(biome, Biome[biome].toLowerCase(), playerFaints);
|
this.arena = new Arena(biome, BiomeId[biome].toLowerCase(), playerFaints);
|
||||||
this.eventTarget.dispatchEvent(new NewArenaEvent());
|
this.eventTarget.dispatchEvent(new NewArenaEvent());
|
||||||
|
|
||||||
this.arenaBg.pipelineData = {
|
this.arenaBg.pipelineData = {
|
||||||
@ -1599,7 +1599,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
!isNullOrUndefined(this.currentBattle.trainer) &&
|
!isNullOrUndefined(this.currentBattle.trainer) &&
|
||||||
this.currentBattle.trainer.config.hasSpecialtyType()
|
this.currentBattle.trainer.config.hasSpecialtyType()
|
||||||
) {
|
) {
|
||||||
if (species.speciesId === Species.WORMADAM) {
|
if (species.speciesId === SpeciesId.WORMADAM) {
|
||||||
switch (this.currentBattle.trainer.config.specialtyType) {
|
switch (this.currentBattle.trainer.config.specialtyType) {
|
||||||
case PokemonType.GROUND:
|
case PokemonType.GROUND:
|
||||||
return 1; // Sandy Cloak
|
return 1; // Sandy Cloak
|
||||||
@ -1609,7 +1609,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
return 0; // Plant Cloak
|
return 0; // Plant Cloak
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (species.speciesId === Species.ROTOM) {
|
if (species.speciesId === SpeciesId.ROTOM) {
|
||||||
switch (this.currentBattle.trainer.config.specialtyType) {
|
switch (this.currentBattle.trainer.config.specialtyType) {
|
||||||
case PokemonType.FLYING:
|
case PokemonType.FLYING:
|
||||||
return 4; // Fan Rotom
|
return 4; // Fan Rotom
|
||||||
@ -1625,7 +1625,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
return 3; // Frost Rotom
|
return 3; // Frost Rotom
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (species.speciesId === Species.ORICORIO) {
|
if (species.speciesId === SpeciesId.ORICORIO) {
|
||||||
switch (this.currentBattle.trainer.config.specialtyType) {
|
switch (this.currentBattle.trainer.config.specialtyType) {
|
||||||
case PokemonType.GHOST:
|
case PokemonType.GHOST:
|
||||||
return 3; // Sensu Style
|
return 3; // Sensu Style
|
||||||
@ -1637,7 +1637,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
return 2; // Pa'u Style
|
return 2; // Pa'u Style
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (species.speciesId === Species.PALDEA_TAUROS) {
|
if (species.speciesId === SpeciesId.PALDEA_TAUROS) {
|
||||||
switch (this.currentBattle.trainer.config.specialtyType) {
|
switch (this.currentBattle.trainer.config.specialtyType) {
|
||||||
case PokemonType.FIRE:
|
case PokemonType.FIRE:
|
||||||
return 1; // Blaze Breed
|
return 1; // Blaze Breed
|
||||||
@ -1645,41 +1645,41 @@ export default class BattleScene extends SceneBase {
|
|||||||
return 2; // Aqua Breed
|
return 2; // Aqua Breed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) {
|
if (species.speciesId === SpeciesId.SILVALLY || species.speciesId === SpeciesId.ARCEUS) {
|
||||||
// Would probably never happen, but might as well
|
// Would probably never happen, but might as well
|
||||||
return this.currentBattle.trainer.config.specialtyType;
|
return this.currentBattle.trainer.config.specialtyType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (species.speciesId) {
|
switch (species.speciesId) {
|
||||||
case Species.UNOWN:
|
case SpeciesId.UNOWN:
|
||||||
case Species.SHELLOS:
|
case SpeciesId.SHELLOS:
|
||||||
case Species.GASTRODON:
|
case SpeciesId.GASTRODON:
|
||||||
case Species.BASCULIN:
|
case SpeciesId.BASCULIN:
|
||||||
case Species.DEERLING:
|
case SpeciesId.DEERLING:
|
||||||
case Species.SAWSBUCK:
|
case SpeciesId.SAWSBUCK:
|
||||||
case Species.SCATTERBUG:
|
case SpeciesId.SCATTERBUG:
|
||||||
case Species.SPEWPA:
|
case SpeciesId.SPEWPA:
|
||||||
case Species.VIVILLON:
|
case SpeciesId.VIVILLON:
|
||||||
case Species.FLABEBE:
|
case SpeciesId.FLABEBE:
|
||||||
case Species.FLOETTE:
|
case SpeciesId.FLOETTE:
|
||||||
case Species.FLORGES:
|
case SpeciesId.FLORGES:
|
||||||
case Species.FURFROU:
|
case SpeciesId.FURFROU:
|
||||||
case Species.PUMPKABOO:
|
case SpeciesId.PUMPKABOO:
|
||||||
case Species.GOURGEIST:
|
case SpeciesId.GOURGEIST:
|
||||||
case Species.ORICORIO:
|
case SpeciesId.ORICORIO:
|
||||||
case Species.MAGEARNA:
|
case SpeciesId.MAGEARNA:
|
||||||
case Species.ZARUDE:
|
case SpeciesId.ZARUDE:
|
||||||
case Species.SQUAWKABILLY:
|
case SpeciesId.SQUAWKABILLY:
|
||||||
case Species.TATSUGIRI:
|
case SpeciesId.TATSUGIRI:
|
||||||
case Species.PALDEA_TAUROS:
|
case SpeciesId.PALDEA_TAUROS:
|
||||||
return randSeedInt(species.forms.length);
|
return randSeedInt(species.forms.length);
|
||||||
case Species.PIKACHU:
|
case SpeciesId.PIKACHU:
|
||||||
if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30) {
|
if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30) {
|
||||||
return 0; // Ban Cosplay and Partner Pika from Trainers before wave 30
|
return 0; // Ban Cosplay and Partner Pika from Trainers before wave 30
|
||||||
}
|
}
|
||||||
return randSeedInt(8);
|
return randSeedInt(8);
|
||||||
case Species.EEVEE:
|
case SpeciesId.EEVEE:
|
||||||
if (
|
if (
|
||||||
this.currentBattle?.battleType === BattleType.TRAINER &&
|
this.currentBattle?.battleType === BattleType.TRAINER &&
|
||||||
this.currentBattle?.waveIndex < 30 &&
|
this.currentBattle?.waveIndex < 30 &&
|
||||||
@ -1688,27 +1688,27 @@ export default class BattleScene extends SceneBase {
|
|||||||
return 0; // No Partner Eevee for Wave 12 Preschoolers
|
return 0; // No Partner Eevee for Wave 12 Preschoolers
|
||||||
}
|
}
|
||||||
return randSeedInt(2);
|
return randSeedInt(2);
|
||||||
case Species.FROAKIE:
|
case SpeciesId.FROAKIE:
|
||||||
case Species.FROGADIER:
|
case SpeciesId.FROGADIER:
|
||||||
case Species.GRENINJA:
|
case SpeciesId.GRENINJA:
|
||||||
if (this.currentBattle?.battleType === BattleType.TRAINER && !isEggPhase) {
|
if (this.currentBattle?.battleType === BattleType.TRAINER && !isEggPhase) {
|
||||||
return 0; // Don't give trainers Battle Bond Greninja, Froakie or Frogadier
|
return 0; // Don't give trainers Battle Bond Greninja, Froakie or Frogadier
|
||||||
}
|
}
|
||||||
return randSeedInt(2);
|
return randSeedInt(2);
|
||||||
case Species.URSHIFU:
|
case SpeciesId.URSHIFU:
|
||||||
return randSeedInt(2);
|
return randSeedInt(2);
|
||||||
case Species.ZYGARDE:
|
case SpeciesId.ZYGARDE:
|
||||||
return randSeedInt(4);
|
return randSeedInt(4);
|
||||||
case Species.MINIOR:
|
case SpeciesId.MINIOR:
|
||||||
return randSeedInt(7);
|
return randSeedInt(7);
|
||||||
case Species.ALCREMIE:
|
case SpeciesId.ALCREMIE:
|
||||||
return randSeedInt(9);
|
return randSeedInt(9);
|
||||||
case Species.MEOWSTIC:
|
case SpeciesId.MEOWSTIC:
|
||||||
case Species.INDEEDEE:
|
case SpeciesId.INDEEDEE:
|
||||||
case Species.BASCULEGION:
|
case SpeciesId.BASCULEGION:
|
||||||
case Species.OINKOLOGNE:
|
case SpeciesId.OINKOLOGNE:
|
||||||
return gender === Gender.FEMALE ? 1 : 0;
|
return gender === Gender.FEMALE ? 1 : 0;
|
||||||
case Species.TOXTRICITY: {
|
case SpeciesId.TOXTRICITY: {
|
||||||
const lowkeyNatures = [
|
const lowkeyNatures = [
|
||||||
Nature.LONELY,
|
Nature.LONELY,
|
||||||
Nature.BOLD,
|
Nature.BOLD,
|
||||||
@ -1728,7 +1728,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case Species.GIMMIGHOUL:
|
case SpeciesId.GIMMIGHOUL:
|
||||||
// Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs
|
// Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs
|
||||||
if (this.gameMode.hasMysteryEncounters && !isEggPhase) {
|
if (this.gameMode.hasMysteryEncounters && !isEggPhase) {
|
||||||
return 1; // Wandering form
|
return 1; // Wandering form
|
||||||
@ -1738,10 +1738,10 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
if (ignoreArena) {
|
if (ignoreArena) {
|
||||||
switch (species.speciesId) {
|
switch (species.speciesId) {
|
||||||
case Species.BURMY:
|
case SpeciesId.BURMY:
|
||||||
case Species.WORMADAM:
|
case SpeciesId.WORMADAM:
|
||||||
case Species.ROTOM:
|
case SpeciesId.ROTOM:
|
||||||
case Species.LYCANROC:
|
case SpeciesId.LYCANROC:
|
||||||
return randSeedInt(species.forms.length);
|
return randSeedInt(species.forms.length);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -2172,10 +2172,10 @@ export default class BattleScene extends SceneBase {
|
|||||||
return filteredSpecies[randSeedInt(filteredSpecies.length)];
|
return filteredSpecies[randSeedInt(filteredSpecies.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
generateRandomBiome(waveIndex: number): Biome {
|
generateRandomBiome(waveIndex: number): BiomeId {
|
||||||
const relWave = waveIndex % 250;
|
const relWave = waveIndex % 250;
|
||||||
const biomes = getEnumValues(Biome).filter(b => b !== Biome.TOWN && b !== Biome.END);
|
const biomes = getEnumValues(BiomeId).filter(b => b !== BiomeId.TOWN && b !== BiomeId.END);
|
||||||
const maxDepth = biomeDepths[Biome.END][0] - 2;
|
const maxDepth = biomeDepths[BiomeId.END][0] - 2;
|
||||||
const depthWeights = new Array(maxDepth + 1)
|
const depthWeights = new Array(maxDepth + 1)
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map((_, i: number) => ((1 - Math.min(Math.abs(i / (maxDepth - 1) - relWave / 250) + 0.25, 1)) / 0.75) * 250);
|
.map((_, i: number) => ((1 - Math.min(Math.abs(i / (maxDepth - 1) - relWave / 250) + 0.25, 1)) / 0.75) * 250);
|
||||||
@ -3475,7 +3475,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon),
|
fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon),
|
||||||
);
|
);
|
||||||
let matchingFormChange: SpeciesFormChange | null;
|
let matchingFormChange: SpeciesFormChange | null;
|
||||||
if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) {
|
if (pokemon.species.speciesId === SpeciesId.NECROZMA && matchingFormChangeOpts.length > 1) {
|
||||||
// Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves.
|
// Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves.
|
||||||
const formChangeItemModifiers = (
|
const formChangeItemModifiers = (
|
||||||
this.findModifiers(
|
this.findModifiers(
|
||||||
|
184
src/battle.ts
184
src/battle.ts
@ -19,10 +19,10 @@ import type { EnemyPokemon, PlayerPokemon, TurnMove } from "#app/field/pokemon";
|
|||||||
import type Pokemon from "#app/field/pokemon";
|
import type Pokemon from "#app/field/pokemon";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
import { MusicPreference } from "#app/system/settings/settings";
|
import { MusicPreference } from "#app/system/settings/settings";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import i18next from "#app/plugins/i18n";
|
import i18next from "#app/plugins/i18n";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
@ -78,7 +78,7 @@ export default class Battle {
|
|||||||
public battleScore = 0;
|
public battleScore = 0;
|
||||||
public postBattleLoot: PokemonHeldItemModifier[] = [];
|
public postBattleLoot: PokemonHeldItemModifier[] = [];
|
||||||
public escapeAttempts = 0;
|
public escapeAttempts = 0;
|
||||||
public lastMove: Moves;
|
public lastMove: MoveId;
|
||||||
public battleSeed: string = randomString(16, true);
|
public battleSeed: string = randomString(16, true);
|
||||||
private battleSeedState: string | null = null;
|
private battleSeedState: string | null = null;
|
||||||
public moneyScattered = 0;
|
public moneyScattered = 0;
|
||||||
@ -264,14 +264,14 @@ export default class Battle {
|
|||||||
if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) {
|
if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) {
|
||||||
if (globalScene.musicPreference === MusicPreference.GENFIVE) {
|
if (globalScene.musicPreference === MusicPreference.GENFIVE) {
|
||||||
switch (pokemon.species.speciesId) {
|
switch (pokemon.species.speciesId) {
|
||||||
case Species.REGIROCK:
|
case SpeciesId.REGIROCK:
|
||||||
case Species.REGICE:
|
case SpeciesId.REGICE:
|
||||||
case Species.REGISTEEL:
|
case SpeciesId.REGISTEEL:
|
||||||
case Species.REGIGIGAS:
|
case SpeciesId.REGIGIGAS:
|
||||||
case Species.REGIDRAGO:
|
case SpeciesId.REGIDRAGO:
|
||||||
case Species.REGIELEKI:
|
case SpeciesId.REGIELEKI:
|
||||||
return "battle_legendary_regis_g5";
|
return "battle_legendary_regis_g5";
|
||||||
case Species.KYUREM:
|
case SpeciesId.KYUREM:
|
||||||
return "battle_legendary_kyurem";
|
return "battle_legendary_kyurem";
|
||||||
default:
|
default:
|
||||||
if (pokemon.species.legendary) {
|
if (pokemon.species.legendary) {
|
||||||
@ -282,80 +282,80 @@ export default class Battle {
|
|||||||
}
|
}
|
||||||
if (globalScene.musicPreference === MusicPreference.ALLGENS) {
|
if (globalScene.musicPreference === MusicPreference.ALLGENS) {
|
||||||
switch (pokemon.species.speciesId) {
|
switch (pokemon.species.speciesId) {
|
||||||
case Species.ARTICUNO:
|
case SpeciesId.ARTICUNO:
|
||||||
case Species.ZAPDOS:
|
case SpeciesId.ZAPDOS:
|
||||||
case Species.MOLTRES:
|
case SpeciesId.MOLTRES:
|
||||||
case Species.MEWTWO:
|
case SpeciesId.MEWTWO:
|
||||||
case Species.MEW:
|
case SpeciesId.MEW:
|
||||||
return "battle_legendary_kanto";
|
return "battle_legendary_kanto";
|
||||||
case Species.RAIKOU:
|
case SpeciesId.RAIKOU:
|
||||||
return "battle_legendary_raikou";
|
return "battle_legendary_raikou";
|
||||||
case Species.ENTEI:
|
case SpeciesId.ENTEI:
|
||||||
return "battle_legendary_entei";
|
return "battle_legendary_entei";
|
||||||
case Species.SUICUNE:
|
case SpeciesId.SUICUNE:
|
||||||
return "battle_legendary_suicune";
|
return "battle_legendary_suicune";
|
||||||
case Species.LUGIA:
|
case SpeciesId.LUGIA:
|
||||||
return "battle_legendary_lugia";
|
return "battle_legendary_lugia";
|
||||||
case Species.HO_OH:
|
case SpeciesId.HO_OH:
|
||||||
return "battle_legendary_ho_oh";
|
return "battle_legendary_ho_oh";
|
||||||
case Species.REGIROCK:
|
case SpeciesId.REGIROCK:
|
||||||
case Species.REGICE:
|
case SpeciesId.REGICE:
|
||||||
case Species.REGISTEEL:
|
case SpeciesId.REGISTEEL:
|
||||||
case Species.REGIGIGAS:
|
case SpeciesId.REGIGIGAS:
|
||||||
case Species.REGIDRAGO:
|
case SpeciesId.REGIDRAGO:
|
||||||
case Species.REGIELEKI:
|
case SpeciesId.REGIELEKI:
|
||||||
return "battle_legendary_regis_g6";
|
return "battle_legendary_regis_g6";
|
||||||
case Species.GROUDON:
|
case SpeciesId.GROUDON:
|
||||||
case Species.KYOGRE:
|
case SpeciesId.KYOGRE:
|
||||||
return "battle_legendary_gro_kyo";
|
return "battle_legendary_gro_kyo";
|
||||||
case Species.RAYQUAZA:
|
case SpeciesId.RAYQUAZA:
|
||||||
return "battle_legendary_rayquaza";
|
return "battle_legendary_rayquaza";
|
||||||
case Species.DEOXYS:
|
case SpeciesId.DEOXYS:
|
||||||
return "battle_legendary_deoxys";
|
return "battle_legendary_deoxys";
|
||||||
case Species.UXIE:
|
case SpeciesId.UXIE:
|
||||||
case Species.MESPRIT:
|
case SpeciesId.MESPRIT:
|
||||||
case Species.AZELF:
|
case SpeciesId.AZELF:
|
||||||
return "battle_legendary_lake_trio";
|
return "battle_legendary_lake_trio";
|
||||||
case Species.HEATRAN:
|
case SpeciesId.HEATRAN:
|
||||||
case Species.CRESSELIA:
|
case SpeciesId.CRESSELIA:
|
||||||
case Species.DARKRAI:
|
case SpeciesId.DARKRAI:
|
||||||
case Species.SHAYMIN:
|
case SpeciesId.SHAYMIN:
|
||||||
return "battle_legendary_sinnoh";
|
return "battle_legendary_sinnoh";
|
||||||
case Species.DIALGA:
|
case SpeciesId.DIALGA:
|
||||||
case Species.PALKIA:
|
case SpeciesId.PALKIA:
|
||||||
if (pokemon.species.getFormSpriteKey(pokemon.formIndex) === SpeciesFormKey.ORIGIN) {
|
if (pokemon.species.getFormSpriteKey(pokemon.formIndex) === SpeciesFormKey.ORIGIN) {
|
||||||
return "battle_legendary_origin_forme";
|
return "battle_legendary_origin_forme";
|
||||||
}
|
}
|
||||||
return "battle_legendary_dia_pal";
|
return "battle_legendary_dia_pal";
|
||||||
case Species.GIRATINA:
|
case SpeciesId.GIRATINA:
|
||||||
return "battle_legendary_giratina";
|
return "battle_legendary_giratina";
|
||||||
case Species.ARCEUS:
|
case SpeciesId.ARCEUS:
|
||||||
return "battle_legendary_arceus";
|
return "battle_legendary_arceus";
|
||||||
case Species.COBALION:
|
case SpeciesId.COBALION:
|
||||||
case Species.TERRAKION:
|
case SpeciesId.TERRAKION:
|
||||||
case Species.VIRIZION:
|
case SpeciesId.VIRIZION:
|
||||||
case Species.KELDEO:
|
case SpeciesId.KELDEO:
|
||||||
case Species.TORNADUS:
|
case SpeciesId.TORNADUS:
|
||||||
case Species.LANDORUS:
|
case SpeciesId.LANDORUS:
|
||||||
case Species.THUNDURUS:
|
case SpeciesId.THUNDURUS:
|
||||||
case Species.MELOETTA:
|
case SpeciesId.MELOETTA:
|
||||||
case Species.GENESECT:
|
case SpeciesId.GENESECT:
|
||||||
return "battle_legendary_unova";
|
return "battle_legendary_unova";
|
||||||
case Species.KYUREM:
|
case SpeciesId.KYUREM:
|
||||||
return "battle_legendary_kyurem";
|
return "battle_legendary_kyurem";
|
||||||
case Species.XERNEAS:
|
case SpeciesId.XERNEAS:
|
||||||
case Species.YVELTAL:
|
case SpeciesId.YVELTAL:
|
||||||
case Species.ZYGARDE:
|
case SpeciesId.ZYGARDE:
|
||||||
return "battle_legendary_xern_yvel";
|
return "battle_legendary_xern_yvel";
|
||||||
case Species.TAPU_KOKO:
|
case SpeciesId.TAPU_KOKO:
|
||||||
case Species.TAPU_LELE:
|
case SpeciesId.TAPU_LELE:
|
||||||
case Species.TAPU_BULU:
|
case SpeciesId.TAPU_BULU:
|
||||||
case Species.TAPU_FINI:
|
case SpeciesId.TAPU_FINI:
|
||||||
return "battle_legendary_tapu";
|
return "battle_legendary_tapu";
|
||||||
case Species.SOLGALEO:
|
case SpeciesId.SOLGALEO:
|
||||||
case Species.LUNALA:
|
case SpeciesId.LUNALA:
|
||||||
return "battle_legendary_sol_lun";
|
return "battle_legendary_sol_lun";
|
||||||
case Species.NECROZMA:
|
case SpeciesId.NECROZMA:
|
||||||
switch (pokemon.getFormKey()) {
|
switch (pokemon.getFormKey()) {
|
||||||
case "dusk-mane":
|
case "dusk-mane":
|
||||||
case "dawn-wings":
|
case "dawn-wings":
|
||||||
@ -365,50 +365,50 @@ export default class Battle {
|
|||||||
default:
|
default:
|
||||||
return "battle_legendary_sol_lun";
|
return "battle_legendary_sol_lun";
|
||||||
}
|
}
|
||||||
case Species.NIHILEGO:
|
case SpeciesId.NIHILEGO:
|
||||||
case Species.PHEROMOSA:
|
case SpeciesId.PHEROMOSA:
|
||||||
case Species.BUZZWOLE:
|
case SpeciesId.BUZZWOLE:
|
||||||
case Species.XURKITREE:
|
case SpeciesId.XURKITREE:
|
||||||
case Species.CELESTEELA:
|
case SpeciesId.CELESTEELA:
|
||||||
case Species.KARTANA:
|
case SpeciesId.KARTANA:
|
||||||
case Species.GUZZLORD:
|
case SpeciesId.GUZZLORD:
|
||||||
case Species.POIPOLE:
|
case SpeciesId.POIPOLE:
|
||||||
case Species.NAGANADEL:
|
case SpeciesId.NAGANADEL:
|
||||||
case Species.STAKATAKA:
|
case SpeciesId.STAKATAKA:
|
||||||
case Species.BLACEPHALON:
|
case SpeciesId.BLACEPHALON:
|
||||||
return "battle_legendary_ub";
|
return "battle_legendary_ub";
|
||||||
case Species.ZACIAN:
|
case SpeciesId.ZACIAN:
|
||||||
case Species.ZAMAZENTA:
|
case SpeciesId.ZAMAZENTA:
|
||||||
return "battle_legendary_zac_zam";
|
return "battle_legendary_zac_zam";
|
||||||
case Species.GLASTRIER:
|
case SpeciesId.GLASTRIER:
|
||||||
case Species.SPECTRIER:
|
case SpeciesId.SPECTRIER:
|
||||||
return "battle_legendary_glas_spec";
|
return "battle_legendary_glas_spec";
|
||||||
case Species.CALYREX:
|
case SpeciesId.CALYREX:
|
||||||
if (pokemon.getFormKey() === "ice" || pokemon.getFormKey() === "shadow") {
|
if (pokemon.getFormKey() === "ice" || pokemon.getFormKey() === "shadow") {
|
||||||
return "battle_legendary_riders";
|
return "battle_legendary_riders";
|
||||||
}
|
}
|
||||||
return "battle_legendary_calyrex";
|
return "battle_legendary_calyrex";
|
||||||
case Species.GALAR_ARTICUNO:
|
case SpeciesId.GALAR_ARTICUNO:
|
||||||
case Species.GALAR_ZAPDOS:
|
case SpeciesId.GALAR_ZAPDOS:
|
||||||
case Species.GALAR_MOLTRES:
|
case SpeciesId.GALAR_MOLTRES:
|
||||||
return "battle_legendary_birds_galar";
|
return "battle_legendary_birds_galar";
|
||||||
case Species.WO_CHIEN:
|
case SpeciesId.WO_CHIEN:
|
||||||
case Species.CHIEN_PAO:
|
case SpeciesId.CHIEN_PAO:
|
||||||
case Species.TING_LU:
|
case SpeciesId.TING_LU:
|
||||||
case Species.CHI_YU:
|
case SpeciesId.CHI_YU:
|
||||||
return "battle_legendary_ruinous";
|
return "battle_legendary_ruinous";
|
||||||
case Species.KORAIDON:
|
case SpeciesId.KORAIDON:
|
||||||
case Species.MIRAIDON:
|
case SpeciesId.MIRAIDON:
|
||||||
return "battle_legendary_kor_mir";
|
return "battle_legendary_kor_mir";
|
||||||
case Species.OKIDOGI:
|
case SpeciesId.OKIDOGI:
|
||||||
case Species.MUNKIDORI:
|
case SpeciesId.MUNKIDORI:
|
||||||
case Species.FEZANDIPITI:
|
case SpeciesId.FEZANDIPITI:
|
||||||
return "battle_legendary_loyal_three";
|
return "battle_legendary_loyal_three";
|
||||||
case Species.OGERPON:
|
case SpeciesId.OGERPON:
|
||||||
return "battle_legendary_ogerpon";
|
return "battle_legendary_ogerpon";
|
||||||
case Species.TERAPAGOS:
|
case SpeciesId.TERAPAGOS:
|
||||||
return "battle_legendary_terapagos";
|
return "battle_legendary_terapagos";
|
||||||
case Species.PECHARUNT:
|
case SpeciesId.PECHARUNT:
|
||||||
return "battle_legendary_pecharunt";
|
return "battle_legendary_pecharunt";
|
||||||
default:
|
default:
|
||||||
if (pokemon.species.legendary) {
|
if (pokemon.species.legendary) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import type { AbAttrCondition } from "#app/@types/ability-types";
|
import type { AbAttrCondition } from "#app/@types/ability-types";
|
||||||
import type { AbAttr } from "#app/data/abilities/ab-attrs/ab-attr";
|
import type { AbAttr } from "#app/data/abilities/ab-attrs/ab-attr";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
@ -6,7 +6,7 @@ import type { Localizable } from "#app/interfaces/locales";
|
|||||||
import type { Constructor } from "#app/utils/common";
|
import type { Constructor } from "#app/utils/common";
|
||||||
|
|
||||||
export class Ability implements Localizable {
|
export class Ability implements Localizable {
|
||||||
public id: Abilities;
|
public id: AbilityId;
|
||||||
|
|
||||||
private nameAppend: string;
|
private nameAppend: string;
|
||||||
public name: string;
|
public name: string;
|
||||||
@ -20,7 +20,7 @@ export class Ability implements Localizable {
|
|||||||
public attrs: AbAttr[];
|
public attrs: AbAttr[];
|
||||||
public conditions: AbAttrCondition[];
|
public conditions: AbAttrCondition[];
|
||||||
|
|
||||||
constructor(id: Abilities, generation: number) {
|
constructor(id: AbilityId, generation: number) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
|
||||||
this.nameAppend = "";
|
this.nameAppend = "";
|
||||||
@ -39,7 +39,7 @@ export class Ability implements Localizable {
|
|||||||
return this.isCopiable && this.isReplaceable;
|
return this.isCopiable && this.isReplaceable;
|
||||||
}
|
}
|
||||||
localize(): void {
|
localize(): void {
|
||||||
const i18nKey = Abilities[this.id]
|
const i18nKey = AbilityId[this.id]
|
||||||
.split("_")
|
.split("_")
|
||||||
.filter(f => f)
|
.filter(f => f)
|
||||||
.map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()))
|
.map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()))
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -22,10 +22,10 @@ import {
|
|||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims";
|
import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
||||||
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
|
||||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||||
@ -41,7 +41,7 @@ export abstract class ArenaTag {
|
|||||||
constructor(
|
constructor(
|
||||||
public tagType: ArenaTagType,
|
public tagType: ArenaTagType,
|
||||||
public turnCount: number,
|
public turnCount: number,
|
||||||
public sourceMove?: Moves,
|
public sourceMove?: MoveId,
|
||||||
public sourceId?: number,
|
public sourceId?: number,
|
||||||
public side: ArenaTagSide = ArenaTagSide.BOTH,
|
public side: ArenaTagSide = ArenaTagSide.BOTH,
|
||||||
) {}
|
) {}
|
||||||
@ -116,7 +116,7 @@ export abstract class ArenaTag {
|
|||||||
*/
|
*/
|
||||||
export class MistTag extends ArenaTag {
|
export class MistTag extends ArenaTag {
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side);
|
super(ArenaTagType.MIST, turnCount, MoveId.MIST, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(arena: Arena, quiet = false): void {
|
onAdd(arena: Arena, quiet = false): void {
|
||||||
@ -188,7 +188,7 @@ export class WeakenMoveScreenTag extends ArenaTag {
|
|||||||
constructor(
|
constructor(
|
||||||
tagType: ArenaTagType,
|
tagType: ArenaTagType,
|
||||||
turnCount: number,
|
turnCount: number,
|
||||||
sourceMove: Moves,
|
sourceMove: MoveId,
|
||||||
sourceId: number,
|
sourceId: number,
|
||||||
side: ArenaTagSide,
|
side: ArenaTagSide,
|
||||||
weakenedCategories: MoveCategory[],
|
weakenedCategories: MoveCategory[],
|
||||||
@ -230,11 +230,11 @@ export class WeakenMoveScreenTag extends ArenaTag {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Reduces the damage of physical moves.
|
* Reduces the damage of physical moves.
|
||||||
* Used by {@linkcode Moves.REFLECT}
|
* Used by {@linkcode MoveId.REFLECT}
|
||||||
*/
|
*/
|
||||||
class ReflectTag extends WeakenMoveScreenTag {
|
class ReflectTag extends WeakenMoveScreenTag {
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]);
|
super(ArenaTagType.REFLECT, turnCount, MoveId.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena, quiet = false): void {
|
onAdd(_arena: Arena, quiet = false): void {
|
||||||
@ -250,11 +250,11 @@ class ReflectTag extends WeakenMoveScreenTag {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Reduces the damage of special moves.
|
* Reduces the damage of special moves.
|
||||||
* Used by {@linkcode Moves.LIGHT_SCREEN}
|
* Used by {@linkcode MoveId.LIGHT_SCREEN}
|
||||||
*/
|
*/
|
||||||
class LightScreenTag extends WeakenMoveScreenTag {
|
class LightScreenTag extends WeakenMoveScreenTag {
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]);
|
super(ArenaTagType.LIGHT_SCREEN, turnCount, MoveId.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena, quiet = false): void {
|
onAdd(_arena: Arena, quiet = false): void {
|
||||||
@ -270,11 +270,11 @@ class LightScreenTag extends WeakenMoveScreenTag {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Reduces the damage of physical and special moves.
|
* Reduces the damage of physical and special moves.
|
||||||
* Used by {@linkcode Moves.AURORA_VEIL}
|
* Used by {@linkcode MoveId.AURORA_VEIL}
|
||||||
*/
|
*/
|
||||||
class AuroraVeilTag extends WeakenMoveScreenTag {
|
class AuroraVeilTag extends WeakenMoveScreenTag {
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [
|
super(ArenaTagType.AURORA_VEIL, turnCount, MoveId.AURORA_VEIL, sourceId, side, [
|
||||||
MoveCategory.SPECIAL,
|
MoveCategory.SPECIAL,
|
||||||
MoveCategory.PHYSICAL,
|
MoveCategory.PHYSICAL,
|
||||||
]);
|
]);
|
||||||
@ -291,7 +291,7 @@ class AuroraVeilTag extends WeakenMoveScreenTag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProtectConditionFunc = (arena: Arena, moveId: Moves) => boolean;
|
type ProtectConditionFunc = (arena: Arena, moveId: MoveId) => boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to implement conditional team protection
|
* Class to implement conditional team protection
|
||||||
@ -305,7 +305,7 @@ export class ConditionalProtectTag extends ArenaTag {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
tagType: ArenaTagType,
|
tagType: ArenaTagType,
|
||||||
sourceMove: Moves,
|
sourceMove: MoveId,
|
||||||
sourceId: number,
|
sourceId: number,
|
||||||
side: ArenaTagSide,
|
side: ArenaTagSide,
|
||||||
condition: ProtectConditionFunc,
|
condition: ProtectConditionFunc,
|
||||||
@ -337,7 +337,7 @@ export class ConditionalProtectTag extends ArenaTag {
|
|||||||
* @param isProtected a {@linkcode BooleanHolder} used to flag if the move is protected against
|
* @param isProtected a {@linkcode BooleanHolder} used to flag if the move is protected against
|
||||||
* @param _attacker the attacking {@linkcode Pokemon}
|
* @param _attacker the attacking {@linkcode Pokemon}
|
||||||
* @param defender the defending {@linkcode Pokemon}
|
* @param defender the defending {@linkcode Pokemon}
|
||||||
* @param moveId the {@linkcode Moves | identifier} for the move being used
|
* @param moveId the {@linkcode MoveId | identifier} for the move being used
|
||||||
* @param ignoresProtectBypass a {@linkcode BooleanHolder} used to flag if a protection effect supercedes effects that ignore protection
|
* @param ignoresProtectBypass a {@linkcode BooleanHolder} used to flag if a protection effect supercedes effects that ignore protection
|
||||||
* @returns `true` if this tag protected against the attack; `false` otherwise
|
* @returns `true` if this tag protected against the attack; `false` otherwise
|
||||||
*/
|
*/
|
||||||
@ -347,7 +347,7 @@ export class ConditionalProtectTag extends ArenaTag {
|
|||||||
isProtected: BooleanHolder,
|
isProtected: BooleanHolder,
|
||||||
_attacker: Pokemon,
|
_attacker: Pokemon,
|
||||||
defender: Pokemon,
|
defender: Pokemon,
|
||||||
moveId: Moves,
|
moveId: MoveId,
|
||||||
ignoresProtectBypass: BooleanHolder,
|
ignoresProtectBypass: BooleanHolder,
|
||||||
): boolean {
|
): boolean {
|
||||||
if ((this.side === ArenaTagSide.PLAYER) === defender.isPlayer() && this.protectConditionFunc(arena, moveId)) {
|
if ((this.side === ArenaTagSide.PLAYER) === defender.isPlayer() && this.protectConditionFunc(arena, moveId)) {
|
||||||
@ -375,7 +375,7 @@ export class ConditionalProtectTag extends ArenaTag {
|
|||||||
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard's}
|
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard's}
|
||||||
* protection effect.
|
* protection effect.
|
||||||
* @param _arena {@linkcode Arena} The arena containing the protection effect
|
* @param _arena {@linkcode Arena} The arena containing the protection effect
|
||||||
* @param moveId {@linkcode Moves} The move to check against this condition
|
* @param moveId {@linkcode MoveId} The move to check against this condition
|
||||||
* @returns `true` if the incoming move's priority is greater than 0.
|
* @returns `true` if the incoming move's priority is greater than 0.
|
||||||
* This includes moves with modified priorities from abilities (e.g. Prankster)
|
* This includes moves with modified priorities from abilities (e.g. Prankster)
|
||||||
*/
|
*/
|
||||||
@ -398,7 +398,7 @@ const QuickGuardConditionFunc: ProtectConditionFunc = (_arena, moveId) => {
|
|||||||
*/
|
*/
|
||||||
class QuickGuardTag extends ConditionalProtectTag {
|
class QuickGuardTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.QUICK_GUARD, Moves.QUICK_GUARD, sourceId, side, QuickGuardConditionFunc);
|
super(ArenaTagType.QUICK_GUARD, MoveId.QUICK_GUARD, sourceId, side, QuickGuardConditionFunc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,7 +406,7 @@ class QuickGuardTag extends ConditionalProtectTag {
|
|||||||
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard's}
|
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard's}
|
||||||
* protection effect.
|
* protection effect.
|
||||||
* @param _arena {@linkcode Arena} The arena containing the protection effect
|
* @param _arena {@linkcode Arena} The arena containing the protection effect
|
||||||
* @param moveId {@linkcode Moves} The move to check against this condition
|
* @param moveId {@linkcode MoveId} The move to check against this condition
|
||||||
* @returns `true` if the incoming move is multi-targeted (even if it's only used against one Pokemon).
|
* @returns `true` if the incoming move is multi-targeted (even if it's only used against one Pokemon).
|
||||||
*/
|
*/
|
||||||
const WideGuardConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => {
|
const WideGuardConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => {
|
||||||
@ -429,7 +429,7 @@ const WideGuardConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean =
|
|||||||
*/
|
*/
|
||||||
class WideGuardTag extends ConditionalProtectTag {
|
class WideGuardTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.WIDE_GUARD, Moves.WIDE_GUARD, sourceId, side, WideGuardConditionFunc);
|
super(ArenaTagType.WIDE_GUARD, MoveId.WIDE_GUARD, sourceId, side, WideGuardConditionFunc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,7 +437,7 @@ class WideGuardTag extends ConditionalProtectTag {
|
|||||||
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block's}
|
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block's}
|
||||||
* protection effect.
|
* protection effect.
|
||||||
* @param _arena {@linkcode Arena} The arena containing the protection effect.
|
* @param _arena {@linkcode Arena} The arena containing the protection effect.
|
||||||
* @param moveId {@linkcode Moves} The move to check against this condition.
|
* @param moveId {@linkcode MoveId} The move to check against this condition.
|
||||||
* @returns `true` if the incoming move is not a Status move.
|
* @returns `true` if the incoming move is not a Status move.
|
||||||
*/
|
*/
|
||||||
const MatBlockConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => {
|
const MatBlockConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => {
|
||||||
@ -451,7 +451,7 @@ const MatBlockConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean =>
|
|||||||
*/
|
*/
|
||||||
class MatBlockTag extends ConditionalProtectTag {
|
class MatBlockTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, MatBlockConditionFunc);
|
super(ArenaTagType.MAT_BLOCK, MoveId.MAT_BLOCK, sourceId, side, MatBlockConditionFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena) {
|
onAdd(_arena: Arena) {
|
||||||
@ -474,7 +474,7 @@ class MatBlockTag extends ConditionalProtectTag {
|
|||||||
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield's}
|
* Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield's}
|
||||||
* protection effect.
|
* protection effect.
|
||||||
* @param _arena {@linkcode Arena} The arena containing the protection effect
|
* @param _arena {@linkcode Arena} The arena containing the protection effect
|
||||||
* @param moveId {@linkcode Moves} The move to check against this condition
|
* @param moveId {@linkcode MoveId} The move to check against this condition
|
||||||
* @returns `true` if the incoming move is a Status move, is not a hazard, and does not target all
|
* @returns `true` if the incoming move is a Status move, is not a hazard, and does not target all
|
||||||
* Pokemon or sides of the field.
|
* Pokemon or sides of the field.
|
||||||
*/
|
*/
|
||||||
@ -495,7 +495,7 @@ const CraftyShieldConditionFunc: ProtectConditionFunc = (_arena, moveId) => {
|
|||||||
*/
|
*/
|
||||||
class CraftyShieldTag extends ConditionalProtectTag {
|
class CraftyShieldTag extends ConditionalProtectTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true);
|
super(ArenaTagType.CRAFTY_SHIELD, MoveId.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,11 +507,11 @@ export class NoCritTag extends ArenaTag {
|
|||||||
/**
|
/**
|
||||||
* Constructor method for the NoCritTag class
|
* Constructor method for the NoCritTag class
|
||||||
* @param turnCount `number` the number of turns this effect lasts
|
* @param turnCount `number` the number of turns this effect lasts
|
||||||
* @param sourceMove {@linkcode Moves} the move that created this effect
|
* @param sourceMove {@linkcode MoveId} the move that created this effect
|
||||||
* @param sourceId `number` the ID of the {@linkcode Pokemon} that created this effect
|
* @param sourceId `number` the ID of the {@linkcode Pokemon} that created this effect
|
||||||
* @param side {@linkcode ArenaTagSide} the side to which this effect belongs
|
* @param side {@linkcode ArenaTagSide} the side to which this effect belongs
|
||||||
*/
|
*/
|
||||||
constructor(turnCount: number, sourceMove: Moves, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceMove: MoveId, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.NO_CRIT, turnCount, sourceMove, sourceId, side);
|
super(ArenaTagType.NO_CRIT, turnCount, sourceMove, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -546,7 +546,7 @@ class WishTag extends ArenaTag {
|
|||||||
private healHp: number;
|
private healHp: number;
|
||||||
|
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.WISH, turnCount, Moves.WISH, sourceId, side);
|
super(ArenaTagType.WISH, turnCount, MoveId.WISH, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
@ -588,7 +588,7 @@ export class WeakenMoveTypeTag extends ArenaTag {
|
|||||||
* @param sourceMove - The move that created the tag.
|
* @param sourceMove - The move that created the tag.
|
||||||
* @param sourceId - The ID of the source of the tag.
|
* @param sourceId - The ID of the source of the tag.
|
||||||
*/
|
*/
|
||||||
constructor(tagType: ArenaTagType, turnCount: number, type: PokemonType, sourceMove: Moves, sourceId: number) {
|
constructor(tagType: ArenaTagType, turnCount: number, type: PokemonType, sourceMove: MoveId, sourceId: number) {
|
||||||
super(tagType, turnCount, sourceMove, sourceId);
|
super(tagType, turnCount, sourceMove, sourceId);
|
||||||
|
|
||||||
this.weakenedType = type;
|
this.weakenedType = type;
|
||||||
@ -617,7 +617,7 @@ export class WeakenMoveTypeTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class MudSportTag extends WeakenMoveTypeTag {
|
class MudSportTag extends WeakenMoveTypeTag {
|
||||||
constructor(turnCount: number, sourceId: number) {
|
constructor(turnCount: number, sourceId: number) {
|
||||||
super(ArenaTagType.MUD_SPORT, turnCount, PokemonType.ELECTRIC, Moves.MUD_SPORT, sourceId);
|
super(ArenaTagType.MUD_SPORT, turnCount, PokemonType.ELECTRIC, MoveId.MUD_SPORT, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
@ -635,7 +635,7 @@ class MudSportTag extends WeakenMoveTypeTag {
|
|||||||
*/
|
*/
|
||||||
class WaterSportTag extends WeakenMoveTypeTag {
|
class WaterSportTag extends WeakenMoveTypeTag {
|
||||||
constructor(turnCount: number, sourceId: number) {
|
constructor(turnCount: number, sourceId: number) {
|
||||||
super(ArenaTagType.WATER_SPORT, turnCount, PokemonType.FIRE, Moves.WATER_SPORT, sourceId);
|
super(ArenaTagType.WATER_SPORT, turnCount, PokemonType.FIRE, MoveId.WATER_SPORT, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
@ -653,7 +653,7 @@ class WaterSportTag extends WeakenMoveTypeTag {
|
|||||||
* Converts Normal-type moves to Electric type for the rest of the turn.
|
* Converts Normal-type moves to Electric type for the rest of the turn.
|
||||||
*/
|
*/
|
||||||
export class IonDelugeTag extends ArenaTag {
|
export class IonDelugeTag extends ArenaTag {
|
||||||
constructor(sourceMove?: Moves) {
|
constructor(sourceMove?: MoveId) {
|
||||||
super(ArenaTagType.ION_DELUGE, 1, sourceMove);
|
super(ArenaTagType.ION_DELUGE, 1, sourceMove);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -696,7 +696,7 @@ export class ArenaTrapTag extends ArenaTag {
|
|||||||
* @param side - The side (player or enemy) the tag affects.
|
* @param side - The side (player or enemy) the tag affects.
|
||||||
* @param maxLayers - The maximum amount of layers this tag can have.
|
* @param maxLayers - The maximum amount of layers this tag can have.
|
||||||
*/
|
*/
|
||||||
constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: number, side: ArenaTagSide, maxLayers: number) {
|
constructor(tagType: ArenaTagType, sourceMove: MoveId, sourceId: number, side: ArenaTagSide, maxLayers: number) {
|
||||||
super(tagType, 0, sourceMove, sourceId, side);
|
super(tagType, 0, sourceMove, sourceId, side);
|
||||||
|
|
||||||
this.layers = 1;
|
this.layers = 1;
|
||||||
@ -750,7 +750,7 @@ export class ArenaTrapTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class SpikesTag extends ArenaTrapTag {
|
class SpikesTag extends ArenaTrapTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3);
|
super(ArenaTagType.SPIKES, MoveId.SPIKES, sourceId, side, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(arena: Arena, quiet = false): void {
|
onAdd(arena: Arena, quiet = false): void {
|
||||||
@ -802,7 +802,7 @@ class ToxicSpikesTag extends ArenaTrapTag {
|
|||||||
private neutralized: boolean;
|
private neutralized: boolean;
|
||||||
|
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.TOXIC_SPIKES, Moves.TOXIC_SPIKES, sourceId, side, 2);
|
super(ArenaTagType.TOXIC_SPIKES, MoveId.TOXIC_SPIKES, sourceId, side, 2);
|
||||||
this.neutralized = false;
|
this.neutralized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -867,7 +867,7 @@ class ToxicSpikesTag extends ArenaTrapTag {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Arena Tag class for delayed attacks, such as {@linkcode Moves.FUTURE_SIGHT} or {@linkcode Moves.DOOM_DESIRE}.
|
* Arena Tag class for delayed attacks, such as {@linkcode MoveId.FUTURE_SIGHT} or {@linkcode MoveId.DOOM_DESIRE}.
|
||||||
* Delays the attack's effect by a set amount of turns, usually 3 (including the turn the move is used),
|
* Delays the attack's effect by a set amount of turns, usually 3 (including the turn the move is used),
|
||||||
* and deals damage after the turn count is reached.
|
* and deals damage after the turn count is reached.
|
||||||
*/
|
*/
|
||||||
@ -876,7 +876,7 @@ export class DelayedAttackTag extends ArenaTag {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
tagType: ArenaTagType,
|
tagType: ArenaTagType,
|
||||||
sourceMove: Moves | undefined,
|
sourceMove: MoveId | undefined,
|
||||||
sourceId: number,
|
sourceId: number,
|
||||||
targetIndex: BattlerIndex,
|
targetIndex: BattlerIndex,
|
||||||
side: ArenaTagSide = ArenaTagSide.BOTH,
|
side: ArenaTagSide = ArenaTagSide.BOTH,
|
||||||
@ -909,7 +909,7 @@ export class DelayedAttackTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class StealthRockTag extends ArenaTrapTag {
|
class StealthRockTag extends ArenaTrapTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1);
|
super(ArenaTagType.STEALTH_ROCK, MoveId.STEALTH_ROCK, sourceId, side, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(arena: Arena, quiet = false): void {
|
onAdd(arena: Arena, quiet = false): void {
|
||||||
@ -994,7 +994,7 @@ class StealthRockTag extends ArenaTrapTag {
|
|||||||
*/
|
*/
|
||||||
class StickyWebTag extends ArenaTrapTag {
|
class StickyWebTag extends ArenaTrapTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1);
|
super(ArenaTagType.STICKY_WEB, MoveId.STICKY_WEB, sourceId, side, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(arena: Arena, quiet = false): void {
|
onAdd(arena: Arena, quiet = false): void {
|
||||||
@ -1055,7 +1055,7 @@ class StickyWebTag extends ArenaTrapTag {
|
|||||||
*/
|
*/
|
||||||
export class TrickRoomTag extends ArenaTag {
|
export class TrickRoomTag extends ArenaTag {
|
||||||
constructor(turnCount: number, sourceId: number) {
|
constructor(turnCount: number, sourceId: number) {
|
||||||
super(ArenaTagType.TRICK_ROOM, turnCount, Moves.TRICK_ROOM, sourceId);
|
super(ArenaTagType.TRICK_ROOM, turnCount, MoveId.TRICK_ROOM, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1090,11 +1090,11 @@ export class TrickRoomTag extends ArenaTag {
|
|||||||
/**
|
/**
|
||||||
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) Gravity}.
|
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) Gravity}.
|
||||||
* Grounds all Pokémon on the field, including Flying-types and those with
|
* Grounds all Pokémon on the field, including Flying-types and those with
|
||||||
* {@linkcode Abilities.LEVITATE} for the duration of the arena tag, usually 5 turns.
|
* {@linkcode AbilityId.LEVITATE} for the duration of the arena tag, usually 5 turns.
|
||||||
*/
|
*/
|
||||||
export class GravityTag extends ArenaTag {
|
export class GravityTag extends ArenaTag {
|
||||||
constructor(turnCount: number) {
|
constructor(turnCount: number) {
|
||||||
super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY);
|
super(ArenaTagType.GRAVITY, turnCount, MoveId.GRAVITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
@ -1122,7 +1122,7 @@ export class GravityTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class TailwindTag extends ArenaTag {
|
class TailwindTag extends ArenaTag {
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side);
|
super(ArenaTagType.TAILWIND, turnCount, MoveId.TAILWIND, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena, quiet = false): void {
|
onAdd(_arena: Arena, quiet = false): void {
|
||||||
@ -1139,7 +1139,7 @@ class TailwindTag extends ArenaTag {
|
|||||||
|
|
||||||
for (const pokemon of party) {
|
for (const pokemon of party) {
|
||||||
// Apply the CHARGED tag to party members with the WIND_POWER ability
|
// Apply the CHARGED tag to party members with the WIND_POWER ability
|
||||||
if (pokemon.hasAbility(Abilities.WIND_POWER) && !pokemon.getTag(BattlerTagType.CHARGED)) {
|
if (pokemon.hasAbility(AbilityId.WIND_POWER) && !pokemon.getTag(BattlerTagType.CHARGED)) {
|
||||||
pokemon.addTag(BattlerTagType.CHARGED);
|
pokemon.addTag(BattlerTagType.CHARGED);
|
||||||
globalScene.queueMessage(
|
globalScene.queueMessage(
|
||||||
i18next.t("abilityTriggers:windPowerCharged", {
|
i18next.t("abilityTriggers:windPowerCharged", {
|
||||||
@ -1150,7 +1150,7 @@ class TailwindTag extends ArenaTag {
|
|||||||
}
|
}
|
||||||
// Raise attack by one stage if party member has WIND_RIDER ability
|
// Raise attack by one stage if party member has WIND_RIDER ability
|
||||||
// TODO: Ability displays should be handled by the ability
|
// TODO: Ability displays should be handled by the ability
|
||||||
if (pokemon.hasAbility(Abilities.WIND_RIDER)) {
|
if (pokemon.hasAbility(AbilityId.WIND_RIDER)) {
|
||||||
globalScene.queueAbilityDisplay(pokemon, false, true);
|
globalScene.queueAbilityDisplay(pokemon, false, true);
|
||||||
globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.ATK], 1, true));
|
globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.ATK], 1, true));
|
||||||
globalScene.queueAbilityDisplay(pokemon, false, false);
|
globalScene.queueAbilityDisplay(pokemon, false, false);
|
||||||
@ -1171,11 +1171,11 @@ class TailwindTag extends ArenaTag {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Happy_Hour_(move) Happy Hour}.
|
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Happy_Hour_(move) Happy Hour}.
|
||||||
* Doubles the prize money from trainers and money moves like {@linkcode Moves.PAY_DAY} and {@linkcode Moves.MAKE_IT_RAIN}.
|
* Doubles the prize money from trainers and money moves like {@linkcode MoveId.PAY_DAY} and {@linkcode MoveId.MAKE_IT_RAIN}.
|
||||||
*/
|
*/
|
||||||
class HappyHourTag extends ArenaTag {
|
class HappyHourTag extends ArenaTag {
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side);
|
super(ArenaTagType.HAPPY_HOUR, turnCount, MoveId.HAPPY_HOUR, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
@ -1189,7 +1189,7 @@ class HappyHourTag extends ArenaTag {
|
|||||||
|
|
||||||
class SafeguardTag extends ArenaTag {
|
class SafeguardTag extends ArenaTag {
|
||||||
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side);
|
super(ArenaTagType.SAFEGUARD, turnCount, MoveId.SAFEGUARD, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
@ -1221,7 +1221,7 @@ class NoneTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class ImprisonTag extends ArenaTrapTag {
|
class ImprisonTag extends ArenaTrapTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.IMPRISON, Moves.IMPRISON, sourceId, side, 1);
|
super(ArenaTagType.IMPRISON, MoveId.IMPRISON, sourceId, side, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1234,7 +1234,7 @@ class ImprisonTag extends ArenaTrapTag {
|
|||||||
const party = this.getAffectedPokemon();
|
const party = this.getAffectedPokemon();
|
||||||
party?.forEach((p: Pokemon) => {
|
party?.forEach((p: Pokemon) => {
|
||||||
if (p.isAllowedInBattle()) {
|
if (p.isAllowedInBattle()) {
|
||||||
p.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId);
|
p.addTag(BattlerTagType.IMPRISON, 1, MoveId.IMPRISON, this.sourceId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
globalScene.queueMessage(
|
globalScene.queueMessage(
|
||||||
@ -1263,7 +1263,7 @@ class ImprisonTag extends ArenaTrapTag {
|
|||||||
override activateTrap(pokemon: Pokemon): boolean {
|
override activateTrap(pokemon: Pokemon): boolean {
|
||||||
const source = this.getSourcePokemon();
|
const source = this.getSourcePokemon();
|
||||||
if (source?.isActive(true) && pokemon.isAllowedInBattle()) {
|
if (source?.isActive(true) && pokemon.isAllowedInBattle()) {
|
||||||
pokemon.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId);
|
pokemon.addTag(BattlerTagType.IMPRISON, 1, MoveId.IMPRISON, this.sourceId);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1289,7 +1289,7 @@ class ImprisonTag extends ArenaTrapTag {
|
|||||||
*/
|
*/
|
||||||
class FireGrassPledgeTag extends ArenaTag {
|
class FireGrassPledgeTag extends ArenaTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.FIRE_GRASS_PLEDGE, 4, Moves.FIRE_PLEDGE, sourceId, side);
|
super(ArenaTagType.FIRE_GRASS_PLEDGE, 4, MoveId.FIRE_PLEDGE, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
override onAdd(_arena: Arena): void {
|
override onAdd(_arena: Arena): void {
|
||||||
@ -1334,7 +1334,7 @@ class FireGrassPledgeTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class WaterFirePledgeTag extends ArenaTag {
|
class WaterFirePledgeTag extends ArenaTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.WATER_FIRE_PLEDGE, 4, Moves.WATER_PLEDGE, sourceId, side);
|
super(ArenaTagType.WATER_FIRE_PLEDGE, 4, MoveId.WATER_PLEDGE, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
override onAdd(_arena: Arena): void {
|
override onAdd(_arena: Arena): void {
|
||||||
@ -1368,7 +1368,7 @@ class WaterFirePledgeTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class GrassWaterPledgeTag extends ArenaTag {
|
class GrassWaterPledgeTag extends ArenaTag {
|
||||||
constructor(sourceId: number, side: ArenaTagSide) {
|
constructor(sourceId: number, side: ArenaTagSide) {
|
||||||
super(ArenaTagType.GRASS_WATER_PLEDGE, 4, Moves.GRASS_PLEDGE, sourceId, side);
|
super(ArenaTagType.GRASS_WATER_PLEDGE, 4, MoveId.GRASS_PLEDGE, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
override onAdd(_arena: Arena): void {
|
override onAdd(_arena: Arena): void {
|
||||||
@ -1390,7 +1390,7 @@ class GrassWaterPledgeTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
export class FairyLockTag extends ArenaTag {
|
export class FairyLockTag extends ArenaTag {
|
||||||
constructor(turnCount: number, sourceId: number) {
|
constructor(turnCount: number, sourceId: number) {
|
||||||
super(ArenaTagType.FAIRY_LOCK, turnCount, Moves.FAIRY_LOCK, sourceId);
|
super(ArenaTagType.FAIRY_LOCK, turnCount, MoveId.FAIRY_LOCK, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
@ -1485,7 +1485,7 @@ export class SuppressAbilitiesTag extends ArenaTag {
|
|||||||
export function getArenaTag(
|
export function getArenaTag(
|
||||||
tagType: ArenaTagType,
|
tagType: ArenaTagType,
|
||||||
turnCount: number,
|
turnCount: number,
|
||||||
sourceMove: Moves | undefined,
|
sourceMove: MoveId | undefined,
|
||||||
sourceId: number,
|
sourceId: number,
|
||||||
targetIndex?: BattlerIndex,
|
targetIndex?: BattlerIndex,
|
||||||
side: ArenaTagSide = ArenaTagSide.BOTH,
|
side: ArenaTagSide = ArenaTagSide.BOTH,
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
export type SignatureSpecies = {
|
export type SignatureSpecies = {
|
||||||
[key in string]: (Species | Species[])[];
|
[key in string]: (SpeciesId | SpeciesId[])[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -18,87 +18,87 @@ export type SignatureSpecies = {
|
|||||||
*/
|
*/
|
||||||
export const signatureSpecies: SignatureSpecies = new Proxy({
|
export const signatureSpecies: SignatureSpecies = new Proxy({
|
||||||
// Gym Leaders- Kanto
|
// Gym Leaders- Kanto
|
||||||
BROCK: [Species.ONIX, Species.GEODUDE, [Species.OMANYTE, Species.KABUTO], Species.AERODACTYL],
|
BROCK: [SpeciesId.ONIX, SpeciesId.GEODUDE, [SpeciesId.OMANYTE, SpeciesId.KABUTO], SpeciesId.AERODACTYL],
|
||||||
MISTY: [Species.STARYU, Species.PSYDUCK, Species.WOOPER, Species.LAPRAS],
|
MISTY: [SpeciesId.STARYU, SpeciesId.PSYDUCK, SpeciesId.WOOPER, SpeciesId.LAPRAS],
|
||||||
LT_SURGE: [Species.PICHU, Species.VOLTORB, Species.ELEKID, Species.JOLTEON],
|
LT_SURGE: [SpeciesId.PICHU, SpeciesId.VOLTORB, SpeciesId.ELEKID, SpeciesId.JOLTEON],
|
||||||
ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP],
|
ERIKA: [SpeciesId.ODDISH, SpeciesId.BELLSPROUT, SpeciesId.TANGELA, SpeciesId.HOPPIP],
|
||||||
JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT, Species.KOFFING],
|
JANINE: [SpeciesId.VENONAT, SpeciesId.SPINARAK, SpeciesId.ZUBAT, SpeciesId.KOFFING],
|
||||||
SABRINA: [Species.ABRA, Species.MR_MIME, Species.SMOOCHUM, Species.ESPEON],
|
SABRINA: [SpeciesId.ABRA, SpeciesId.MR_MIME, SpeciesId.SMOOCHUM, SpeciesId.ESPEON],
|
||||||
BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGBY, Species.VULPIX],
|
BLAINE: [SpeciesId.GROWLITHE, SpeciesId.PONYTA, SpeciesId.MAGBY, SpeciesId.VULPIX],
|
||||||
GIOVANNI: [Species.RHYHORN, Species.MEOWTH, [Species.NIDORAN_F, Species.NIDORAN_M], Species.DIGLETT], // Tera Ground Meowth
|
GIOVANNI: [SpeciesId.RHYHORN, SpeciesId.MEOWTH, [SpeciesId.NIDORAN_F, SpeciesId.NIDORAN_M], SpeciesId.DIGLETT], // Tera Ground Meowth
|
||||||
// Gym Leaders- Johto
|
// Gym Leaders- Johto
|
||||||
FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.NATU, Species.MURKROW],
|
FALKNER: [SpeciesId.PIDGEY, SpeciesId.HOOTHOOT, SpeciesId.NATU, SpeciesId.MURKROW],
|
||||||
BUGSY: [Species.SCYTHER, Species.SHUCKLE, Species.YANMA, [Species.PINSIR, Species.HERACROSS]],
|
BUGSY: [SpeciesId.SCYTHER, SpeciesId.SHUCKLE, SpeciesId.YANMA, [SpeciesId.PINSIR, SpeciesId.HERACROSS]],
|
||||||
WHITNEY: [Species.MILTANK, Species.AIPOM, Species.IGGLYBUFF, [Species.GIRAFARIG, Species.STANTLER]],
|
WHITNEY: [SpeciesId.MILTANK, SpeciesId.AIPOM, SpeciesId.IGGLYBUFF, [SpeciesId.GIRAFARIG, SpeciesId.STANTLER]],
|
||||||
MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.DUSKULL, Species.SABLEYE],
|
MORTY: [SpeciesId.GASTLY, SpeciesId.MISDREAVUS, SpeciesId.DUSKULL, SpeciesId.SABLEYE],
|
||||||
CHUCK: [Species.POLIWRATH, Species.MANKEY, Species.TYROGUE, Species.MACHOP],
|
CHUCK: [SpeciesId.POLIWRATH, SpeciesId.MANKEY, SpeciesId.TYROGUE, SpeciesId.MACHOP],
|
||||||
JASMINE: [Species.STEELIX, Species.MAGNEMITE, Species.PINECO, Species.SKARMORY],
|
JASMINE: [SpeciesId.STEELIX, SpeciesId.MAGNEMITE, SpeciesId.PINECO, SpeciesId.SKARMORY],
|
||||||
PRYCE: [Species.SWINUB, Species.SEEL, Species.SHELLDER, Species.SNEASEL],
|
PRYCE: [SpeciesId.SWINUB, SpeciesId.SEEL, SpeciesId.SHELLDER, SpeciesId.SNEASEL],
|
||||||
CLAIR: [Species.HORSEA, Species.DRATINI, Species.MAGIKARP, Species.DRUDDIGON], // Tera Dragon Magikarp
|
CLAIR: [SpeciesId.HORSEA, SpeciesId.DRATINI, SpeciesId.MAGIKARP, SpeciesId.DRUDDIGON], // Tera Dragon Magikarp
|
||||||
// Gym Leaders- Hoenn
|
// Gym Leaders- Hoenn
|
||||||
ROXANNE: [Species.NOSEPASS, Species.GEODUDE, [Species.LILEEP, Species.ANORITH], Species.ARON],
|
ROXANNE: [SpeciesId.NOSEPASS, SpeciesId.GEODUDE, [SpeciesId.LILEEP, SpeciesId.ANORITH], SpeciesId.ARON],
|
||||||
BRAWLY: [Species.MAKUHITA, Species.MACHOP, Species.MEDITITE, Species.SHROOMISH],
|
BRAWLY: [SpeciesId.MAKUHITA, SpeciesId.MACHOP, SpeciesId.MEDITITE, SpeciesId.SHROOMISH],
|
||||||
WATTSON: [Species.ELECTRIKE, Species.VOLTORB, Species.MAGNEMITE, [Species.PLUSLE, Species.MINUN]],
|
WATTSON: [SpeciesId.ELECTRIKE, SpeciesId.VOLTORB, SpeciesId.MAGNEMITE, [SpeciesId.PLUSLE, SpeciesId.MINUN]],
|
||||||
FLANNERY: [Species.TORKOAL, Species.SLUGMA, Species.NUMEL, Species.HOUNDOUR],
|
FLANNERY: [SpeciesId.TORKOAL, SpeciesId.SLUGMA, SpeciesId.NUMEL, SpeciesId.HOUNDOUR],
|
||||||
NORMAN: [Species.SLAKOTH, Species.KECLEON, Species.WHISMUR, Species.ZANGOOSE],
|
NORMAN: [SpeciesId.SLAKOTH, SpeciesId.KECLEON, SpeciesId.WHISMUR, SpeciesId.ZANGOOSE],
|
||||||
WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY],
|
WINONA: [SpeciesId.SWABLU, SpeciesId.WINGULL, SpeciesId.TROPIUS, SpeciesId.SKARMORY],
|
||||||
TATE: [Species.SOLROCK, Species.NATU, Species.CHINGLING, Species.GALLADE],
|
TATE: [SpeciesId.SOLROCK, SpeciesId.NATU, SpeciesId.CHINGLING, SpeciesId.GALLADE],
|
||||||
LIZA: [Species.LUNATONE, Species.BALTOY, Species.SPOINK, Species.GARDEVOIR],
|
LIZA: [SpeciesId.LUNATONE, SpeciesId.BALTOY, SpeciesId.SPOINK, SpeciesId.GARDEVOIR],
|
||||||
JUAN: [Species.HORSEA, Species.SPHEAL, Species.BARBOACH, Species.CORPHISH],
|
JUAN: [SpeciesId.HORSEA, SpeciesId.SPHEAL, SpeciesId.BARBOACH, SpeciesId.CORPHISH],
|
||||||
// Gym Leaders- Sinnoh
|
// Gym Leaders- Sinnoh
|
||||||
ROARK: [Species.CRANIDOS, Species.GEODUDE, Species.NOSEPASS, Species.LARVITAR],
|
ROARK: [SpeciesId.CRANIDOS, SpeciesId.GEODUDE, SpeciesId.NOSEPASS, SpeciesId.LARVITAR],
|
||||||
GARDENIA: [Species.BUDEW, Species.CHERUBI, Species.TURTWIG, Species.LEAFEON],
|
GARDENIA: [SpeciesId.BUDEW, SpeciesId.CHERUBI, SpeciesId.TURTWIG, SpeciesId.LEAFEON],
|
||||||
MAYLENE: [Species.RIOLU, Species.MEDITITE, Species.CHIMCHAR, Species.CROAGUNK],
|
MAYLENE: [SpeciesId.RIOLU, SpeciesId.MEDITITE, SpeciesId.CHIMCHAR, SpeciesId.CROAGUNK],
|
||||||
CRASHER_WAKE: [Species.BUIZEL, Species.WOOPER, Species.PIPLUP, Species.MAGIKARP],
|
CRASHER_WAKE: [SpeciesId.BUIZEL, SpeciesId.WOOPER, SpeciesId.PIPLUP, SpeciesId.MAGIKARP],
|
||||||
FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.DUSKULL, Species.SPIRITOMB],
|
FANTINA: [SpeciesId.MISDREAVUS, SpeciesId.DRIFLOON, SpeciesId.DUSKULL, SpeciesId.SPIRITOMB],
|
||||||
BYRON: [Species.SHIELDON, Species.BRONZOR, Species.ARON, Species.SKARMORY],
|
BYRON: [SpeciesId.SHIELDON, SpeciesId.BRONZOR, SpeciesId.ARON, SpeciesId.SKARMORY],
|
||||||
CANDICE: [Species.FROSLASS, Species.SNOVER, Species.SNEASEL, Species.GLACEON],
|
CANDICE: [SpeciesId.FROSLASS, SpeciesId.SNOVER, SpeciesId.SNEASEL, SpeciesId.GLACEON],
|
||||||
VOLKNER: [Species.ELEKID, Species.SHINX, Species.CHINCHOU, Species.ROTOM],
|
VOLKNER: [SpeciesId.ELEKID, SpeciesId.SHINX, SpeciesId.CHINCHOU, SpeciesId.ROTOM],
|
||||||
// Gym Leaders- Unova
|
// Gym Leaders- Unova
|
||||||
CILAN: [Species.PANSAGE, Species.SNIVY, Species.MARACTUS, Species.FERROSEED],
|
CILAN: [SpeciesId.PANSAGE, SpeciesId.SNIVY, SpeciesId.MARACTUS, SpeciesId.FERROSEED],
|
||||||
CHILI: [Species.PANSEAR, Species.TEPIG, Species.HEATMOR, Species.DARUMAKA],
|
CHILI: [SpeciesId.PANSEAR, SpeciesId.TEPIG, SpeciesId.HEATMOR, SpeciesId.DARUMAKA],
|
||||||
CRESS: [Species.PANPOUR, Species.OSHAWOTT, Species.BASCULIN, Species.TYMPOLE],
|
CRESS: [SpeciesId.PANPOUR, SpeciesId.OSHAWOTT, SpeciesId.BASCULIN, SpeciesId.TYMPOLE],
|
||||||
CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE, Species.BOUFFALANT],
|
CHEREN: [SpeciesId.LILLIPUP, SpeciesId.MINCCINO, SpeciesId.PIDOVE, SpeciesId.BOUFFALANT],
|
||||||
LENORA: [Species.PATRAT, Species.DEERLING, Species.AUDINO, Species.BRAVIARY],
|
LENORA: [SpeciesId.PATRAT, SpeciesId.DEERLING, SpeciesId.AUDINO, SpeciesId.BRAVIARY],
|
||||||
ROXIE: [Species.VENIPEDE, Species.KOFFING, Species.TRUBBISH, Species.TOXEL],
|
ROXIE: [SpeciesId.VENIPEDE, SpeciesId.KOFFING, SpeciesId.TRUBBISH, SpeciesId.TOXEL],
|
||||||
BURGH: [Species.SEWADDLE, Species.DWEBBLE, [Species.KARRABLAST, Species.SHELMET], Species.DURANT],
|
BURGH: [SpeciesId.SEWADDLE, SpeciesId.DWEBBLE, [SpeciesId.KARRABLAST, SpeciesId.SHELMET], SpeciesId.DURANT],
|
||||||
ELESA: [Species.BLITZLE, Species.EMOLGA, Species.JOLTIK, Species.TYNAMO],
|
ELESA: [SpeciesId.BLITZLE, SpeciesId.EMOLGA, SpeciesId.JOLTIK, SpeciesId.TYNAMO],
|
||||||
CLAY: [Species.DRILBUR, Species.SANDILE, Species.TYMPOLE, Species.GOLETT],
|
CLAY: [SpeciesId.DRILBUR, SpeciesId.SANDILE, SpeciesId.TYMPOLE, SpeciesId.GOLETT],
|
||||||
SKYLA: [Species.DUCKLETT, Species.WOOBAT, [Species.RUFFLET, Species.VULLABY], Species.ARCHEN],
|
SKYLA: [SpeciesId.DUCKLETT, SpeciesId.WOOBAT, [SpeciesId.RUFFLET, SpeciesId.VULLABY], SpeciesId.ARCHEN],
|
||||||
BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO, Species.GALAR_DARUMAKA],
|
BRYCEN: [SpeciesId.CRYOGONAL, SpeciesId.VANILLITE, SpeciesId.CUBCHOO, SpeciesId.GALAR_DARUMAKA],
|
||||||
DRAYDEN: [Species.AXEW, Species.DRUDDIGON, Species.TRAPINCH, Species.DEINO],
|
DRAYDEN: [SpeciesId.AXEW, SpeciesId.DRUDDIGON, SpeciesId.TRAPINCH, SpeciesId.DEINO],
|
||||||
MARLON: [Species.FRILLISH, Species.TIRTOUGA, Species.WAILMER, Species.MANTYKE],
|
MARLON: [SpeciesId.FRILLISH, SpeciesId.TIRTOUGA, SpeciesId.WAILMER, SpeciesId.MANTYKE],
|
||||||
// Gym Leaders- Kalos
|
// Gym Leaders- Kalos
|
||||||
VIOLA: [Species.SCATTERBUG, Species.SURSKIT, Species.CUTIEFLY, Species.BLIPBUG],
|
VIOLA: [SpeciesId.SCATTERBUG, SpeciesId.SURSKIT, SpeciesId.CUTIEFLY, SpeciesId.BLIPBUG],
|
||||||
GRANT: [Species.TYRUNT, Species.AMAURA, Species.BINACLE, Species.DWEBBLE],
|
GRANT: [SpeciesId.TYRUNT, SpeciesId.AMAURA, SpeciesId.BINACLE, SpeciesId.DWEBBLE],
|
||||||
KORRINA: [Species.RIOLU, Species.MIENFOO, Species.HAWLUCHA, Species.PANCHAM],
|
KORRINA: [SpeciesId.RIOLU, SpeciesId.MIENFOO, SpeciesId.HAWLUCHA, SpeciesId.PANCHAM],
|
||||||
RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT, [Species.PHANTUMP, Species.PUMPKABOO]],
|
RAMOS: [SpeciesId.SKIDDO, SpeciesId.HOPPIP, SpeciesId.BELLSPROUT, [SpeciesId.PHANTUMP, SpeciesId.PUMPKABOO]],
|
||||||
CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.DEDENNE, Species.ROTOM],
|
CLEMONT: [SpeciesId.HELIOPTILE, SpeciesId.MAGNEMITE, SpeciesId.DEDENNE, SpeciesId.ROTOM],
|
||||||
VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME, [Species.SPRITZEE, Species.SWIRLIX]],
|
VALERIE: [SpeciesId.SYLVEON, SpeciesId.MAWILE, SpeciesId.MR_MIME, [SpeciesId.SPRITZEE, SpeciesId.SWIRLIX]],
|
||||||
OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.INKAY, Species.SLOWKING],
|
OLYMPIA: [SpeciesId.ESPURR, SpeciesId.SIGILYPH, SpeciesId.INKAY, SpeciesId.SLOWKING],
|
||||||
WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL, Species.SWINUB],
|
WULFRIC: [SpeciesId.BERGMITE, SpeciesId.SNOVER, SpeciesId.CRYOGONAL, SpeciesId.SWINUB],
|
||||||
// Gym Leaders- Galar
|
// Gym Leaders- Galar
|
||||||
MILO: [Species.GOSSIFLEUR, Species.SEEDOT, Species.APPLIN, Species.LOTAD],
|
MILO: [SpeciesId.GOSSIFLEUR, SpeciesId.SEEDOT, SpeciesId.APPLIN, SpeciesId.LOTAD],
|
||||||
NESSA: [Species.CHEWTLE, Species.WIMPOD, Species.ARROKUDA, Species.MAREANIE],
|
NESSA: [SpeciesId.CHEWTLE, SpeciesId.WIMPOD, SpeciesId.ARROKUDA, SpeciesId.MAREANIE],
|
||||||
KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.GROWLITHE, Species.TORKOAL],
|
KABU: [SpeciesId.SIZZLIPEDE, SpeciesId.VULPIX, SpeciesId.GROWLITHE, SpeciesId.TORKOAL],
|
||||||
BEA: [Species.MACHOP, Species.GALAR_FARFETCHD, Species.CLOBBOPUS, Species.FALINKS],
|
BEA: [SpeciesId.MACHOP, SpeciesId.GALAR_FARFETCHD, SpeciesId.CLOBBOPUS, SpeciesId.FALINKS],
|
||||||
ALLISTER: [Species.GASTLY, Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.SINISTEA],
|
ALLISTER: [SpeciesId.GASTLY, SpeciesId.GALAR_YAMASK, SpeciesId.GALAR_CORSOLA, SpeciesId.SINISTEA],
|
||||||
OPAL: [Species.MILCERY, Species.GALAR_WEEZING, Species.TOGEPI, Species.MAWILE],
|
OPAL: [SpeciesId.MILCERY, SpeciesId.GALAR_WEEZING, SpeciesId.TOGEPI, SpeciesId.MAWILE],
|
||||||
BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR, Species.SYLVEON],
|
BEDE: [SpeciesId.HATENNA, SpeciesId.GALAR_PONYTA, SpeciesId.GARDEVOIR, SpeciesId.SYLVEON],
|
||||||
GORDIE: [Species.ROLYCOLY, [Species.SHUCKLE, Species.BINACLE], Species.STONJOURNER, Species.LARVITAR],
|
GORDIE: [SpeciesId.ROLYCOLY, [SpeciesId.SHUCKLE, SpeciesId.BINACLE], SpeciesId.STONJOURNER, SpeciesId.LARVITAR],
|
||||||
MELONY: [Species.LAPRAS, Species.SNOM, Species.EISCUE, [Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA]],
|
MELONY: [SpeciesId.LAPRAS, SpeciesId.SNOM, SpeciesId.EISCUE, [SpeciesId.GALAR_MR_MIME, SpeciesId.GALAR_DARUMAKA]],
|
||||||
PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.TOXEL, Species.INKAY], // Tera Dark Toxel
|
PIERS: [SpeciesId.GALAR_ZIGZAGOON, SpeciesId.SCRAGGY, SpeciesId.TOXEL, SpeciesId.INKAY], // Tera Dark Toxel
|
||||||
MARNIE: [Species.IMPIDIMP, Species.MORPEKO, Species.PURRLOIN, Species.CROAGUNK], // Tera Dark Croagunk
|
MARNIE: [SpeciesId.IMPIDIMP, SpeciesId.MORPEKO, SpeciesId.PURRLOIN, SpeciesId.CROAGUNK], // Tera Dark Croagunk
|
||||||
RAIHAN: [Species.DURALUDON, Species.TRAPINCH, Species.GOOMY, Species.TURTONATOR],
|
RAIHAN: [SpeciesId.DURALUDON, SpeciesId.TRAPINCH, SpeciesId.GOOMY, SpeciesId.TURTONATOR],
|
||||||
// Gym Leaders- Paldea; First slot is Tera
|
// Gym Leaders- Paldea; First slot is Tera
|
||||||
KATY: [Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA, Species.RELLOR], // Tera Bug Teddiursa
|
KATY: [SpeciesId.TEDDIURSA, SpeciesId.NYMBLE, SpeciesId.TAROUNTULA, SpeciesId.RELLOR], // Tera Bug Teddiursa
|
||||||
BRASSIUS: [Species.BONSLY, Species.SMOLIV, Species.BRAMBLIN, Species.SUNKERN], // Tera Grass Bonsly
|
BRASSIUS: [SpeciesId.BONSLY, SpeciesId.SMOLIV, SpeciesId.BRAMBLIN, SpeciesId.SUNKERN], // Tera Grass Bonsly
|
||||||
IONO: [Species.MISDREAVUS, Species.TADBULB, Species.WATTREL, Species.MAGNEMITE], // Tera Ghost Misdreavus
|
IONO: [SpeciesId.MISDREAVUS, SpeciesId.TADBULB, SpeciesId.WATTREL, SpeciesId.MAGNEMITE], // Tera Ghost Misdreavus
|
||||||
KOFU: [Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL], // Tera Water Crabrawler
|
KOFU: [SpeciesId.CRABRAWLER, SpeciesId.VELUZA, SpeciesId.WIGLETT, SpeciesId.WINGULL], // Tera Water Crabrawler
|
||||||
LARRY: [Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA], // Tera Normal Starly
|
LARRY: [SpeciesId.STARLY, SpeciesId.DUNSPARCE, SpeciesId.LECHONK, SpeciesId.KOMALA], // Tera Normal Starly
|
||||||
RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel
|
RYME: [SpeciesId.TOXEL, SpeciesId.GREAVARD, SpeciesId.SHUPPET, SpeciesId.MIMIKYU], // Tera Ghost Toxel
|
||||||
TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe
|
TULIP: [SpeciesId.FLABEBE, SpeciesId.FLITTLE, SpeciesId.RALTS, SpeciesId.GIRAFARIG], // Tera Psychic Flabebe
|
||||||
GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.SNOM, Species.CUBCHOO], // Tera Ice Swablu
|
GRUSHA: [SpeciesId.SWABLU, SpeciesId.CETODDLE, SpeciesId.SNOM, SpeciesId.CUBCHOO], // Tera Ice Swablu
|
||||||
}, {
|
}, {
|
||||||
get(target, prop: string) {
|
get(target, prop: string) {
|
||||||
return target[prop as keyof SignatureSpecies] ?? [];
|
return target[prop as keyof SignatureSpecies] ?? [];
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of all {@link https://bulbapedia.bulbagarden.net/wiki/Paradox_Pok%C3%A9mon | Paradox Pokemon}, NOT including the legendaries Miraidon and Koraidon.
|
* A list of all {@link https://bulbapedia.bulbagarden.net/wiki/Paradox_Pok%C3%A9mon | Paradox Pokemon}, NOT including the legendaries Miraidon and Koraidon.
|
||||||
*/
|
*/
|
||||||
export const NON_LEGEND_PARADOX_POKEMON = [
|
export const NON_LEGEND_PARADOX_POKEMON = [
|
||||||
Species.GREAT_TUSK,
|
SpeciesId.GREAT_TUSK,
|
||||||
Species.SCREAM_TAIL,
|
SpeciesId.SCREAM_TAIL,
|
||||||
Species.BRUTE_BONNET,
|
SpeciesId.BRUTE_BONNET,
|
||||||
Species.FLUTTER_MANE,
|
SpeciesId.FLUTTER_MANE,
|
||||||
Species.SLITHER_WING,
|
SpeciesId.SLITHER_WING,
|
||||||
Species.SANDY_SHOCKS,
|
SpeciesId.SANDY_SHOCKS,
|
||||||
Species.ROARING_MOON,
|
SpeciesId.ROARING_MOON,
|
||||||
Species.WALKING_WAKE,
|
SpeciesId.WALKING_WAKE,
|
||||||
Species.GOUGING_FIRE,
|
SpeciesId.GOUGING_FIRE,
|
||||||
Species.RAGING_BOLT,
|
SpeciesId.RAGING_BOLT,
|
||||||
Species.IRON_TREADS,
|
SpeciesId.IRON_TREADS,
|
||||||
Species.IRON_BUNDLE,
|
SpeciesId.IRON_BUNDLE,
|
||||||
Species.IRON_HANDS,
|
SpeciesId.IRON_HANDS,
|
||||||
Species.IRON_JUGULIS,
|
SpeciesId.IRON_JUGULIS,
|
||||||
Species.IRON_MOTH,
|
SpeciesId.IRON_MOTH,
|
||||||
Species.IRON_THORNS,
|
SpeciesId.IRON_THORNS,
|
||||||
Species.IRON_VALIANT,
|
SpeciesId.IRON_VALIANT,
|
||||||
Species.IRON_LEAVES,
|
SpeciesId.IRON_LEAVES,
|
||||||
Species.IRON_BOULDER,
|
SpeciesId.IRON_BOULDER,
|
||||||
Species.IRON_CROWN,
|
SpeciesId.IRON_CROWN,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -32,15 +32,15 @@ export const NON_LEGEND_PARADOX_POKEMON = [
|
|||||||
* Note that all of these Ultra Beasts are still considered Sub-Legendary.
|
* Note that all of these Ultra Beasts are still considered Sub-Legendary.
|
||||||
*/
|
*/
|
||||||
export const NON_LEGEND_ULTRA_BEASTS = [
|
export const NON_LEGEND_ULTRA_BEASTS = [
|
||||||
Species.NIHILEGO,
|
SpeciesId.NIHILEGO,
|
||||||
Species.BUZZWOLE,
|
SpeciesId.BUZZWOLE,
|
||||||
Species.PHEROMOSA,
|
SpeciesId.PHEROMOSA,
|
||||||
Species.XURKITREE,
|
SpeciesId.XURKITREE,
|
||||||
Species.CELESTEELA,
|
SpeciesId.CELESTEELA,
|
||||||
Species.KARTANA,
|
SpeciesId.KARTANA,
|
||||||
Species.GUZZLORD,
|
SpeciesId.GUZZLORD,
|
||||||
Species.POIPOLE,
|
SpeciesId.POIPOLE,
|
||||||
Species.NAGANADEL,
|
SpeciesId.NAGANADEL,
|
||||||
Species.STAKATAKA,
|
SpeciesId.STAKATAKA,
|
||||||
Species.BLACEPHALON,
|
SpeciesId.BLACEPHALON,
|
||||||
];
|
];
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
136096
src/data/balance/tms.ts
136096
src/data/balance/tms.ts
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@ import { MoveFlags } from "#enums/MoveFlags";
|
|||||||
import type Pokemon from "../field/pokemon";
|
import type Pokemon from "../field/pokemon";
|
||||||
import { type nil, getFrameMs, getEnumKeys, getEnumValues, animationFileName } from "../utils/common";
|
import { type nil, getFrameMs, getEnumKeys, getEnumValues, animationFileName } from "../utils/common";
|
||||||
import type { BattlerIndex } from "../battle";
|
import type { BattlerIndex } from "../battle";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SubstituteTag } from "./battler-tags";
|
import { SubstituteTag } from "./battler-tags";
|
||||||
import { isNullOrUndefined } from "../utils/common";
|
import { isNullOrUndefined } from "../utils/common";
|
||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
@ -498,7 +498,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const moveAnims = new Map<Moves, AnimConfig | [AnimConfig, AnimConfig] | null>();
|
export const moveAnims = new Map<MoveId, AnimConfig | [AnimConfig, AnimConfig] | null>();
|
||||||
export const chargeAnims = new Map<ChargeAnim, AnimConfig | [AnimConfig, AnimConfig] | null>();
|
export const chargeAnims = new Map<ChargeAnim, AnimConfig | [AnimConfig, AnimConfig] | null>();
|
||||||
export const commonAnims = new Map<CommonAnim, AnimConfig>();
|
export const commonAnims = new Map<CommonAnim, AnimConfig>();
|
||||||
export const encounterAnims = new Map<EncounterAnim, AnimConfig>();
|
export const encounterAnims = new Map<EncounterAnim, AnimConfig>();
|
||||||
@ -521,7 +521,7 @@ export function initCommonAnims(): Promise<void> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function initMoveAnim(move: Moves): Promise<void> {
|
export function initMoveAnim(move: MoveId): Promise<void> {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
if (moveAnims.has(move)) {
|
if (moveAnims.has(move)) {
|
||||||
if (moveAnims.get(move) !== null) {
|
if (moveAnims.get(move) !== null) {
|
||||||
@ -544,12 +544,12 @@ export function initMoveAnim(move: Moves): Promise<void> {
|
|||||||
moveAnims.set(move, null);
|
moveAnims.set(move, null);
|
||||||
const defaultMoveAnim =
|
const defaultMoveAnim =
|
||||||
allMoves[move] instanceof AttackMove
|
allMoves[move] instanceof AttackMove
|
||||||
? Moves.TACKLE
|
? MoveId.TACKLE
|
||||||
: allMoves[move] instanceof SelfStatusMove
|
: allMoves[move] instanceof SelfStatusMove
|
||||||
? Moves.FOCUS_ENERGY
|
? MoveId.FOCUS_ENERGY
|
||||||
: Moves.TAIL_WHIP;
|
: MoveId.TAIL_WHIP;
|
||||||
|
|
||||||
const fetchAnimAndResolve = (move: Moves) => {
|
const fetchAnimAndResolve = (move: MoveId) => {
|
||||||
globalScene
|
globalScene
|
||||||
.cachedFetch(`./battle-anims/${animationFileName(move)}.json`)
|
.cachedFetch(`./battle-anims/${animationFileName(move)}.json`)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
@ -594,7 +594,7 @@ export function initMoveAnim(move: Moves): Promise<void> {
|
|||||||
* @param move the move to populate an animation for
|
* @param move the move to populate an animation for
|
||||||
* @param defaultMoveAnim the move to use as the default animation
|
* @param defaultMoveAnim the move to use as the default animation
|
||||||
*/
|
*/
|
||||||
function useDefaultAnim(move: Moves, defaultMoveAnim: Moves) {
|
function useDefaultAnim(move: MoveId, defaultMoveAnim: MoveId) {
|
||||||
populateMoveAnim(move, moveAnims.get(defaultMoveAnim));
|
populateMoveAnim(move, moveAnims.get(defaultMoveAnim));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -606,7 +606,7 @@ function useDefaultAnim(move: Moves, defaultMoveAnim: Moves) {
|
|||||||
*
|
*
|
||||||
* @remarks use {@linkcode useDefaultAnim} to use a default animation
|
* @remarks use {@linkcode useDefaultAnim} to use a default animation
|
||||||
*/
|
*/
|
||||||
function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) {
|
function logMissingMoveAnim(move: MoveId, ...optionalParams: any[]) {
|
||||||
const moveName = animationFileName(move);
|
const moveName = animationFileName(move);
|
||||||
console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams);
|
console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams);
|
||||||
}
|
}
|
||||||
@ -664,7 +664,7 @@ export function initMoveChargeAnim(chargeAnim: ChargeAnim): Promise<void> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function populateMoveAnim(move: Moves, animSource: any): void {
|
function populateMoveAnim(move: MoveId, animSource: any): void {
|
||||||
const moveAnim = new AnimConfig(animSource);
|
const moveAnim = new AnimConfig(animSource);
|
||||||
if (moveAnims.get(move) === null) {
|
if (moveAnims.get(move) === null) {
|
||||||
moveAnims.set(move, moveAnim);
|
moveAnims.set(move, moveAnim);
|
||||||
@ -697,7 +697,7 @@ export async function loadEncounterAnimAssets(startLoad?: boolean): Promise<void
|
|||||||
await loadAnimAssets(Array.from(encounterAnims.values()), startLoad);
|
await loadAnimAssets(Array.from(encounterAnims.values()), startLoad);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function loadMoveAnimAssets(moveIds: Moves[], startLoad?: boolean): Promise<void> {
|
export function loadMoveAnimAssets(moveIds: MoveId[], startLoad?: boolean): Promise<void> {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
const moveAnimations = moveIds.flatMap(m => moveAnims.get(m) as AnimConfig);
|
const moveAnimations = moveIds.flatMap(m => moveAnims.get(m) as AnimConfig);
|
||||||
for (const moveId of moveIds) {
|
for (const moveId of moveIds) {
|
||||||
@ -1425,9 +1425,9 @@ export class CommonBattleAnim extends BattleAnim {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class MoveAnim extends BattleAnim {
|
export class MoveAnim extends BattleAnim {
|
||||||
public move: Moves;
|
public move: MoveId;
|
||||||
|
|
||||||
constructor(move: Moves, user: Pokemon, target: BattlerIndex, playOnEmptyField = false) {
|
constructor(move: MoveId, user: Pokemon, target: BattlerIndex, playOnEmptyField = false) {
|
||||||
// Set target to the user pokemon if no target is found to avoid crashes
|
// Set target to the user pokemon if no target is found to avoid crashes
|
||||||
super(user, globalScene.getField()[target] ?? user, playOnEmptyField);
|
super(user, globalScene.getField()[target] ?? user, playOnEmptyField);
|
||||||
|
|
||||||
@ -1456,7 +1456,7 @@ export class MoveAnim extends BattleAnim {
|
|||||||
export class MoveChargeAnim extends MoveAnim {
|
export class MoveChargeAnim extends MoveAnim {
|
||||||
private chargeAnim: ChargeAnim;
|
private chargeAnim: ChargeAnim;
|
||||||
|
|
||||||
constructor(chargeAnim: ChargeAnim, move: Moves, user: Pokemon) {
|
constructor(chargeAnim: ChargeAnim, move: MoveId, user: Pokemon) {
|
||||||
super(move, user, 0);
|
super(move, user, 0);
|
||||||
|
|
||||||
this.chargeAnim = chargeAnim;
|
this.chargeAnim = chargeAnim;
|
||||||
@ -1502,8 +1502,8 @@ export async function populateAnims() {
|
|||||||
const chargeAnimIds = getEnumValues(ChargeAnim) as ChargeAnim[];
|
const chargeAnimIds = getEnumValues(ChargeAnim) as ChargeAnim[];
|
||||||
const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/;
|
const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/;
|
||||||
const moveNameToId = {};
|
const moveNameToId = {};
|
||||||
for (const move of getEnumValues(Moves).slice(1)) {
|
for (const move of getEnumValues(MoveId).slice(1)) {
|
||||||
const moveName = Moves[move].toUpperCase().replace(/\_/g, "");
|
const moveName = MoveId[move].toUpperCase().replace(/\_/g, "");
|
||||||
moveNameToId[moveName] = move;
|
moveNameToId[moveName] = move;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -15,10 +15,10 @@ import { BattleType } from "#enums/battle-type";
|
|||||||
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { Challenges } from "#enums/challenges";
|
import { Challenges } from "#enums/challenges";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { TypeColor, TypeShadow } from "#enums/color";
|
import { TypeColor, TypeShadow } from "#enums/color";
|
||||||
import { ModifierTier } from "#app/modifier/modifier-tier";
|
import { ModifierTier } from "#app/modifier/modifier-tier";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
@ -305,11 +305,11 @@ export abstract class Challenge {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* An apply function for STARTER_COST challenges. Derived classes should alter this.
|
* An apply function for STARTER_COST challenges. Derived classes should alter this.
|
||||||
* @param _species {@link Species} The pokemon to change the cost of.
|
* @param _species {@link SpeciesId} The pokemon to change the cost of.
|
||||||
* @param _cost {@link NumberHolder} The cost of the starter.
|
* @param _cost {@link NumberHolder} The cost of the starter.
|
||||||
* @returns {@link boolean} Whether this function did anything.
|
* @returns {@link boolean} Whether this function did anything.
|
||||||
*/
|
*/
|
||||||
applyStarterCost(_species: Species, _cost: NumberHolder): boolean {
|
applyStarterCost(_species: SpeciesId, _cost: NumberHolder): boolean {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,11 +395,11 @@ export abstract class Challenge {
|
|||||||
* An apply function for MOVE_ACCESS. Derived classes should alter this.
|
* An apply function for MOVE_ACCESS. Derived classes should alter this.
|
||||||
* @param _pokemon {@link Pokemon} What pokemon would learn the move.
|
* @param _pokemon {@link Pokemon} What pokemon would learn the move.
|
||||||
* @param _moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
* @param _moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
||||||
* @param _move {@link Moves} The move in question.
|
* @param _move {@link MoveId} The move in question.
|
||||||
* @param _level {@link NumberHolder} The level threshold for access.
|
* @param _level {@link NumberHolder} The level threshold for access.
|
||||||
* @returns {@link boolean} Whether this function did anything.
|
* @returns {@link boolean} Whether this function did anything.
|
||||||
*/
|
*/
|
||||||
applyMoveAccessLevel(_pokemon: Pokemon, _moveSource: MoveSourceType, _move: Moves, _level: NumberHolder): boolean {
|
applyMoveAccessLevel(_pokemon: Pokemon, _moveSource: MoveSourceType, _move: MoveId, _level: NumberHolder): boolean {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,11 +407,11 @@ export abstract class Challenge {
|
|||||||
* An apply function for MOVE_WEIGHT. Derived classes should alter this.
|
* An apply function for MOVE_WEIGHT. Derived classes should alter this.
|
||||||
* @param _pokemon {@link Pokemon} What pokemon would learn the move.
|
* @param _pokemon {@link Pokemon} What pokemon would learn the move.
|
||||||
* @param _moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
* @param _moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
||||||
* @param _move {@link Moves} The move in question.
|
* @param _move {@link MoveId} The move in question.
|
||||||
* @param _weight {@link NumberHolder} The base weight of the move
|
* @param _weight {@link NumberHolder} The base weight of the move
|
||||||
* @returns {@link boolean} Whether this function did anything.
|
* @returns {@link boolean} Whether this function did anything.
|
||||||
*/
|
*/
|
||||||
applyMoveWeight(_pokemon: Pokemon, _moveSource: MoveSourceType, _move: Moves, _level: NumberHolder): boolean {
|
applyMoveWeight(_pokemon: Pokemon, _moveSource: MoveSourceType, _move: MoveId, _level: NumberHolder): boolean {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -696,7 +696,7 @@ export class SingleGenerationChallenge extends Challenge {
|
|||||||
|
|
||||||
interface monotypeOverride {
|
interface monotypeOverride {
|
||||||
/** The species to override */
|
/** The species to override */
|
||||||
species: Species;
|
species: SpeciesId;
|
||||||
/** The type to count as */
|
/** The type to count as */
|
||||||
type: PokemonType;
|
type: PokemonType;
|
||||||
/** If part of a fusion, should we check the fused species instead of the base species? */
|
/** If part of a fusion, should we check the fused species instead of the base species? */
|
||||||
@ -708,7 +708,7 @@ interface monotypeOverride {
|
|||||||
*/
|
*/
|
||||||
export class SingleTypeChallenge extends Challenge {
|
export class SingleTypeChallenge extends Challenge {
|
||||||
private static TYPE_OVERRIDES: monotypeOverride[] = [
|
private static TYPE_OVERRIDES: monotypeOverride[] = [
|
||||||
{ species: Species.CASTFORM, type: PokemonType.NORMAL, fusion: false },
|
{ species: SpeciesId.CASTFORM, type: PokemonType.NORMAL, fusion: false },
|
||||||
];
|
];
|
||||||
// TODO: Find a solution for all Pokemon with this ssui issue, including Basculin and Burmy
|
// TODO: Find a solution for all Pokemon with this ssui issue, including Basculin and Burmy
|
||||||
|
|
||||||
@ -804,7 +804,7 @@ export class FreshStartChallenge extends Challenge {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyStarterCost(species: Species, cost: NumberHolder): boolean {
|
applyStarterCost(species: SpeciesId, cost: NumberHolder): boolean {
|
||||||
if (defaultStarterSpecies.includes(species)) {
|
if (defaultStarterSpecies.includes(species)) {
|
||||||
cost.value = speciesStarterCosts[species];
|
cost.value = speciesStarterCosts[species];
|
||||||
return true;
|
return true;
|
||||||
@ -992,13 +992,13 @@ export function applyChallenges(challengeType: ChallengeType.STARTER_POINTS, poi
|
|||||||
/**
|
/**
|
||||||
* Apply all challenges that modify the cost of a starter.
|
* Apply all challenges that modify the cost of a starter.
|
||||||
* @param challengeType {@link ChallengeType} ChallengeType.STARTER_COST
|
* @param challengeType {@link ChallengeType} ChallengeType.STARTER_COST
|
||||||
* @param species {@link Species} The pokemon to change the cost of.
|
* @param species {@link SpeciesId} The pokemon to change the cost of.
|
||||||
* @param points {@link NumberHolder} The cost of the pokemon.
|
* @param points {@link NumberHolder} The cost of the pokemon.
|
||||||
* @returns True if any challenge was successfully applied.
|
* @returns True if any challenge was successfully applied.
|
||||||
*/
|
*/
|
||||||
export function applyChallenges(
|
export function applyChallenges(
|
||||||
challengeType: ChallengeType.STARTER_COST,
|
challengeType: ChallengeType.STARTER_COST,
|
||||||
species: Species,
|
species: SpeciesId,
|
||||||
cost: NumberHolder,
|
cost: NumberHolder,
|
||||||
): boolean;
|
): boolean;
|
||||||
/**
|
/**
|
||||||
@ -1090,7 +1090,7 @@ export function applyChallenges(challengeType: ChallengeType.GAME_MODE_MODIFY):
|
|||||||
* @param challengeType {@link ChallengeType} ChallengeType.MOVE_ACCESS
|
* @param challengeType {@link ChallengeType} ChallengeType.MOVE_ACCESS
|
||||||
* @param pokemon {@link Pokemon} What pokemon would learn the move.
|
* @param pokemon {@link Pokemon} What pokemon would learn the move.
|
||||||
* @param moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
* @param moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
||||||
* @param move {@link Moves} The move in question.
|
* @param move {@link MoveId} The move in question.
|
||||||
* @param level {@link NumberHolder} The level threshold for access.
|
* @param level {@link NumberHolder} The level threshold for access.
|
||||||
* @returns True if any challenge was successfully applied.
|
* @returns True if any challenge was successfully applied.
|
||||||
*/
|
*/
|
||||||
@ -1098,7 +1098,7 @@ export function applyChallenges(
|
|||||||
challengeType: ChallengeType.MOVE_ACCESS,
|
challengeType: ChallengeType.MOVE_ACCESS,
|
||||||
pokemon: Pokemon,
|
pokemon: Pokemon,
|
||||||
moveSource: MoveSourceType,
|
moveSource: MoveSourceType,
|
||||||
move: Moves,
|
move: MoveId,
|
||||||
level: NumberHolder,
|
level: NumberHolder,
|
||||||
): boolean;
|
): boolean;
|
||||||
/**
|
/**
|
||||||
@ -1106,7 +1106,7 @@ export function applyChallenges(
|
|||||||
* @param challengeType {@link ChallengeType} ChallengeType.MOVE_WEIGHT
|
* @param challengeType {@link ChallengeType} ChallengeType.MOVE_WEIGHT
|
||||||
* @param pokemon {@link Pokemon} What pokemon would learn the move.
|
* @param pokemon {@link Pokemon} What pokemon would learn the move.
|
||||||
* @param moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
* @param moveSource {@link MoveSourceType} What source the pokemon would get the move from.
|
||||||
* @param move {@link Moves} The move in question.
|
* @param move {@link MoveId} The move in question.
|
||||||
* @param weight {@link NumberHolder} The weight of the move.
|
* @param weight {@link NumberHolder} The weight of the move.
|
||||||
* @returns True if any challenge was successfully applied.
|
* @returns True if any challenge was successfully applied.
|
||||||
*/
|
*/
|
||||||
@ -1114,7 +1114,7 @@ export function applyChallenges(
|
|||||||
challengeType: ChallengeType.MOVE_WEIGHT,
|
challengeType: ChallengeType.MOVE_WEIGHT,
|
||||||
pokemon: Pokemon,
|
pokemon: Pokemon,
|
||||||
moveSource: MoveSourceType,
|
moveSource: MoveSourceType,
|
||||||
move: Moves,
|
move: MoveId,
|
||||||
weight: NumberHolder,
|
weight: NumberHolder,
|
||||||
): boolean;
|
): boolean;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { Abilities } from "#enums/abilities";
|
import type { AbilityId } from "#enums/ability-id";
|
||||||
import type { PokemonType } from "#enums/pokemon-type";
|
import type { PokemonType } from "#enums/pokemon-type";
|
||||||
import type { Nature } from "#enums/nature";
|
import type { Nature } from "#enums/nature";
|
||||||
|
|
||||||
@ -12,8 +12,8 @@ export class CustomPokemonData {
|
|||||||
* The scale at which to render this Pokemon's sprite.
|
* The scale at which to render this Pokemon's sprite.
|
||||||
*/
|
*/
|
||||||
public spriteScale = -1;
|
public spriteScale = -1;
|
||||||
public ability: Abilities | -1;
|
public ability: AbilityId | -1;
|
||||||
public passive: Abilities | -1;
|
public passive: AbilityId | -1;
|
||||||
public nature: Nature | -1;
|
public nature: Nature | -1;
|
||||||
public types: PokemonType[];
|
public types: PokemonType[];
|
||||||
/** Deprecated but needed for session save migration */
|
/** Deprecated but needed for session save migration */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { PartyMemberStrength } from "#enums/party-member-strength";
|
import { PartyMemberStrength } from "#enums/party-member-strength";
|
||||||
import type { Species } from "#enums/species";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { PlayerPokemon } from "#app/field/pokemon";
|
import { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import type { Starter } from "#app/ui/starter-select-ui-handler";
|
import type { Starter } from "#app/ui/starter-select-ui-handler";
|
||||||
@ -8,7 +8,7 @@ import type { PokemonSpeciesForm } from "#app/data/pokemon-species";
|
|||||||
import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species";
|
import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species";
|
||||||
import { speciesStarterCosts } from "#app/data/balance/starters";
|
import { speciesStarterCosts } from "#app/data/balance/starters";
|
||||||
import { pokerogueApi } from "#app/plugins/api/pokerogue-api";
|
import { pokerogueApi } from "#app/plugins/api/pokerogue-api";
|
||||||
import { Biome } from "#app/enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
|
|
||||||
export interface DailyRunConfig {
|
export interface DailyRunConfig {
|
||||||
seed: number;
|
seed: number;
|
||||||
@ -34,7 +34,7 @@ export function getDailyRunStarters(seed: string): Starter[] {
|
|||||||
for (let s = 0; s < 3; s++) {
|
for (let s = 0; s < 3; s++) {
|
||||||
const offset = 6 + s * 6;
|
const offset = 6 + s * 6;
|
||||||
const starterSpeciesForm = getPokemonSpeciesForm(
|
const starterSpeciesForm = getPokemonSpeciesForm(
|
||||||
Number.parseInt(seed.slice(offset, offset + 4)) as Species,
|
Number.parseInt(seed.slice(offset, offset + 4)) as SpeciesId,
|
||||||
Number.parseInt(seed.slice(offset + 4, offset + 6)),
|
Number.parseInt(seed.slice(offset + 4, offset + 6)),
|
||||||
);
|
);
|
||||||
starters.push(getDailyRunStarter(starterSpeciesForm, startingLevel));
|
starters.push(getDailyRunStarter(starterSpeciesForm, startingLevel));
|
||||||
@ -50,7 +50,7 @@ export function getDailyRunStarters(seed: string): Starter[] {
|
|||||||
for (let c = 0; c < starterCosts.length; c++) {
|
for (let c = 0; c < starterCosts.length; c++) {
|
||||||
const cost = starterCosts[c];
|
const cost = starterCosts[c];
|
||||||
const costSpecies = Object.keys(speciesStarterCosts)
|
const costSpecies = Object.keys(speciesStarterCosts)
|
||||||
.map(s => Number.parseInt(s) as Species)
|
.map(s => Number.parseInt(s) as SpeciesId)
|
||||||
.filter(s => speciesStarterCosts[s] === cost);
|
.filter(s => speciesStarterCosts[s] === cost);
|
||||||
const randPkmSpecies = getPokemonSpecies(randSeedItem(costSpecies));
|
const randPkmSpecies = getPokemonSpecies(randSeedItem(costSpecies));
|
||||||
const starterSpecies = getPokemonSpecies(
|
const starterSpecies = getPokemonSpecies(
|
||||||
@ -102,48 +102,48 @@ interface BiomeWeights {
|
|||||||
// Town and End are set to 0 however
|
// Town and End are set to 0 however
|
||||||
// And some other biomes were balanced +1/-1 based on average size of the total daily.
|
// And some other biomes were balanced +1/-1 based on average size of the total daily.
|
||||||
const dailyBiomeWeights: BiomeWeights = {
|
const dailyBiomeWeights: BiomeWeights = {
|
||||||
[Biome.CAVE]: 3,
|
[BiomeId.CAVE]: 3,
|
||||||
[Biome.LAKE]: 3,
|
[BiomeId.LAKE]: 3,
|
||||||
[Biome.PLAINS]: 3,
|
[BiomeId.PLAINS]: 3,
|
||||||
[Biome.SNOWY_FOREST]: 3,
|
[BiomeId.SNOWY_FOREST]: 3,
|
||||||
[Biome.SWAMP]: 3, // 2 -> 3
|
[BiomeId.SWAMP]: 3, // 2 -> 3
|
||||||
[Biome.TALL_GRASS]: 3, // 2 -> 3
|
[BiomeId.TALL_GRASS]: 3, // 2 -> 3
|
||||||
|
|
||||||
[Biome.ABYSS]: 2, // 3 -> 2
|
[BiomeId.ABYSS]: 2, // 3 -> 2
|
||||||
[Biome.RUINS]: 2,
|
[BiomeId.RUINS]: 2,
|
||||||
[Biome.BADLANDS]: 2,
|
[BiomeId.BADLANDS]: 2,
|
||||||
[Biome.BEACH]: 2,
|
[BiomeId.BEACH]: 2,
|
||||||
[Biome.CONSTRUCTION_SITE]: 2,
|
[BiomeId.CONSTRUCTION_SITE]: 2,
|
||||||
[Biome.DESERT]: 2,
|
[BiomeId.DESERT]: 2,
|
||||||
[Biome.DOJO]: 2, // 3 -> 2
|
[BiomeId.DOJO]: 2, // 3 -> 2
|
||||||
[Biome.FACTORY]: 2,
|
[BiomeId.FACTORY]: 2,
|
||||||
[Biome.FAIRY_CAVE]: 2,
|
[BiomeId.FAIRY_CAVE]: 2,
|
||||||
[Biome.FOREST]: 2,
|
[BiomeId.FOREST]: 2,
|
||||||
[Biome.GRASS]: 2, // 1 -> 2
|
[BiomeId.GRASS]: 2, // 1 -> 2
|
||||||
[Biome.MEADOW]: 2,
|
[BiomeId.MEADOW]: 2,
|
||||||
[Biome.MOUNTAIN]: 2, // 3 -> 2
|
[BiomeId.MOUNTAIN]: 2, // 3 -> 2
|
||||||
[Biome.SEA]: 2,
|
[BiomeId.SEA]: 2,
|
||||||
[Biome.SEABED]: 2,
|
[BiomeId.SEABED]: 2,
|
||||||
[Biome.SLUM]: 2,
|
[BiomeId.SLUM]: 2,
|
||||||
[Biome.TEMPLE]: 2, // 3 -> 2
|
[BiomeId.TEMPLE]: 2, // 3 -> 2
|
||||||
[Biome.VOLCANO]: 2,
|
[BiomeId.VOLCANO]: 2,
|
||||||
|
|
||||||
[Biome.GRAVEYARD]: 1,
|
[BiomeId.GRAVEYARD]: 1,
|
||||||
[Biome.ICE_CAVE]: 1,
|
[BiomeId.ICE_CAVE]: 1,
|
||||||
[Biome.ISLAND]: 1,
|
[BiomeId.ISLAND]: 1,
|
||||||
[Biome.JUNGLE]: 1,
|
[BiomeId.JUNGLE]: 1,
|
||||||
[Biome.LABORATORY]: 1,
|
[BiomeId.LABORATORY]: 1,
|
||||||
[Biome.METROPOLIS]: 1,
|
[BiomeId.METROPOLIS]: 1,
|
||||||
[Biome.POWER_PLANT]: 1,
|
[BiomeId.POWER_PLANT]: 1,
|
||||||
[Biome.SPACE]: 1,
|
[BiomeId.SPACE]: 1,
|
||||||
[Biome.WASTELAND]: 1,
|
[BiomeId.WASTELAND]: 1,
|
||||||
|
|
||||||
[Biome.TOWN]: 0,
|
[BiomeId.TOWN]: 0,
|
||||||
[Biome.END]: 0,
|
[BiomeId.END]: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getDailyStartingBiome(): Biome {
|
export function getDailyStartingBiome(): BiomeId {
|
||||||
const biomes = getEnumValues(Biome).filter(b => b !== Biome.TOWN && b !== Biome.END);
|
const biomes = getEnumValues(BiomeId).filter(b => b !== BiomeId.TOWN && b !== BiomeId.END);
|
||||||
|
|
||||||
let totalWeight = 0;
|
let totalWeight = 0;
|
||||||
const biomeThresholds: number[] = [];
|
const biomeThresholds: number[] = [];
|
||||||
|
@ -10,7 +10,7 @@ import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions";
|
|||||||
import type { PlayerPokemon } from "#app/field/pokemon";
|
import type { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { EggTier } from "#enums/egg-type";
|
import { EggTier } from "#enums/egg-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { EggSourceType } from "#enums/egg-source-types";
|
import { EggSourceType } from "#enums/egg-source-types";
|
||||||
import {
|
import {
|
||||||
MANAPHY_EGG_MANAPHY_RATE,
|
MANAPHY_EGG_MANAPHY_RATE,
|
||||||
@ -67,7 +67,7 @@ export interface IEggOptions {
|
|||||||
/** Sets how many waves it will take till this egg hatches. */
|
/** Sets how many waves it will take till this egg hatches. */
|
||||||
hatchWaves?: number;
|
hatchWaves?: number;
|
||||||
/** Sets the exact species that will hatch from this egg. */
|
/** Sets the exact species that will hatch from this egg. */
|
||||||
species?: Species;
|
species?: SpeciesId;
|
||||||
/** Defines if the hatched pokemon will be a shiny. */
|
/** Defines if the hatched pokemon will be a shiny. */
|
||||||
isShiny?: boolean;
|
isShiny?: boolean;
|
||||||
/** Defines the variant of the pokemon that will hatch from this egg. If no `variantTier` is given the normal variant rates will apply. */
|
/** Defines the variant of the pokemon that will hatch from this egg. If no `variantTier` is given the normal variant rates will apply. */
|
||||||
@ -94,7 +94,7 @@ export class Egg {
|
|||||||
private _hatchWaves: number;
|
private _hatchWaves: number;
|
||||||
private _timestamp: number;
|
private _timestamp: number;
|
||||||
|
|
||||||
private _species: Species;
|
private _species: SpeciesId;
|
||||||
private _isShiny: boolean;
|
private _isShiny: boolean;
|
||||||
private _variantTier: VariantTier;
|
private _variantTier: VariantTier;
|
||||||
private _eggMoveIndex: number;
|
private _eggMoveIndex: number;
|
||||||
@ -134,7 +134,7 @@ export class Egg {
|
|||||||
return this._timestamp;
|
return this._timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
get species(): Species {
|
get species(): SpeciesId {
|
||||||
return this._species;
|
return this._species;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,8 +221,8 @@ export class Egg {
|
|||||||
|
|
||||||
public isManaphyEgg(): boolean {
|
public isManaphyEgg(): boolean {
|
||||||
return (
|
return (
|
||||||
this._species === Species.PHIONE ||
|
this._species === SpeciesId.PHIONE ||
|
||||||
this._species === Species.MANAPHY ||
|
this._species === SpeciesId.MANAPHY ||
|
||||||
(this._tier === EggTier.COMMON && !(this._id % 204) && !this._species)
|
(this._tier === EggTier.COMMON && !(this._id % 204) && !this._species)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -247,8 +247,10 @@ export class Egg {
|
|||||||
|
|
||||||
let pokemonSpecies = getPokemonSpecies(this._species);
|
let pokemonSpecies = getPokemonSpecies(this._species);
|
||||||
// Special condition to have Phione eggs also have a chance of generating Manaphy
|
// Special condition to have Phione eggs also have a chance of generating Manaphy
|
||||||
if (this._species === Species.PHIONE && this._sourceType === EggSourceType.SAME_SPECIES_EGG) {
|
if (this._species === SpeciesId.PHIONE && this._sourceType === EggSourceType.SAME_SPECIES_EGG) {
|
||||||
pokemonSpecies = getPokemonSpecies(randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
|
pokemonSpecies = getPokemonSpecies(
|
||||||
|
randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? SpeciesId.PHIONE : SpeciesId.MANAPHY,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the hidden ability if a hidden ability exists and
|
// Sets the hidden ability if a hidden ability exists and
|
||||||
@ -371,7 +373,7 @@ export class Egg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private getEggTierDefaultHatchWaves(eggTier?: EggTier): number {
|
private getEggTierDefaultHatchWaves(eggTier?: EggTier): number {
|
||||||
if (this._species === Species.PHIONE || this._species === Species.MANAPHY) {
|
if (this._species === SpeciesId.PHIONE || this._species === SpeciesId.MANAPHY) {
|
||||||
return HATCH_WAVES_MANAPHY_EGG;
|
return HATCH_WAVES_MANAPHY_EGG;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,7 +401,7 @@ export class Egg {
|
|||||||
: EggTier.LEGENDARY;
|
: EggTier.LEGENDARY;
|
||||||
}
|
}
|
||||||
|
|
||||||
private rollSpecies(): Species | null {
|
private rollSpecies(): SpeciesId | null {
|
||||||
if (!globalScene) {
|
if (!globalScene) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -415,7 +417,7 @@ export class Egg {
|
|||||||
* check pass when Utils.randSeedInt(8) = 0, we can tell them apart during tests.
|
* check pass when Utils.randSeedInt(8) = 0, we can tell them apart during tests.
|
||||||
*/
|
*/
|
||||||
const rand = randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1;
|
const rand = randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1;
|
||||||
return rand ? Species.PHIONE : Species.MANAPHY;
|
return rand ? SpeciesId.PHIONE : SpeciesId.MANAPHY;
|
||||||
}
|
}
|
||||||
if (this.tier === EggTier.LEGENDARY && this._sourceType === EggSourceType.GACHA_LEGENDARY) {
|
if (this.tier === EggTier.LEGENDARY && this._sourceType === EggSourceType.GACHA_LEGENDARY) {
|
||||||
if (!randSeedInt(2)) {
|
if (!randSeedInt(2)) {
|
||||||
@ -445,11 +447,11 @@ export class Egg {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ignoredSpecies = [Species.PHIONE, Species.MANAPHY, Species.ETERNATUS];
|
const ignoredSpecies = [SpeciesId.PHIONE, SpeciesId.MANAPHY, SpeciesId.ETERNATUS];
|
||||||
|
|
||||||
let speciesPool = Object.keys(speciesEggTiers)
|
let speciesPool = Object.keys(speciesEggTiers)
|
||||||
.filter(s => speciesEggTiers[s] === this.tier)
|
.filter(s => speciesEggTiers[s] === this.tier)
|
||||||
.map(s => Number.parseInt(s) as Species)
|
.map(s => Number.parseInt(s) as SpeciesId)
|
||||||
.filter(
|
.filter(
|
||||||
s =>
|
s =>
|
||||||
!pokemonPrevolutions.hasOwnProperty(s) &&
|
!pokemonPrevolutions.hasOwnProperty(s) &&
|
||||||
@ -496,7 +498,7 @@ export class Egg {
|
|||||||
totalWeight += weight;
|
totalWeight += weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
let species: Species;
|
let species: SpeciesId;
|
||||||
|
|
||||||
const rand = randSeedInt(totalWeight);
|
const rand = randSeedInt(totalWeight);
|
||||||
for (let s = 0; s < speciesWeights.length; s++) {
|
for (let s = 0; s < speciesWeights.length; s++) {
|
||||||
@ -606,17 +608,17 @@ export class Egg {
|
|||||||
////
|
////
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getValidLegendaryGachaSpecies(): Species[] {
|
export function getValidLegendaryGachaSpecies(): SpeciesId[] {
|
||||||
return Object.entries(speciesEggTiers)
|
return Object.entries(speciesEggTiers)
|
||||||
.filter(s => s[1] === EggTier.LEGENDARY)
|
.filter(s => s[1] === EggTier.LEGENDARY)
|
||||||
.map(s => Number.parseInt(s[0]))
|
.map(s => Number.parseInt(s[0]))
|
||||||
.filter(s => getPokemonSpecies(s).isObtainable() && s !== Species.ETERNATUS);
|
.filter(s => getPokemonSpecies(s).isObtainable() && s !== SpeciesId.ETERNATUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getLegendaryGachaSpeciesForTimestamp(timestamp: number): Species {
|
export function getLegendaryGachaSpeciesForTimestamp(timestamp: number): SpeciesId {
|
||||||
const legendarySpecies = getValidLegendaryGachaSpecies();
|
const legendarySpecies = getValidLegendaryGachaSpecies();
|
||||||
|
|
||||||
let ret: Species;
|
let ret: SpeciesId;
|
||||||
|
|
||||||
// 86400000 is the number of miliseconds in one day
|
// 86400000 is the number of miliseconds in one day
|
||||||
const timeDate = new Date(timestamp);
|
const timeDate = new Date(timestamp);
|
||||||
|
@ -1,257 +1,257 @@
|
|||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
|
|
||||||
/** Set of moves that cannot be called by {@linkcode Moves.METRONOME Metronome} */
|
/** Set of moves that cannot be called by {@linkcode MoveId.METRONOME Metronome} */
|
||||||
export const invalidMetronomeMoves: ReadonlySet<Moves> = new Set([
|
export const invalidMetronomeMoves: ReadonlySet<MoveId> = new Set([
|
||||||
Moves.AFTER_YOU,
|
MoveId.AFTER_YOU,
|
||||||
Moves.ASSIST,
|
MoveId.ASSIST,
|
||||||
Moves.BANEFUL_BUNKER,
|
MoveId.BANEFUL_BUNKER,
|
||||||
Moves.BEAK_BLAST,
|
MoveId.BEAK_BLAST,
|
||||||
Moves.BELCH,
|
MoveId.BELCH,
|
||||||
Moves.BESTOW,
|
MoveId.BESTOW,
|
||||||
Moves.COMEUPPANCE,
|
MoveId.COMEUPPANCE,
|
||||||
Moves.COPYCAT,
|
MoveId.COPYCAT,
|
||||||
Moves.COUNTER,
|
MoveId.COUNTER,
|
||||||
Moves.CRAFTY_SHIELD,
|
MoveId.CRAFTY_SHIELD,
|
||||||
Moves.DESTINY_BOND,
|
MoveId.DESTINY_BOND,
|
||||||
Moves.DETECT,
|
MoveId.DETECT,
|
||||||
Moves.ENDURE,
|
MoveId.ENDURE,
|
||||||
Moves.FEINT,
|
MoveId.FEINT,
|
||||||
Moves.FOCUS_PUNCH,
|
MoveId.FOCUS_PUNCH,
|
||||||
Moves.FOLLOW_ME,
|
MoveId.FOLLOW_ME,
|
||||||
Moves.HELPING_HAND,
|
MoveId.HELPING_HAND,
|
||||||
Moves.INSTRUCT,
|
MoveId.INSTRUCT,
|
||||||
Moves.KINGS_SHIELD,
|
MoveId.KINGS_SHIELD,
|
||||||
Moves.MAT_BLOCK,
|
MoveId.MAT_BLOCK,
|
||||||
Moves.ME_FIRST,
|
MoveId.ME_FIRST,
|
||||||
Moves.METRONOME,
|
MoveId.METRONOME,
|
||||||
Moves.MIMIC,
|
MoveId.MIMIC,
|
||||||
Moves.MIRROR_COAT,
|
MoveId.MIRROR_COAT,
|
||||||
Moves.MIRROR_MOVE,
|
MoveId.MIRROR_MOVE,
|
||||||
Moves.OBSTRUCT,
|
MoveId.OBSTRUCT,
|
||||||
Moves.PROTECT,
|
MoveId.PROTECT,
|
||||||
Moves.QUASH,
|
MoveId.QUASH,
|
||||||
Moves.QUICK_GUARD,
|
MoveId.QUICK_GUARD,
|
||||||
Moves.RAGE_POWDER,
|
MoveId.RAGE_POWDER,
|
||||||
Moves.REVIVAL_BLESSING,
|
MoveId.REVIVAL_BLESSING,
|
||||||
Moves.SHELL_TRAP,
|
MoveId.SHELL_TRAP,
|
||||||
Moves.SILK_TRAP,
|
MoveId.SILK_TRAP,
|
||||||
Moves.SKETCH,
|
MoveId.SKETCH,
|
||||||
Moves.SLEEP_TALK,
|
MoveId.SLEEP_TALK,
|
||||||
Moves.SNATCH,
|
MoveId.SNATCH,
|
||||||
Moves.SNORE,
|
MoveId.SNORE,
|
||||||
Moves.SPIKY_SHIELD,
|
MoveId.SPIKY_SHIELD,
|
||||||
Moves.SPOTLIGHT,
|
MoveId.SPOTLIGHT,
|
||||||
Moves.STRUGGLE,
|
MoveId.STRUGGLE,
|
||||||
Moves.TRANSFORM,
|
MoveId.TRANSFORM,
|
||||||
Moves.WIDE_GUARD,
|
MoveId.WIDE_GUARD,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/** Set of moves that cannot be called by {@linkcode Moves.ASSIST Assist} */
|
/** Set of moves that cannot be called by {@linkcode MoveId.ASSIST Assist} */
|
||||||
export const invalidAssistMoves: ReadonlySet<Moves> = new Set([
|
export const invalidAssistMoves: ReadonlySet<MoveId> = new Set([
|
||||||
Moves.ASSIST,
|
MoveId.ASSIST,
|
||||||
Moves.BANEFUL_BUNKER,
|
MoveId.BANEFUL_BUNKER,
|
||||||
Moves.BEAK_BLAST,
|
MoveId.BEAK_BLAST,
|
||||||
Moves.BELCH,
|
MoveId.BELCH,
|
||||||
Moves.BESTOW,
|
MoveId.BESTOW,
|
||||||
Moves.BOUNCE,
|
MoveId.BOUNCE,
|
||||||
Moves.CELEBRATE,
|
MoveId.CELEBRATE,
|
||||||
Moves.CHATTER,
|
MoveId.CHATTER,
|
||||||
Moves.CIRCLE_THROW,
|
MoveId.CIRCLE_THROW,
|
||||||
Moves.COPYCAT,
|
MoveId.COPYCAT,
|
||||||
Moves.COUNTER,
|
MoveId.COUNTER,
|
||||||
Moves.DESTINY_BOND,
|
MoveId.DESTINY_BOND,
|
||||||
Moves.DETECT,
|
MoveId.DETECT,
|
||||||
Moves.DIG,
|
MoveId.DIG,
|
||||||
Moves.DIVE,
|
MoveId.DIVE,
|
||||||
Moves.DRAGON_TAIL,
|
MoveId.DRAGON_TAIL,
|
||||||
Moves.ENDURE,
|
MoveId.ENDURE,
|
||||||
Moves.FEINT,
|
MoveId.FEINT,
|
||||||
Moves.FLY,
|
MoveId.FLY,
|
||||||
Moves.FOCUS_PUNCH,
|
MoveId.FOCUS_PUNCH,
|
||||||
Moves.FOLLOW_ME,
|
MoveId.FOLLOW_ME,
|
||||||
Moves.HELPING_HAND,
|
MoveId.HELPING_HAND,
|
||||||
Moves.HOLD_HANDS,
|
MoveId.HOLD_HANDS,
|
||||||
Moves.KINGS_SHIELD,
|
MoveId.KINGS_SHIELD,
|
||||||
Moves.MAT_BLOCK,
|
MoveId.MAT_BLOCK,
|
||||||
Moves.ME_FIRST,
|
MoveId.ME_FIRST,
|
||||||
Moves.METRONOME,
|
MoveId.METRONOME,
|
||||||
Moves.MIMIC,
|
MoveId.MIMIC,
|
||||||
Moves.MIRROR_COAT,
|
MoveId.MIRROR_COAT,
|
||||||
Moves.MIRROR_MOVE,
|
MoveId.MIRROR_MOVE,
|
||||||
Moves.NATURE_POWER,
|
MoveId.NATURE_POWER,
|
||||||
Moves.PHANTOM_FORCE,
|
MoveId.PHANTOM_FORCE,
|
||||||
Moves.PROTECT,
|
MoveId.PROTECT,
|
||||||
Moves.RAGE_POWDER,
|
MoveId.RAGE_POWDER,
|
||||||
Moves.ROAR,
|
MoveId.ROAR,
|
||||||
Moves.SHADOW_FORCE,
|
MoveId.SHADOW_FORCE,
|
||||||
Moves.SHELL_TRAP,
|
MoveId.SHELL_TRAP,
|
||||||
Moves.SKETCH,
|
MoveId.SKETCH,
|
||||||
Moves.SKY_DROP,
|
MoveId.SKY_DROP,
|
||||||
Moves.SLEEP_TALK,
|
MoveId.SLEEP_TALK,
|
||||||
Moves.SNATCH,
|
MoveId.SNATCH,
|
||||||
Moves.SPIKY_SHIELD,
|
MoveId.SPIKY_SHIELD,
|
||||||
Moves.SPOTLIGHT,
|
MoveId.SPOTLIGHT,
|
||||||
Moves.STRUGGLE,
|
MoveId.STRUGGLE,
|
||||||
Moves.SWITCHEROO,
|
MoveId.SWITCHEROO,
|
||||||
Moves.TRANSFORM,
|
MoveId.TRANSFORM,
|
||||||
Moves.TRICK,
|
MoveId.TRICK,
|
||||||
Moves.WHIRLWIND,
|
MoveId.WHIRLWIND,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/** Set of moves that cannot be called by {@linkcode Moves.SLEEP_TALK Sleep Talk} */
|
/** Set of moves that cannot be called by {@linkcode MoveId.SLEEP_TALK Sleep Talk} */
|
||||||
export const invalidSleepTalkMoves: ReadonlySet<Moves> = new Set([
|
export const invalidSleepTalkMoves: ReadonlySet<MoveId> = new Set([
|
||||||
Moves.ASSIST,
|
MoveId.ASSIST,
|
||||||
Moves.BELCH,
|
MoveId.BELCH,
|
||||||
Moves.BEAK_BLAST,
|
MoveId.BEAK_BLAST,
|
||||||
Moves.BIDE,
|
MoveId.BIDE,
|
||||||
Moves.BOUNCE,
|
MoveId.BOUNCE,
|
||||||
Moves.COPYCAT,
|
MoveId.COPYCAT,
|
||||||
Moves.DIG,
|
MoveId.DIG,
|
||||||
Moves.DIVE,
|
MoveId.DIVE,
|
||||||
Moves.FREEZE_SHOCK,
|
MoveId.FREEZE_SHOCK,
|
||||||
Moves.FLY,
|
MoveId.FLY,
|
||||||
Moves.FOCUS_PUNCH,
|
MoveId.FOCUS_PUNCH,
|
||||||
Moves.GEOMANCY,
|
MoveId.GEOMANCY,
|
||||||
Moves.ICE_BURN,
|
MoveId.ICE_BURN,
|
||||||
Moves.ME_FIRST,
|
MoveId.ME_FIRST,
|
||||||
Moves.METRONOME,
|
MoveId.METRONOME,
|
||||||
Moves.MIRROR_MOVE,
|
MoveId.MIRROR_MOVE,
|
||||||
Moves.MIMIC,
|
MoveId.MIMIC,
|
||||||
Moves.PHANTOM_FORCE,
|
MoveId.PHANTOM_FORCE,
|
||||||
Moves.RAZOR_WIND,
|
MoveId.RAZOR_WIND,
|
||||||
Moves.SHADOW_FORCE,
|
MoveId.SHADOW_FORCE,
|
||||||
Moves.SHELL_TRAP,
|
MoveId.SHELL_TRAP,
|
||||||
Moves.SKETCH,
|
MoveId.SKETCH,
|
||||||
Moves.SKULL_BASH,
|
MoveId.SKULL_BASH,
|
||||||
Moves.SKY_ATTACK,
|
MoveId.SKY_ATTACK,
|
||||||
Moves.SKY_DROP,
|
MoveId.SKY_DROP,
|
||||||
Moves.SLEEP_TALK,
|
MoveId.SLEEP_TALK,
|
||||||
Moves.SOLAR_BLADE,
|
MoveId.SOLAR_BLADE,
|
||||||
Moves.SOLAR_BEAM,
|
MoveId.SOLAR_BEAM,
|
||||||
Moves.STRUGGLE,
|
MoveId.STRUGGLE,
|
||||||
Moves.UPROAR,
|
MoveId.UPROAR,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/** Set of moves that cannot be copied by {@linkcode Moves.COPYCAT Copycat} */
|
/** Set of moves that cannot be copied by {@linkcode MoveId.COPYCAT Copycat} */
|
||||||
export const invalidCopycatMoves: ReadonlySet<Moves> = new Set([
|
export const invalidCopycatMoves: ReadonlySet<MoveId> = new Set([
|
||||||
Moves.ASSIST,
|
MoveId.ASSIST,
|
||||||
Moves.BANEFUL_BUNKER,
|
MoveId.BANEFUL_BUNKER,
|
||||||
Moves.BEAK_BLAST,
|
MoveId.BEAK_BLAST,
|
||||||
Moves.BESTOW,
|
MoveId.BESTOW,
|
||||||
Moves.CELEBRATE,
|
MoveId.CELEBRATE,
|
||||||
Moves.CHATTER,
|
MoveId.CHATTER,
|
||||||
Moves.CIRCLE_THROW,
|
MoveId.CIRCLE_THROW,
|
||||||
Moves.COPYCAT,
|
MoveId.COPYCAT,
|
||||||
Moves.COUNTER,
|
MoveId.COUNTER,
|
||||||
Moves.DESTINY_BOND,
|
MoveId.DESTINY_BOND,
|
||||||
Moves.DETECT,
|
MoveId.DETECT,
|
||||||
Moves.DRAGON_TAIL,
|
MoveId.DRAGON_TAIL,
|
||||||
Moves.ENDURE,
|
MoveId.ENDURE,
|
||||||
Moves.FEINT,
|
MoveId.FEINT,
|
||||||
Moves.FOCUS_PUNCH,
|
MoveId.FOCUS_PUNCH,
|
||||||
Moves.FOLLOW_ME,
|
MoveId.FOLLOW_ME,
|
||||||
Moves.HELPING_HAND,
|
MoveId.HELPING_HAND,
|
||||||
Moves.HOLD_HANDS,
|
MoveId.HOLD_HANDS,
|
||||||
Moves.KINGS_SHIELD,
|
MoveId.KINGS_SHIELD,
|
||||||
Moves.MAT_BLOCK,
|
MoveId.MAT_BLOCK,
|
||||||
Moves.ME_FIRST,
|
MoveId.ME_FIRST,
|
||||||
Moves.METRONOME,
|
MoveId.METRONOME,
|
||||||
Moves.MIMIC,
|
MoveId.MIMIC,
|
||||||
Moves.MIRROR_COAT,
|
MoveId.MIRROR_COAT,
|
||||||
Moves.MIRROR_MOVE,
|
MoveId.MIRROR_MOVE,
|
||||||
Moves.PROTECT,
|
MoveId.PROTECT,
|
||||||
Moves.RAGE_POWDER,
|
MoveId.RAGE_POWDER,
|
||||||
Moves.ROAR,
|
MoveId.ROAR,
|
||||||
Moves.SHELL_TRAP,
|
MoveId.SHELL_TRAP,
|
||||||
Moves.SKETCH,
|
MoveId.SKETCH,
|
||||||
Moves.SLEEP_TALK,
|
MoveId.SLEEP_TALK,
|
||||||
Moves.SNATCH,
|
MoveId.SNATCH,
|
||||||
Moves.SPIKY_SHIELD,
|
MoveId.SPIKY_SHIELD,
|
||||||
Moves.SPOTLIGHT,
|
MoveId.SPOTLIGHT,
|
||||||
Moves.STRUGGLE,
|
MoveId.STRUGGLE,
|
||||||
Moves.SWITCHEROO,
|
MoveId.SWITCHEROO,
|
||||||
Moves.TRANSFORM,
|
MoveId.TRANSFORM,
|
||||||
Moves.TRICK,
|
MoveId.TRICK,
|
||||||
Moves.WHIRLWIND,
|
MoveId.WHIRLWIND,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export const invalidMirrorMoveMoves: ReadonlySet<Moves> = new Set([
|
export const invalidMirrorMoveMoves: ReadonlySet<MoveId> = new Set([
|
||||||
Moves.ACUPRESSURE,
|
MoveId.ACUPRESSURE,
|
||||||
Moves.AFTER_YOU,
|
MoveId.AFTER_YOU,
|
||||||
Moves.AROMATIC_MIST,
|
MoveId.AROMATIC_MIST,
|
||||||
Moves.BEAK_BLAST,
|
MoveId.BEAK_BLAST,
|
||||||
Moves.BELCH,
|
MoveId.BELCH,
|
||||||
Moves.CHILLY_RECEPTION,
|
MoveId.CHILLY_RECEPTION,
|
||||||
Moves.COACHING,
|
MoveId.COACHING,
|
||||||
Moves.CONVERSION_2,
|
MoveId.CONVERSION_2,
|
||||||
Moves.COUNTER,
|
MoveId.COUNTER,
|
||||||
Moves.CRAFTY_SHIELD,
|
MoveId.CRAFTY_SHIELD,
|
||||||
Moves.CURSE,
|
MoveId.CURSE,
|
||||||
Moves.DECORATE,
|
MoveId.DECORATE,
|
||||||
Moves.DOODLE,
|
MoveId.DOODLE,
|
||||||
Moves.DOOM_DESIRE,
|
MoveId.DOOM_DESIRE,
|
||||||
Moves.DRAGON_CHEER,
|
MoveId.DRAGON_CHEER,
|
||||||
Moves.ELECTRIC_TERRAIN,
|
MoveId.ELECTRIC_TERRAIN,
|
||||||
Moves.FINAL_GAMBIT,
|
MoveId.FINAL_GAMBIT,
|
||||||
Moves.FLORAL_HEALING,
|
MoveId.FLORAL_HEALING,
|
||||||
Moves.FLOWER_SHIELD,
|
MoveId.FLOWER_SHIELD,
|
||||||
Moves.FOCUS_PUNCH,
|
MoveId.FOCUS_PUNCH,
|
||||||
Moves.FUTURE_SIGHT,
|
MoveId.FUTURE_SIGHT,
|
||||||
Moves.GEAR_UP,
|
MoveId.GEAR_UP,
|
||||||
Moves.GRASSY_TERRAIN,
|
MoveId.GRASSY_TERRAIN,
|
||||||
Moves.GRAVITY,
|
MoveId.GRAVITY,
|
||||||
Moves.GUARD_SPLIT,
|
MoveId.GUARD_SPLIT,
|
||||||
Moves.HAIL,
|
MoveId.HAIL,
|
||||||
Moves.HAZE,
|
MoveId.HAZE,
|
||||||
Moves.HEAL_PULSE,
|
MoveId.HEAL_PULSE,
|
||||||
Moves.HELPING_HAND,
|
MoveId.HELPING_HAND,
|
||||||
Moves.HOLD_HANDS,
|
MoveId.HOLD_HANDS,
|
||||||
Moves.INSTRUCT,
|
MoveId.INSTRUCT,
|
||||||
Moves.ION_DELUGE,
|
MoveId.ION_DELUGE,
|
||||||
Moves.MAGNETIC_FLUX,
|
MoveId.MAGNETIC_FLUX,
|
||||||
Moves.MAT_BLOCK,
|
MoveId.MAT_BLOCK,
|
||||||
Moves.ME_FIRST,
|
MoveId.ME_FIRST,
|
||||||
Moves.MIMIC,
|
MoveId.MIMIC,
|
||||||
Moves.MIRROR_COAT,
|
MoveId.MIRROR_COAT,
|
||||||
Moves.MIRROR_MOVE,
|
MoveId.MIRROR_MOVE,
|
||||||
Moves.MIST,
|
MoveId.MIST,
|
||||||
Moves.MISTY_TERRAIN,
|
MoveId.MISTY_TERRAIN,
|
||||||
Moves.MUD_SPORT,
|
MoveId.MUD_SPORT,
|
||||||
Moves.PERISH_SONG,
|
MoveId.PERISH_SONG,
|
||||||
Moves.POWER_SPLIT,
|
MoveId.POWER_SPLIT,
|
||||||
Moves.PSYCH_UP,
|
MoveId.PSYCH_UP,
|
||||||
Moves.PSYCHIC_TERRAIN,
|
MoveId.PSYCHIC_TERRAIN,
|
||||||
Moves.PURIFY,
|
MoveId.PURIFY,
|
||||||
Moves.QUICK_GUARD,
|
MoveId.QUICK_GUARD,
|
||||||
Moves.RAIN_DANCE,
|
MoveId.RAIN_DANCE,
|
||||||
Moves.REFLECT_TYPE,
|
MoveId.REFLECT_TYPE,
|
||||||
Moves.ROLE_PLAY,
|
MoveId.ROLE_PLAY,
|
||||||
Moves.ROTOTILLER,
|
MoveId.ROTOTILLER,
|
||||||
Moves.SANDSTORM,
|
MoveId.SANDSTORM,
|
||||||
Moves.SHELL_TRAP,
|
MoveId.SHELL_TRAP,
|
||||||
Moves.SKETCH,
|
MoveId.SKETCH,
|
||||||
Moves.SNOWSCAPE,
|
MoveId.SNOWSCAPE,
|
||||||
Moves.SPIT_UP,
|
MoveId.SPIT_UP,
|
||||||
Moves.SPOTLIGHT,
|
MoveId.SPOTLIGHT,
|
||||||
Moves.STRUGGLE,
|
MoveId.STRUGGLE,
|
||||||
Moves.SUNNY_DAY,
|
MoveId.SUNNY_DAY,
|
||||||
Moves.TEATIME,
|
MoveId.TEATIME,
|
||||||
Moves.TRANSFORM,
|
MoveId.TRANSFORM,
|
||||||
Moves.WATER_SPORT,
|
MoveId.WATER_SPORT,
|
||||||
Moves.WIDE_GUARD,
|
MoveId.WIDE_GUARD,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/** Set of moves that can never have their type overridden by an ability like Pixilate or Normalize
|
/** Set of moves that can never have their type overridden by an ability like Pixilate or Normalize
|
||||||
*
|
*
|
||||||
* Excludes tera blast and tera starstorm, as these are only conditionally forbidden
|
* Excludes tera blast and tera starstorm, as these are only conditionally forbidden
|
||||||
*/
|
*/
|
||||||
export const noAbilityTypeOverrideMoves: ReadonlySet<Moves> = new Set([
|
export const noAbilityTypeOverrideMoves: ReadonlySet<MoveId> = new Set([
|
||||||
Moves.WEATHER_BALL,
|
MoveId.WEATHER_BALL,
|
||||||
Moves.JUDGMENT,
|
MoveId.JUDGMENT,
|
||||||
Moves.REVELATION_DANCE,
|
MoveId.REVELATION_DANCE,
|
||||||
Moves.MULTI_ATTACK,
|
MoveId.MULTI_ATTACK,
|
||||||
Moves.TERRAIN_PULSE,
|
MoveId.TERRAIN_PULSE,
|
||||||
Moves.NATURAL_GIFT,
|
MoveId.NATURAL_GIFT,
|
||||||
Moves.TECHNO_BLAST,
|
MoveId.TECHNO_BLAST,
|
||||||
Moves.HIDDEN_POWER,
|
MoveId.HIDDEN_POWER,
|
||||||
]);
|
]);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@ import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounte
|
|||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import { randSeedInt } from "#app/utils/common";
|
import { randSeedInt } from "#app/utils/common";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
@ -54,27 +54,27 @@ export const ATrainersTestEncounter: MysteryEncounter = MysteryEncounterBuilder.
|
|||||||
switch (randSeedInt(5)) {
|
switch (randSeedInt(5)) {
|
||||||
case 1:
|
case 1:
|
||||||
trainerType = TrainerType.CHERYL;
|
trainerType = TrainerType.CHERYL;
|
||||||
spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY);
|
spriteKeys = getSpriteKeysFromSpecies(SpeciesId.BLISSEY);
|
||||||
trainerNameKey = "cheryl";
|
trainerNameKey = "cheryl";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
trainerType = TrainerType.MARLEY;
|
trainerType = TrainerType.MARLEY;
|
||||||
spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE);
|
spriteKeys = getSpriteKeysFromSpecies(SpeciesId.ARCANINE);
|
||||||
trainerNameKey = "marley";
|
trainerNameKey = "marley";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
trainerType = TrainerType.MIRA;
|
trainerType = TrainerType.MIRA;
|
||||||
spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1);
|
spriteKeys = getSpriteKeysFromSpecies(SpeciesId.ALAKAZAM, false, 1);
|
||||||
trainerNameKey = "mira";
|
trainerNameKey = "mira";
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
trainerType = TrainerType.RILEY;
|
trainerType = TrainerType.RILEY;
|
||||||
spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1);
|
spriteKeys = getSpriteKeysFromSpecies(SpeciesId.LUCARIO, false, 1);
|
||||||
trainerNameKey = "riley";
|
trainerNameKey = "riley";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
trainerType = TrainerType.BUCK;
|
trainerType = TrainerType.BUCK;
|
||||||
spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL);
|
spriteKeys = getSpriteKeysFromSpecies(SpeciesId.CLAYDOL);
|
||||||
trainerNameKey = "buck";
|
trainerNameKey = "buck";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ import { EnemyPokemon, PokemonMove } from "#app/field/pokemon";
|
|||||||
import type { BerryModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
import type { BerryModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
||||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
@ -22,7 +22,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
|||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { BerryModifier, PokemonInstantReviveModifier } from "#app/modifier/modifier";
|
import { BerryModifier, PokemonInstantReviveModifier } from "#app/modifier/modifier";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { randInt } from "#app/utils/common";
|
import { randInt } from "#app/utils/common";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
@ -59,7 +59,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
// This sprite has the shadow
|
// This sprite has the shadow
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.GREEDENT,
|
species: SpeciesId.GREEDENT,
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
alpha: 0.001,
|
alpha: 0.001,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
@ -68,7 +68,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
{
|
{
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.GREEDENT,
|
species: SpeciesId.GREEDENT,
|
||||||
hasShadow: false,
|
hasShadow: false,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
x: -5,
|
x: -5,
|
||||||
@ -228,11 +228,11 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
levelAdditiveModifier: 1,
|
levelAdditiveModifier: 1,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.GREEDENT),
|
species: getPokemonSpecies(SpeciesId.GREEDENT),
|
||||||
isBoss: true,
|
isBoss: true,
|
||||||
bossSegments: 3,
|
bossSegments: 3,
|
||||||
shiny: false, // Shiny lock because of consistency issues between the different options
|
shiny: false, // Shiny lock because of consistency issues between the different options
|
||||||
moveSet: [Moves.THRASH, Moves.CRUNCH, Moves.BODY_PRESS, Moves.SLACK_OFF],
|
moveSet: [MoveId.THRASH, MoveId.CRUNCH, MoveId.BODY_PRESS, MoveId.SLACK_OFF],
|
||||||
modifierConfigs: bossModifierConfigs,
|
modifierConfigs: bossModifierConfigs,
|
||||||
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
|
tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON],
|
||||||
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
|
mysteryEncounterBattleEffects: (pokemon: Pokemon) => {
|
||||||
@ -246,7 +246,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
};
|
};
|
||||||
|
|
||||||
encounter.enemyPartyConfigs = [config];
|
encounter.enemyPartyConfigs = [config];
|
||||||
encounter.setDialogueToken("greedentName", getPokemonSpecies(Species.GREEDENT).getName());
|
encounter.setDialogueToken("greedentName", getPokemonSpecies(SpeciesId.GREEDENT).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -302,7 +302,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
encounter.startOfBattleEffects.push({
|
encounter.startOfBattleEffects.push({
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.ENEMY],
|
targets: [BattlerIndex.ENEMY],
|
||||||
move: new PokemonMove(Moves.STUFF_CHEEKS),
|
move: new PokemonMove(MoveId.STUFF_CHEEKS),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -373,12 +373,12 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
// Let it have the food
|
// Let it have the food
|
||||||
// Greedent joins the team, level equal to 2 below highest party member (shiny locked)
|
// Greedent joins the team, level equal to 2 below highest party member (shiny locked)
|
||||||
const level = getHighestLevelPlayerPokemon(false, true).level - 2;
|
const level = getHighestLevelPlayerPokemon(false, true).level - 2;
|
||||||
const greedent = new EnemyPokemon(getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false, true);
|
const greedent = new EnemyPokemon(getPokemonSpecies(SpeciesId.GREEDENT), level, TrainerSlot.NONE, false, true);
|
||||||
greedent.moveset = [
|
greedent.moveset = [
|
||||||
new PokemonMove(Moves.THRASH),
|
new PokemonMove(MoveId.THRASH),
|
||||||
new PokemonMove(Moves.BODY_PRESS),
|
new PokemonMove(MoveId.BODY_PRESS),
|
||||||
new PokemonMove(Moves.STUFF_CHEEKS),
|
new PokemonMove(MoveId.STUFF_CHEEKS),
|
||||||
new PokemonMove(Moves.SLACK_OFF),
|
new PokemonMove(MoveId.SLACK_OFF),
|
||||||
];
|
];
|
||||||
greedent.passive = true;
|
greedent.passive = true;
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import {
|
|||||||
} from "#app/data/mystery-encounters/utils/encounter-phase-utils";
|
} from "#app/data/mystery-encounters/utils/encounter-phase-utils";
|
||||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
@ -50,7 +50,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterB
|
|||||||
.withScenePartySizeRequirement(2, 6, true) // 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: SpeciesId.LIEPARD.toString(),
|
||||||
fileRoot: "pokemon",
|
fileRoot: "pokemon",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
@ -112,7 +112,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterB
|
|||||||
|
|
||||||
const shinyCharm = generateModifierType(modifierTypes.SHINY_CHARM);
|
const shinyCharm = generateModifierType(modifierTypes.SHINY_CHARM);
|
||||||
encounter.setDialogueToken("itemName", shinyCharm?.name ?? i18next.t("modifierType:ModifierType.SHINY_CHARM.name"));
|
encounter.setDialogueToken("itemName", shinyCharm?.name ?? i18next.t("modifierType:ModifierType.SHINY_CHARM.name"));
|
||||||
encounter.setDialogueToken("liepardName", getPokemonSpecies(Species.LIEPARD).getName());
|
encounter.setDialogueToken("liepardName", getPokemonSpecies(SpeciesId.LIEPARD).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -167,7 +167,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterB
|
|||||||
// Update money and remove pokemon from party
|
// Update money and remove pokemon from party
|
||||||
updatePlayerMoney(encounter.misc.price);
|
updatePlayerMoney(encounter.misc.price);
|
||||||
|
|
||||||
setEncounterExp(encounter.options[1].primaryPokemon!.id, getPokemonSpecies(Species.LIEPARD).baseExp, true);
|
setEncounterExp(encounter.options[1].primaryPokemon!.id, getPokemonSpecies(SpeciesId.LIEPARD).baseExp, true);
|
||||||
|
|
||||||
leaveEncounterWithoutBattle(true);
|
leaveEncounterWithoutBattle(true);
|
||||||
})
|
})
|
||||||
|
@ -21,13 +21,13 @@ import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounte
|
|||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import type { PlayerPokemon } from "#app/field/pokemon";
|
import type { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import type Pokemon from "#app/field/pokemon";
|
import type Pokemon from "#app/field/pokemon";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
import { getEncounterText, showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { getEncounterText, showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { LearnMovePhase } from "#app/phases/learn-move-phase";
|
import { LearnMovePhase } from "#app/phases/learn-move-phase";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
||||||
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";
|
||||||
@ -59,110 +59,116 @@ import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/enc
|
|||||||
const namespace = "mysteryEncounters/bugTypeSuperfan";
|
const namespace = "mysteryEncounters/bugTypeSuperfan";
|
||||||
|
|
||||||
const POOL_1_POKEMON = [
|
const POOL_1_POKEMON = [
|
||||||
Species.PARASECT,
|
SpeciesId.PARASECT,
|
||||||
Species.VENOMOTH,
|
SpeciesId.VENOMOTH,
|
||||||
Species.LEDIAN,
|
SpeciesId.LEDIAN,
|
||||||
Species.ARIADOS,
|
SpeciesId.ARIADOS,
|
||||||
Species.YANMA,
|
SpeciesId.YANMA,
|
||||||
Species.BEAUTIFLY,
|
SpeciesId.BEAUTIFLY,
|
||||||
Species.DUSTOX,
|
SpeciesId.DUSTOX,
|
||||||
Species.MASQUERAIN,
|
SpeciesId.MASQUERAIN,
|
||||||
Species.NINJASK,
|
SpeciesId.NINJASK,
|
||||||
Species.VOLBEAT,
|
SpeciesId.VOLBEAT,
|
||||||
Species.ILLUMISE,
|
SpeciesId.ILLUMISE,
|
||||||
Species.ANORITH,
|
SpeciesId.ANORITH,
|
||||||
Species.KRICKETUNE,
|
SpeciesId.KRICKETUNE,
|
||||||
Species.WORMADAM,
|
SpeciesId.WORMADAM,
|
||||||
Species.MOTHIM,
|
SpeciesId.MOTHIM,
|
||||||
Species.SKORUPI,
|
SpeciesId.SKORUPI,
|
||||||
Species.JOLTIK,
|
SpeciesId.JOLTIK,
|
||||||
Species.LARVESTA,
|
SpeciesId.LARVESTA,
|
||||||
Species.VIVILLON,
|
SpeciesId.VIVILLON,
|
||||||
Species.CHARJABUG,
|
SpeciesId.CHARJABUG,
|
||||||
Species.RIBOMBEE,
|
SpeciesId.RIBOMBEE,
|
||||||
Species.SPIDOPS,
|
SpeciesId.SPIDOPS,
|
||||||
Species.LOKIX,
|
SpeciesId.LOKIX,
|
||||||
];
|
];
|
||||||
|
|
||||||
const POOL_2_POKEMON = [
|
const POOL_2_POKEMON = [
|
||||||
Species.SCYTHER,
|
SpeciesId.SCYTHER,
|
||||||
Species.PINSIR,
|
SpeciesId.PINSIR,
|
||||||
Species.HERACROSS,
|
SpeciesId.HERACROSS,
|
||||||
Species.FORRETRESS,
|
SpeciesId.FORRETRESS,
|
||||||
Species.SCIZOR,
|
SpeciesId.SCIZOR,
|
||||||
Species.SHUCKLE,
|
SpeciesId.SHUCKLE,
|
||||||
Species.SHEDINJA,
|
SpeciesId.SHEDINJA,
|
||||||
Species.ARMALDO,
|
SpeciesId.ARMALDO,
|
||||||
Species.VESPIQUEN,
|
SpeciesId.VESPIQUEN,
|
||||||
Species.DRAPION,
|
SpeciesId.DRAPION,
|
||||||
Species.YANMEGA,
|
SpeciesId.YANMEGA,
|
||||||
Species.LEAVANNY,
|
SpeciesId.LEAVANNY,
|
||||||
Species.SCOLIPEDE,
|
SpeciesId.SCOLIPEDE,
|
||||||
Species.CRUSTLE,
|
SpeciesId.CRUSTLE,
|
||||||
Species.ESCAVALIER,
|
SpeciesId.ESCAVALIER,
|
||||||
Species.ACCELGOR,
|
SpeciesId.ACCELGOR,
|
||||||
Species.GALVANTULA,
|
SpeciesId.GALVANTULA,
|
||||||
Species.VIKAVOLT,
|
SpeciesId.VIKAVOLT,
|
||||||
Species.ARAQUANID,
|
SpeciesId.ARAQUANID,
|
||||||
Species.ORBEETLE,
|
SpeciesId.ORBEETLE,
|
||||||
Species.CENTISKORCH,
|
SpeciesId.CENTISKORCH,
|
||||||
Species.FROSMOTH,
|
SpeciesId.FROSMOTH,
|
||||||
Species.KLEAVOR,
|
SpeciesId.KLEAVOR,
|
||||||
];
|
];
|
||||||
|
|
||||||
const POOL_3_POKEMON: { species: Species; formIndex?: number }[] = [
|
const POOL_3_POKEMON: { species: SpeciesId; formIndex?: number }[] = [
|
||||||
{
|
{
|
||||||
species: Species.PINSIR,
|
species: SpeciesId.PINSIR,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: Species.SCIZOR,
|
species: SpeciesId.SCIZOR,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: Species.HERACROSS,
|
species: SpeciesId.HERACROSS,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: Species.ORBEETLE,
|
species: SpeciesId.ORBEETLE,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: Species.CENTISKORCH,
|
species: SpeciesId.CENTISKORCH,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: Species.DURANT,
|
species: SpeciesId.DURANT,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: Species.VOLCARONA,
|
species: SpeciesId.VOLCARONA,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: Species.GOLISOPOD,
|
species: SpeciesId.GOLISOPOD,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const POOL_4_POKEMON = [Species.GENESECT, Species.SLITHER_WING, Species.BUZZWOLE, Species.PHEROMOSA];
|
const POOL_4_POKEMON = [SpeciesId.GENESECT, SpeciesId.SLITHER_WING, SpeciesId.BUZZWOLE, SpeciesId.PHEROMOSA];
|
||||||
|
|
||||||
const PHYSICAL_TUTOR_MOVES = [Moves.MEGAHORN, Moves.ATTACK_ORDER, Moves.BUG_BITE, Moves.FIRST_IMPRESSION, Moves.LUNGE];
|
const PHYSICAL_TUTOR_MOVES = [
|
||||||
|
MoveId.MEGAHORN,
|
||||||
|
MoveId.ATTACK_ORDER,
|
||||||
|
MoveId.BUG_BITE,
|
||||||
|
MoveId.FIRST_IMPRESSION,
|
||||||
|
MoveId.LUNGE,
|
||||||
|
];
|
||||||
|
|
||||||
const SPECIAL_TUTOR_MOVES = [
|
const SPECIAL_TUTOR_MOVES = [
|
||||||
Moves.SILVER_WIND,
|
MoveId.SILVER_WIND,
|
||||||
Moves.SIGNAL_BEAM,
|
MoveId.SIGNAL_BEAM,
|
||||||
Moves.BUG_BUZZ,
|
MoveId.BUG_BUZZ,
|
||||||
Moves.POLLEN_PUFF,
|
MoveId.POLLEN_PUFF,
|
||||||
Moves.STRUGGLE_BUG,
|
MoveId.STRUGGLE_BUG,
|
||||||
];
|
];
|
||||||
|
|
||||||
const STATUS_TUTOR_MOVES = [
|
const STATUS_TUTOR_MOVES = [
|
||||||
Moves.STRING_SHOT,
|
MoveId.STRING_SHOT,
|
||||||
Moves.DEFEND_ORDER,
|
MoveId.DEFEND_ORDER,
|
||||||
Moves.RAGE_POWDER,
|
MoveId.RAGE_POWDER,
|
||||||
Moves.STICKY_WEB,
|
MoveId.STICKY_WEB,
|
||||||
Moves.SILK_TRAP,
|
MoveId.SILK_TRAP,
|
||||||
];
|
];
|
||||||
|
|
||||||
const MISC_TUTOR_MOVES = [Moves.LEECH_LIFE, Moves.U_TURN, Moves.HEAL_ORDER, Moves.QUIVER_DANCE, Moves.INFESTATION];
|
const MISC_TUTOR_MOVES = [MoveId.LEECH_LIFE, MoveId.U_TURN, MoveId.HEAL_ORDER, MoveId.QUIVER_DANCE, MoveId.INFESTATION];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wave breakpoints that determine how strong to make the Bug-Type Superfan's team
|
* Wave breakpoints that determine how strong to make the Bug-Type Superfan's team
|
||||||
@ -213,12 +219,12 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
|
|
||||||
let beedrillKeys: { spriteKey: string; fileRoot: string }, butterfreeKeys: { spriteKey: string; fileRoot: string };
|
let beedrillKeys: { spriteKey: string; fileRoot: string }, butterfreeKeys: { spriteKey: string; fileRoot: string };
|
||||||
if (globalScene.currentBattle.waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) {
|
if (globalScene.currentBattle.waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) {
|
||||||
beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false);
|
beedrillKeys = getSpriteKeysFromSpecies(SpeciesId.BEEDRILL, false);
|
||||||
butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false);
|
butterfreeKeys = getSpriteKeysFromSpecies(SpeciesId.BUTTERFREE, false);
|
||||||
} else {
|
} else {
|
||||||
// Mega Beedrill/Gmax Butterfree
|
// Mega Beedrill/Gmax Butterfree
|
||||||
beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false, 1);
|
beedrillKeys = getSpriteKeysFromSpecies(SpeciesId.BEEDRILL, false, 1);
|
||||||
butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false, 1);
|
butterfreeKeys = getSpriteKeysFromSpecies(SpeciesId.BUTTERFREE, false, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
encounter.spriteConfigs = [
|
encounter.spriteConfigs = [
|
||||||
@ -519,26 +525,26 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
if (waveIndex < WAVE_LEVEL_BREAKPOINTS[0]) {
|
if (waveIndex < WAVE_LEVEL_BREAKPOINTS[0]) {
|
||||||
// Use default template (2 AVG)
|
// Use default template (2 AVG)
|
||||||
config
|
config
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true));
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true));
|
||||||
} else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[1]) {
|
} else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[1]) {
|
||||||
config
|
config
|
||||||
.setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE))
|
.setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE))
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true));
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true));
|
||||||
} else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[2]) {
|
} else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[2]) {
|
||||||
config
|
config
|
||||||
.setPartyTemplates(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE))
|
.setPartyTemplates(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE))
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true));
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true));
|
||||||
} else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) {
|
} else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) {
|
||||||
config
|
config
|
||||||
.setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE))
|
.setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE))
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true));
|
.setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true));
|
||||||
@ -547,7 +553,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
.setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE))
|
.setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE))
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
0,
|
0,
|
||||||
getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
@ -555,7 +561,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
)
|
)
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
1,
|
1,
|
||||||
getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
@ -580,7 +586,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
.setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE))
|
.setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE))
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
0,
|
0,
|
||||||
getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
@ -588,7 +594,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
)
|
)
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
1,
|
1,
|
||||||
getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
@ -625,7 +631,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
)
|
)
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
0,
|
0,
|
||||||
getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
@ -633,7 +639,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
)
|
)
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
1,
|
1,
|
||||||
getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
@ -663,7 +669,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
)
|
)
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
0,
|
0,
|
||||||
getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BEEDRILL], TrainerSlot.TRAINER, true, p => {
|
||||||
p.setBoss(true, 2);
|
p.setBoss(true, 2);
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
@ -672,7 +678,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
|||||||
)
|
)
|
||||||
.setPartyMemberFunc(
|
.setPartyMemberFunc(
|
||||||
1,
|
1,
|
||||||
getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
getRandomPartyMemberFunc([SpeciesId.BUTTERFREE], TrainerSlot.TRAINER, true, p => {
|
||||||
p.setBoss(true, 2);
|
p.setBoss(true, 2);
|
||||||
p.formIndex = 1;
|
p.formIndex = 1;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
|
@ -20,10 +20,10 @@ import { globalScene } from "#app/global-scene";
|
|||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import {
|
import {
|
||||||
applyAbilityOverrideToPokemon,
|
applyAbilityOverrideToPokemon,
|
||||||
applyModifierTypeToPlayerPokemon,
|
applyModifierTypeToPlayerPokemon,
|
||||||
@ -42,7 +42,7 @@ import { Ability } from "#app/data/abilities/ability-class";
|
|||||||
import { BerryModifier } from "#app/modifier/modifier";
|
import { BerryModifier } from "#app/modifier/modifier";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { EncounterBattleAnim } from "#app/data/battle-anims";
|
import { EncounterBattleAnim } from "#app/data/battle-anims";
|
||||||
import { MoveCategory } from "#enums/MoveCategory";
|
import { MoveCategory } from "#enums/MoveCategory";
|
||||||
import { CustomPokemonData } from "#app/data/custom-pokemon-data";
|
import { CustomPokemonData } from "#app/data/custom-pokemon-data";
|
||||||
@ -54,21 +54,21 @@ import { Challenges } from "#enums/challenges";
|
|||||||
const namespace = "mysteryEncounters/clowningAround";
|
const namespace = "mysteryEncounters/clowningAround";
|
||||||
|
|
||||||
const RANDOM_ABILITY_POOL = [
|
const RANDOM_ABILITY_POOL = [
|
||||||
Abilities.STURDY,
|
AbilityId.STURDY,
|
||||||
Abilities.PICKUP,
|
AbilityId.PICKUP,
|
||||||
Abilities.INTIMIDATE,
|
AbilityId.INTIMIDATE,
|
||||||
Abilities.GUTS,
|
AbilityId.GUTS,
|
||||||
Abilities.DROUGHT,
|
AbilityId.DROUGHT,
|
||||||
Abilities.DRIZZLE,
|
AbilityId.DRIZZLE,
|
||||||
Abilities.SNOW_WARNING,
|
AbilityId.SNOW_WARNING,
|
||||||
Abilities.SAND_STREAM,
|
AbilityId.SAND_STREAM,
|
||||||
Abilities.ELECTRIC_SURGE,
|
AbilityId.ELECTRIC_SURGE,
|
||||||
Abilities.PSYCHIC_SURGE,
|
AbilityId.PSYCHIC_SURGE,
|
||||||
Abilities.GRASSY_SURGE,
|
AbilityId.GRASSY_SURGE,
|
||||||
Abilities.MISTY_SURGE,
|
AbilityId.MISTY_SURGE,
|
||||||
Abilities.MAGICIAN,
|
AbilityId.MAGICIAN,
|
||||||
Abilities.SHEER_FORCE,
|
AbilityId.SHEER_FORCE,
|
||||||
Abilities.PRANKSTER,
|
AbilityId.PRANKSTER,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,7 +86,7 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
.withAutoHideIntroVisuals(false)
|
.withAutoHideIntroVisuals(false)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: Species.MR_MIME.toString(),
|
spriteKey: SpeciesId.MR_MIME.toString(),
|
||||||
fileRoot: "pokemon",
|
fileRoot: "pokemon",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
@ -96,7 +96,7 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
yShadow: -3,
|
yShadow: -3,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
spriteKey: Species.BLACEPHALON.toString(),
|
spriteKey: SpeciesId.BLACEPHALON.toString(),
|
||||||
fileRoot: "pokemon/exp",
|
fileRoot: "pokemon/exp",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
@ -154,28 +154,28 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
// Overrides first 2 pokemon to be Mr. Mime and Blacephalon
|
// Overrides first 2 pokemon to be Mr. Mime and Blacephalon
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.MR_MIME),
|
species: getPokemonSpecies(SpeciesId.MR_MIME),
|
||||||
isBoss: true,
|
isBoss: true,
|
||||||
moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC],
|
moveSet: [MoveId.TEETER_DANCE, MoveId.ALLY_SWITCH, MoveId.DAZZLING_GLEAM, MoveId.PSYCHIC],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter
|
// Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter
|
||||||
species: getPokemonSpecies(Species.BLACEPHALON),
|
species: getPokemonSpecies(SpeciesId.BLACEPHALON),
|
||||||
customPokemonData: new CustomPokemonData({
|
customPokemonData: new CustomPokemonData({
|
||||||
ability: ability,
|
ability: ability,
|
||||||
types: [firstType, secondType],
|
types: [firstType, secondType],
|
||||||
}),
|
}),
|
||||||
isBoss: true,
|
isBoss: true,
|
||||||
moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN],
|
moveSet: [MoveId.TRICK, MoveId.HYPNOSIS, MoveId.SHADOW_BALL, MoveId.MIND_BLOWN],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
doubleBattle: true,
|
doubleBattle: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Load animations/sfx for start of fight moves
|
// Load animations/sfx for start of fight moves
|
||||||
loadCustomMovesForEncounter([Moves.ROLE_PLAY, Moves.TAUNT]);
|
loadCustomMovesForEncounter([MoveId.ROLE_PLAY, MoveId.TAUNT]);
|
||||||
|
|
||||||
encounter.setDialogueToken("blacephalonName", getPokemonSpecies(Species.BLACEPHALON).getName());
|
encounter.setDialogueToken("blacephalonName", getPokemonSpecies(SpeciesId.BLACEPHALON).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -208,19 +208,19 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
// Mr. Mime copies the Blacephalon's random ability
|
// Mr. Mime copies the Blacephalon's random ability
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.ENEMY_2],
|
targets: [BattlerIndex.ENEMY_2],
|
||||||
move: new PokemonMove(Moves.ROLE_PLAY),
|
move: new PokemonMove(MoveId.ROLE_PLAY),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY_2,
|
sourceBattlerIndex: BattlerIndex.ENEMY_2,
|
||||||
targets: [BattlerIndex.PLAYER],
|
targets: [BattlerIndex.PLAYER],
|
||||||
move: new PokemonMove(Moves.TAUNT),
|
move: new PokemonMove(MoveId.TAUNT),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY_2,
|
sourceBattlerIndex: BattlerIndex.ENEMY_2,
|
||||||
targets: [BattlerIndex.PLAYER_2],
|
targets: [BattlerIndex.PLAYER_2],
|
||||||
move: new PokemonMove(Moves.TAUNT),
|
move: new PokemonMove(MoveId.TAUNT),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -31,14 +31,14 @@ import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
|||||||
import PokemonData from "#app/system/pokemon-data";
|
import PokemonData from "#app/system/pokemon-data";
|
||||||
import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { EncounterAnim } from "#enums/encounter-anims";
|
import { EncounterAnim } from "#enums/encounter-anims";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { PokeballType } from "#enums/pokeball";
|
import { PokeballType } from "#enums/pokeball";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
|
|
||||||
@ -47,46 +47,46 @@ const namespace = "mysteryEncounters/dancingLessons";
|
|||||||
|
|
||||||
// Fire form
|
// Fire form
|
||||||
const BAILE_STYLE_BIOMES = [
|
const BAILE_STYLE_BIOMES = [
|
||||||
Biome.VOLCANO,
|
BiomeId.VOLCANO,
|
||||||
Biome.BEACH,
|
BiomeId.BEACH,
|
||||||
Biome.ISLAND,
|
BiomeId.ISLAND,
|
||||||
Biome.WASTELAND,
|
BiomeId.WASTELAND,
|
||||||
Biome.MOUNTAIN,
|
BiomeId.MOUNTAIN,
|
||||||
Biome.BADLANDS,
|
BiomeId.BADLANDS,
|
||||||
Biome.DESERT,
|
BiomeId.DESERT,
|
||||||
];
|
];
|
||||||
|
|
||||||
// Electric form
|
// Electric form
|
||||||
const POM_POM_STYLE_BIOMES = [
|
const POM_POM_STYLE_BIOMES = [
|
||||||
Biome.CONSTRUCTION_SITE,
|
BiomeId.CONSTRUCTION_SITE,
|
||||||
Biome.POWER_PLANT,
|
BiomeId.POWER_PLANT,
|
||||||
Biome.FACTORY,
|
BiomeId.FACTORY,
|
||||||
Biome.LABORATORY,
|
BiomeId.LABORATORY,
|
||||||
Biome.SLUM,
|
BiomeId.SLUM,
|
||||||
Biome.METROPOLIS,
|
BiomeId.METROPOLIS,
|
||||||
Biome.DOJO,
|
BiomeId.DOJO,
|
||||||
];
|
];
|
||||||
|
|
||||||
// Psychic form
|
// Psychic form
|
||||||
const PAU_STYLE_BIOMES = [
|
const PAU_STYLE_BIOMES = [
|
||||||
Biome.JUNGLE,
|
BiomeId.JUNGLE,
|
||||||
Biome.FAIRY_CAVE,
|
BiomeId.FAIRY_CAVE,
|
||||||
Biome.MEADOW,
|
BiomeId.MEADOW,
|
||||||
Biome.PLAINS,
|
BiomeId.PLAINS,
|
||||||
Biome.GRASS,
|
BiomeId.GRASS,
|
||||||
Biome.TALL_GRASS,
|
BiomeId.TALL_GRASS,
|
||||||
Biome.FOREST,
|
BiomeId.FOREST,
|
||||||
];
|
];
|
||||||
|
|
||||||
// Ghost form
|
// Ghost form
|
||||||
const SENSU_STYLE_BIOMES = [
|
const SENSU_STYLE_BIOMES = [
|
||||||
Biome.RUINS,
|
BiomeId.RUINS,
|
||||||
Biome.SWAMP,
|
BiomeId.SWAMP,
|
||||||
Biome.CAVE,
|
BiomeId.CAVE,
|
||||||
Biome.ABYSS,
|
BiomeId.ABYSS,
|
||||||
Biome.GRAVEYARD,
|
BiomeId.GRAVEYARD,
|
||||||
Biome.LAKE,
|
BiomeId.LAKE,
|
||||||
Biome.TEMPLE,
|
BiomeId.TEMPLE,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -127,14 +127,14 @@ export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
.withOnInit(() => {
|
.withOnInit(() => {
|
||||||
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
||||||
|
|
||||||
const species = getPokemonSpecies(Species.ORICORIO);
|
const species = getPokemonSpecies(SpeciesId.ORICORIO);
|
||||||
const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER);
|
const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER);
|
||||||
const enemyPokemon = new EnemyPokemon(species, level, TrainerSlot.NONE, false);
|
const enemyPokemon = new EnemyPokemon(species, level, TrainerSlot.NONE, false);
|
||||||
if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) {
|
if (!enemyPokemon.moveset.some(m => m && m.getMove().id === MoveId.REVELATION_DANCE)) {
|
||||||
if (enemyPokemon.moveset.length < 4) {
|
if (enemyPokemon.moveset.length < 4) {
|
||||||
enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE));
|
enemyPokemon.moveset.push(new PokemonMove(MoveId.REVELATION_DANCE));
|
||||||
} else {
|
} else {
|
||||||
enemyPokemon.moveset[0] = new PokemonMove(Moves.REVELATION_DANCE);
|
enemyPokemon.moveset[0] = new PokemonMove(MoveId.REVELATION_DANCE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
oricorioData,
|
oricorioData,
|
||||||
};
|
};
|
||||||
|
|
||||||
encounter.setDialogueToken("oricorioName", getPokemonSpecies(Species.ORICORIO).getName());
|
encounter.setDialogueToken("oricorioName", getPokemonSpecies(SpeciesId.ORICORIO).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -215,7 +215,7 @@ export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
encounter.startOfBattleEffects.push({
|
encounter.startOfBattleEffects.push({
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.PLAYER],
|
targets: [BattlerIndex.PLAYER],
|
||||||
move: new PokemonMove(Moves.REVELATION_DANCE),
|
move: new PokemonMove(MoveId.REVELATION_DANCE),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
const onPokemonSelected = (pokemon: PlayerPokemon) => {
|
||||||
encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender());
|
encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender());
|
||||||
globalScene.unshiftPhase(
|
globalScene.unshiftPhase(
|
||||||
new LearnMovePhase(globalScene.getPlayerParty().indexOf(pokemon), Moves.REVELATION_DANCE),
|
new LearnMovePhase(globalScene.getPlayerParty().indexOf(pokemon), MoveId.REVELATION_DANCE),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Play animation again to "learn" the dance
|
// Play animation again to "learn" the dance
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { PokemonType } from "#enums/pokemon-type";
|
import type { PokemonType } from "#enums/pokemon-type";
|
||||||
import { isNullOrUndefined, randSeedInt } from "#app/utils/common";
|
import { isNullOrUndefined, randSeedInt } from "#app/utils/common";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
@ -27,68 +27,68 @@ const namespace = "mysteryEncounters/darkDeal";
|
|||||||
|
|
||||||
/** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, and Mythicals */
|
/** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, and Mythicals */
|
||||||
const excludedBosses = [
|
const excludedBosses = [
|
||||||
Species.NECROZMA,
|
SpeciesId.NECROZMA,
|
||||||
Species.COSMOG,
|
SpeciesId.COSMOG,
|
||||||
Species.COSMOEM,
|
SpeciesId.COSMOEM,
|
||||||
Species.SOLGALEO,
|
SpeciesId.SOLGALEO,
|
||||||
Species.LUNALA,
|
SpeciesId.LUNALA,
|
||||||
Species.ETERNATUS,
|
SpeciesId.ETERNATUS,
|
||||||
Species.NIHILEGO,
|
SpeciesId.NIHILEGO,
|
||||||
Species.BUZZWOLE,
|
SpeciesId.BUZZWOLE,
|
||||||
Species.PHEROMOSA,
|
SpeciesId.PHEROMOSA,
|
||||||
Species.XURKITREE,
|
SpeciesId.XURKITREE,
|
||||||
Species.CELESTEELA,
|
SpeciesId.CELESTEELA,
|
||||||
Species.KARTANA,
|
SpeciesId.KARTANA,
|
||||||
Species.GUZZLORD,
|
SpeciesId.GUZZLORD,
|
||||||
Species.POIPOLE,
|
SpeciesId.POIPOLE,
|
||||||
Species.NAGANADEL,
|
SpeciesId.NAGANADEL,
|
||||||
Species.STAKATAKA,
|
SpeciesId.STAKATAKA,
|
||||||
Species.BLACEPHALON,
|
SpeciesId.BLACEPHALON,
|
||||||
Species.GREAT_TUSK,
|
SpeciesId.GREAT_TUSK,
|
||||||
Species.SCREAM_TAIL,
|
SpeciesId.SCREAM_TAIL,
|
||||||
Species.BRUTE_BONNET,
|
SpeciesId.BRUTE_BONNET,
|
||||||
Species.FLUTTER_MANE,
|
SpeciesId.FLUTTER_MANE,
|
||||||
Species.SLITHER_WING,
|
SpeciesId.SLITHER_WING,
|
||||||
Species.SANDY_SHOCKS,
|
SpeciesId.SANDY_SHOCKS,
|
||||||
Species.ROARING_MOON,
|
SpeciesId.ROARING_MOON,
|
||||||
Species.KORAIDON,
|
SpeciesId.KORAIDON,
|
||||||
Species.WALKING_WAKE,
|
SpeciesId.WALKING_WAKE,
|
||||||
Species.GOUGING_FIRE,
|
SpeciesId.GOUGING_FIRE,
|
||||||
Species.RAGING_BOLT,
|
SpeciesId.RAGING_BOLT,
|
||||||
Species.IRON_TREADS,
|
SpeciesId.IRON_TREADS,
|
||||||
Species.IRON_BUNDLE,
|
SpeciesId.IRON_BUNDLE,
|
||||||
Species.IRON_HANDS,
|
SpeciesId.IRON_HANDS,
|
||||||
Species.IRON_JUGULIS,
|
SpeciesId.IRON_JUGULIS,
|
||||||
Species.IRON_MOTH,
|
SpeciesId.IRON_MOTH,
|
||||||
Species.IRON_THORNS,
|
SpeciesId.IRON_THORNS,
|
||||||
Species.IRON_VALIANT,
|
SpeciesId.IRON_VALIANT,
|
||||||
Species.MIRAIDON,
|
SpeciesId.MIRAIDON,
|
||||||
Species.IRON_LEAVES,
|
SpeciesId.IRON_LEAVES,
|
||||||
Species.IRON_BOULDER,
|
SpeciesId.IRON_BOULDER,
|
||||||
Species.IRON_CROWN,
|
SpeciesId.IRON_CROWN,
|
||||||
Species.MEW,
|
SpeciesId.MEW,
|
||||||
Species.CELEBI,
|
SpeciesId.CELEBI,
|
||||||
Species.DEOXYS,
|
SpeciesId.DEOXYS,
|
||||||
Species.JIRACHI,
|
SpeciesId.JIRACHI,
|
||||||
Species.DARKRAI,
|
SpeciesId.DARKRAI,
|
||||||
Species.PHIONE,
|
SpeciesId.PHIONE,
|
||||||
Species.MANAPHY,
|
SpeciesId.MANAPHY,
|
||||||
Species.ARCEUS,
|
SpeciesId.ARCEUS,
|
||||||
Species.SHAYMIN,
|
SpeciesId.SHAYMIN,
|
||||||
Species.VICTINI,
|
SpeciesId.VICTINI,
|
||||||
Species.MELOETTA,
|
SpeciesId.MELOETTA,
|
||||||
Species.KELDEO,
|
SpeciesId.KELDEO,
|
||||||
Species.GENESECT,
|
SpeciesId.GENESECT,
|
||||||
Species.DIANCIE,
|
SpeciesId.DIANCIE,
|
||||||
Species.HOOPA,
|
SpeciesId.HOOPA,
|
||||||
Species.VOLCANION,
|
SpeciesId.VOLCANION,
|
||||||
Species.MAGEARNA,
|
SpeciesId.MAGEARNA,
|
||||||
Species.MARSHADOW,
|
SpeciesId.MARSHADOW,
|
||||||
Species.ZERAORA,
|
SpeciesId.ZERAORA,
|
||||||
Species.ZARUDE,
|
SpeciesId.ZARUDE,
|
||||||
Species.MELTAN,
|
SpeciesId.MELTAN,
|
||||||
Species.MELMETAL,
|
SpeciesId.MELMETAL,
|
||||||
Species.PECHARUNT,
|
SpeciesId.PECHARUNT,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,7 +36,7 @@ import { randSeedItem } from "#app/utils/common";
|
|||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { timedEventManager } from "#app/global-event-manager";
|
import { timedEventManager } from "#app/global-event-manager";
|
||||||
|
|
||||||
/** the i18n namespace for this encounter */
|
/** the i18n namespace for this encounter */
|
||||||
@ -95,7 +95,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
|
|||||||
{
|
{
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.DELIBIRD,
|
species: SpeciesId.DELIBIRD,
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
startFrame: 38,
|
startFrame: 38,
|
||||||
@ -104,7 +104,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
|
|||||||
{
|
{
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.DELIBIRD,
|
species: SpeciesId.DELIBIRD,
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
scale: 1.06,
|
scale: 1.06,
|
||||||
@ -112,7 +112,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
|
|||||||
{
|
{
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.DELIBIRD,
|
species: SpeciesId.DELIBIRD,
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
startFrame: 65,
|
startFrame: 65,
|
||||||
@ -137,7 +137,7 @@ export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.with
|
|||||||
])
|
])
|
||||||
.withOnInit(() => {
|
.withOnInit(() => {
|
||||||
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
||||||
encounter.setDialogueToken("delibirdName", getPokemonSpecies(Species.DELIBIRD).getName());
|
encounter.setDialogueToken("delibirdName", getPokemonSpecies(SpeciesId.DELIBIRD).getName());
|
||||||
|
|
||||||
globalScene.loadBgm("mystery_encounter_delibirdy", "mystery_encounter_delibirdy.mp3");
|
globalScene.loadBgm("mystery_encounter_delibirdy", "mystery_encounter_delibirdy.mp3");
|
||||||
return true;
|
return true;
|
||||||
|
@ -6,7 +6,7 @@ import type { ModifierTypeFunc } from "#app/modifier/modifier-type";
|
|||||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import { randSeedInt } from "#app/utils/common";
|
import { randSeedInt } from "#app/utils/common";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
@ -35,7 +35,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu
|
|||||||
{
|
{
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.FURFROU,
|
species: SpeciesId.FURFROU,
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
x: 30,
|
x: 30,
|
||||||
|
@ -20,14 +20,14 @@ import {
|
|||||||
CombinationPokemonRequirement,
|
CombinationPokemonRequirement,
|
||||||
TypeRequirement,
|
TypeRequirement,
|
||||||
} from "#app/data/mystery-encounters/mystery-encounter-requirements";
|
} from "#app/data/mystery-encounters/mystery-encounter-requirements";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Gender } from "#app/data/gender";
|
import { Gender } from "#app/data/gender";
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import type Pokemon from "#app/field/pokemon";
|
import type Pokemon from "#app/field/pokemon";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { EncounterBattleAnim } from "#app/data/battle-anims";
|
import { EncounterBattleAnim } from "#app/data/battle-anims";
|
||||||
import { WeatherType } from "#enums/weather-type";
|
import { WeatherType } from "#enums/weather-type";
|
||||||
import { isNullOrUndefined, randSeedInt } from "#app/utils/common";
|
import { isNullOrUndefined, randSeedInt } from "#app/utils/common";
|
||||||
@ -42,7 +42,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
|||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { EncounterAnim } from "#enums/encounter-anims";
|
import { EncounterAnim } from "#enums/encounter-anims";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
@ -83,7 +83,7 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
|
|||||||
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
||||||
|
|
||||||
// Calculate boss mons
|
// Calculate boss mons
|
||||||
const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA);
|
const volcaronaSpecies = getPokemonSpecies(SpeciesId.VOLCARONA);
|
||||||
const config: EnemyPartyConfig = {
|
const config: EnemyPartyConfig = {
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
@ -119,7 +119,7 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
|
|||||||
{
|
{
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.VOLCARONA,
|
species: SpeciesId.VOLCARONA,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
hidden: true,
|
hidden: true,
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
@ -129,7 +129,7 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
|
|||||||
{
|
{
|
||||||
spriteKey: "",
|
spriteKey: "",
|
||||||
fileRoot: "",
|
fileRoot: "",
|
||||||
species: Species.VOLCARONA,
|
species: SpeciesId.VOLCARONA,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
hidden: true,
|
hidden: true,
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
@ -138,12 +138,12 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Load animations/sfx for Volcarona moves
|
// Load animations/sfx for Volcarona moves
|
||||||
loadCustomMovesForEncounter([Moves.FIRE_SPIN, Moves.QUIVER_DANCE]);
|
loadCustomMovesForEncounter([MoveId.FIRE_SPIN, MoveId.QUIVER_DANCE]);
|
||||||
|
|
||||||
const pokemon = globalScene.getEnemyPokemon();
|
const pokemon = globalScene.getEnemyPokemon();
|
||||||
globalScene.arena.trySetWeather(WeatherType.SUNNY, pokemon);
|
globalScene.arena.trySetWeather(WeatherType.SUNNY, pokemon);
|
||||||
|
|
||||||
encounter.setDialogueToken("volcaronaName", getPokemonSpecies(Species.VOLCARONA).getName());
|
encounter.setDialogueToken("volcaronaName", getPokemonSpecies(SpeciesId.VOLCARONA).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -193,13 +193,13 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
|
|||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.PLAYER],
|
targets: [BattlerIndex.PLAYER],
|
||||||
move: new PokemonMove(Moves.FIRE_SPIN),
|
move: new PokemonMove(MoveId.FIRE_SPIN),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY_2,
|
sourceBattlerIndex: BattlerIndex.ENEMY_2,
|
||||||
targets: [BattlerIndex.PLAYER_2],
|
targets: [BattlerIndex.PLAYER_2],
|
||||||
move: new PokemonMove(Moves.FIRE_SPIN),
|
move: new PokemonMove(MoveId.FIRE_SPIN),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@ -239,11 +239,11 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
|
|||||||
if (chosenPokemon.trySetStatus(StatusEffect.BURN)) {
|
if (chosenPokemon.trySetStatus(StatusEffect.BURN)) {
|
||||||
// Burn applied
|
// Burn applied
|
||||||
encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender());
|
encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender());
|
||||||
encounter.setDialogueToken("abilityName", new Ability(Abilities.HEATPROOF, 3).name);
|
encounter.setDialogueToken("abilityName", new Ability(AbilityId.HEATPROOF, 3).name);
|
||||||
queueEncounterMessage(`${namespace}:option.2.target_burned`);
|
queueEncounterMessage(`${namespace}:option.2.target_burned`);
|
||||||
|
|
||||||
// Also permanently change the burned Pokemon's ability to Heatproof
|
// Also permanently change the burned Pokemon's ability to Heatproof
|
||||||
applyAbilityOverrideToPokemon(chosenPokemon, Abilities.HEATPROOF);
|
applyAbilityOverrideToPokemon(chosenPokemon, AbilityId.HEATPROOF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.w
|
|||||||
|
|
||||||
const primary = encounter.options[2].primaryPokemon!;
|
const primary = encounter.options[2].primaryPokemon!;
|
||||||
|
|
||||||
setEncounterExp([primary.id], getPokemonSpecies(Species.VOLCARONA).baseExp * 2);
|
setEncounterExp([primary.id], getPokemonSpecies(SpeciesId.VOLCARONA).baseExp * 2);
|
||||||
leaveEncounterWithoutBattle();
|
leaveEncounterWithoutBattle();
|
||||||
})
|
})
|
||||||
.build(),
|
.build(),
|
||||||
|
@ -19,7 +19,7 @@ import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter
|
|||||||
import { 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 { SpeciesId } from "#enums/species-id";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
@ -91,7 +91,7 @@ export const FunAndGamesEncounter: MysteryEncounter = MysteryEncounterBuilder.wi
|
|||||||
.withOnInit(() => {
|
.withOnInit(() => {
|
||||||
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
||||||
globalScene.loadBgm("mystery_encounter_fun_and_games", "mystery_encounter_fun_and_games.mp3");
|
globalScene.loadBgm("mystery_encounter_fun_and_games", "mystery_encounter_fun_and_games.mp3");
|
||||||
encounter.setDialogueToken("wobbuffetName", getPokemonSpecies(Species.WOBBUFFET).getName());
|
encounter.setDialogueToken("wobbuffetName", getPokemonSpecies(SpeciesId.WOBBUFFET).getName());
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
.withOnVisualsStart(() => {
|
.withOnVisualsStart(() => {
|
||||||
@ -214,7 +214,7 @@ async function summonPlayerPokemon() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Also loads Wobbuffet data (cannot be shiny)
|
// Also loads Wobbuffet data (cannot be shiny)
|
||||||
const enemySpecies = getPokemonSpecies(Species.WOBBUFFET);
|
const enemySpecies = getPokemonSpecies(SpeciesId.WOBBUFFET);
|
||||||
globalScene.currentBattle.enemyParty = [];
|
globalScene.currentBattle.enemyParty = [];
|
||||||
const wobbuffet = globalScene.addEnemyPokemon(
|
const wobbuffet = globalScene.addEnemyPokemon(
|
||||||
enemySpecies,
|
enemySpecies,
|
||||||
|
@ -17,7 +17,7 @@ import { globalScene } from "#app/global-scene";
|
|||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import type PokemonSpecies from "#app/data/pokemon-species";
|
import type PokemonSpecies from "#app/data/pokemon-species";
|
||||||
import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species";
|
import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { getTypeRgb } from "#app/data/type";
|
import { getTypeRgb } from "#app/data/type";
|
||||||
@ -64,39 +64,39 @@ const WONDER_TRADE_SHINY_CHANCE = 512;
|
|||||||
const MAX_WONDER_TRADE_SHINY_CHANCE = 4096;
|
const MAX_WONDER_TRADE_SHINY_CHANCE = 4096;
|
||||||
|
|
||||||
const LEGENDARY_TRADE_POOLS = {
|
const LEGENDARY_TRADE_POOLS = {
|
||||||
1: [Species.RATTATA, Species.PIDGEY, Species.WEEDLE],
|
1: [SpeciesId.RATTATA, SpeciesId.PIDGEY, SpeciesId.WEEDLE],
|
||||||
2: [Species.SENTRET, Species.HOOTHOOT, Species.LEDYBA],
|
2: [SpeciesId.SENTRET, SpeciesId.HOOTHOOT, SpeciesId.LEDYBA],
|
||||||
3: [Species.POOCHYENA, Species.ZIGZAGOON, Species.TAILLOW],
|
3: [SpeciesId.POOCHYENA, SpeciesId.ZIGZAGOON, SpeciesId.TAILLOW],
|
||||||
4: [Species.BIDOOF, Species.STARLY, Species.KRICKETOT],
|
4: [SpeciesId.BIDOOF, SpeciesId.STARLY, SpeciesId.KRICKETOT],
|
||||||
5: [Species.PATRAT, Species.PURRLOIN, Species.PIDOVE],
|
5: [SpeciesId.PATRAT, SpeciesId.PURRLOIN, SpeciesId.PIDOVE],
|
||||||
6: [Species.BUNNELBY, Species.LITLEO, Species.SCATTERBUG],
|
6: [SpeciesId.BUNNELBY, SpeciesId.LITLEO, SpeciesId.SCATTERBUG],
|
||||||
7: [Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF],
|
7: [SpeciesId.PIKIPEK, SpeciesId.YUNGOOS, SpeciesId.ROCKRUFF],
|
||||||
8: [Species.SKWOVET, Species.WOOLOO, Species.ROOKIDEE],
|
8: [SpeciesId.SKWOVET, SpeciesId.WOOLOO, SpeciesId.ROOKIDEE],
|
||||||
9: [Species.LECHONK, Species.FIDOUGH, Species.TAROUNTULA],
|
9: [SpeciesId.LECHONK, SpeciesId.FIDOUGH, SpeciesId.TAROUNTULA],
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Exclude Paradox mons as they aren't considered legendary/mythical */
|
/** Exclude Paradox mons as they aren't considered legendary/mythical */
|
||||||
const EXCLUDED_TRADE_SPECIES = [
|
const EXCLUDED_TRADE_SPECIES = [
|
||||||
Species.GREAT_TUSK,
|
SpeciesId.GREAT_TUSK,
|
||||||
Species.SCREAM_TAIL,
|
SpeciesId.SCREAM_TAIL,
|
||||||
Species.BRUTE_BONNET,
|
SpeciesId.BRUTE_BONNET,
|
||||||
Species.FLUTTER_MANE,
|
SpeciesId.FLUTTER_MANE,
|
||||||
Species.SLITHER_WING,
|
SpeciesId.SLITHER_WING,
|
||||||
Species.SANDY_SHOCKS,
|
SpeciesId.SANDY_SHOCKS,
|
||||||
Species.ROARING_MOON,
|
SpeciesId.ROARING_MOON,
|
||||||
Species.WALKING_WAKE,
|
SpeciesId.WALKING_WAKE,
|
||||||
Species.GOUGING_FIRE,
|
SpeciesId.GOUGING_FIRE,
|
||||||
Species.RAGING_BOLT,
|
SpeciesId.RAGING_BOLT,
|
||||||
Species.IRON_TREADS,
|
SpeciesId.IRON_TREADS,
|
||||||
Species.IRON_BUNDLE,
|
SpeciesId.IRON_BUNDLE,
|
||||||
Species.IRON_HANDS,
|
SpeciesId.IRON_HANDS,
|
||||||
Species.IRON_JUGULIS,
|
SpeciesId.IRON_JUGULIS,
|
||||||
Species.IRON_MOTH,
|
SpeciesId.IRON_MOTH,
|
||||||
Species.IRON_THORNS,
|
SpeciesId.IRON_THORNS,
|
||||||
Species.IRON_VALIANT,
|
SpeciesId.IRON_VALIANT,
|
||||||
Species.IRON_LEAVES,
|
SpeciesId.IRON_LEAVES,
|
||||||
Species.IRON_BOULDER,
|
SpeciesId.IRON_BOULDER,
|
||||||
Species.IRON_CROWN,
|
SpeciesId.IRON_CROWN,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Moves } from "#app/enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { Species } from "#app/enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
@ -13,8 +13,8 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode
|
|||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
|
|
||||||
const OPTION_1_REQUIRED_MOVE = Moves.SURF;
|
const OPTION_1_REQUIRED_MOVE = MoveId.SURF;
|
||||||
const OPTION_2_REQUIRED_MOVE = Moves.FLY;
|
const OPTION_2_REQUIRED_MOVE = MoveId.FLY;
|
||||||
/**
|
/**
|
||||||
* Damage percentage taken when wandering aimlessly.
|
* Damage percentage taken when wandering aimlessly.
|
||||||
* Can be a number between `0` - `100`.
|
* Can be a number between `0` - `100`.
|
||||||
@ -129,7 +129,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
|
|||||||
* Generic handler for using a guiding pokemon to guide you back.
|
* Generic handler for using a guiding pokemon to guide you back.
|
||||||
*/
|
*/
|
||||||
function handlePokemonGuidingYouPhase() {
|
function handlePokemonGuidingYouPhase() {
|
||||||
const laprasSpecies = getPokemonSpecies(Species.LAPRAS);
|
const laprasSpecies = getPokemonSpecies(SpeciesId.LAPRAS);
|
||||||
const { mysteryEncounter } = globalScene.currentBattle;
|
const { mysteryEncounter } = globalScene.currentBattle;
|
||||||
|
|
||||||
if (mysteryEncounter?.selectedOption?.primaryPokemon?.id) {
|
if (mysteryEncounter?.selectedOption?.primaryPokemon?.id) {
|
||||||
|
@ -19,11 +19,11 @@ import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
|||||||
import { ModifierTier } from "#app/modifier/modifier-tier";
|
import { ModifierTier } from "#app/modifier/modifier-tier";
|
||||||
import { GameOverPhase } from "#app/phases/game-over-phase";
|
import { GameOverPhase } from "#app/phases/game-over-phase";
|
||||||
import { randSeedInt } from "#app/utils/common";
|
import { randSeedInt } from "#app/utils/common";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
/** i18n namespace for encounter */
|
/** i18n namespace for encounter */
|
||||||
const namespace = "mysteryEncounters/mysteriousChest";
|
const namespace = "mysteryEncounters/mysteriousChest";
|
||||||
@ -86,17 +86,17 @@ export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
disableSwitch: true,
|
disableSwitch: true,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.GIMMIGHOUL),
|
species: getPokemonSpecies(SpeciesId.GIMMIGHOUL),
|
||||||
formIndex: 0,
|
formIndex: 0,
|
||||||
isBoss: true,
|
isBoss: true,
|
||||||
moveSet: [Moves.NASTY_PLOT, Moves.SHADOW_BALL, Moves.POWER_GEM, Moves.THIEF],
|
moveSet: [MoveId.NASTY_PLOT, MoveId.SHADOW_BALL, MoveId.POWER_GEM, MoveId.THIEF],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
encounter.enemyPartyConfigs = [config];
|
encounter.enemyPartyConfigs = [config];
|
||||||
|
|
||||||
encounter.setDialogueToken("gimmighoulName", getPokemonSpecies(Species.GIMMIGHOUL).getName());
|
encounter.setDialogueToken("gimmighoulName", getPokemonSpecies(SpeciesId.GIMMIGHOUL).getName());
|
||||||
encounter.setDialogueToken("trapPercent", TRAP_PERCENT.toString());
|
encounter.setDialogueToken("trapPercent", TRAP_PERCENT.toString());
|
||||||
encounter.setDialogueToken("commonPercent", COMMON_REWARDS_PERCENT.toString());
|
encounter.setDialogueToken("commonPercent", COMMON_REWARDS_PERCENT.toString());
|
||||||
encounter.setDialogueToken("ultraPercent", ULTRA_REWARDS_PERCENT.toString());
|
encounter.setDialogueToken("ultraPercent", ULTRA_REWARDS_PERCENT.toString());
|
||||||
|
@ -10,7 +10,7 @@ import type Pokemon from "#app/field/pokemon";
|
|||||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import { randSeedInt } from "#app/utils/common";
|
import { randSeedInt } from "#app/utils/common";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
@ -49,7 +49,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui
|
|||||||
.withPrimaryPokemonHealthRatioRequirement([0.51, 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: SpeciesId.KROOKODILE.toString(),
|
||||||
fileRoot: "pokemon",
|
fileRoot: "pokemon",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
|
@ -2,7 +2,7 @@ import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requir
|
|||||||
import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
|
||||||
import { modifierTypes } from "#app/modifier/modifier-type";
|
import { modifierTypes } from "#app/modifier/modifier-type";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { StatusEffect } from "#enums/status-effect";
|
import { StatusEffect } from "#enums/status-effect";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
@ -20,7 +20,7 @@ import {
|
|||||||
} from "../utils/encounter-phase-utils";
|
} from "../utils/encounter-phase-utils";
|
||||||
import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { AiType, PokemonMove } from "#app/field/pokemon";
|
import { AiType, PokemonMove } from "#app/field/pokemon";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
@ -50,7 +50,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuil
|
|||||||
.withFleeAllowed(false)
|
.withFleeAllowed(false)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: Species.SNORLAX.toString(),
|
spriteKey: SpeciesId.SNORLAX.toString(),
|
||||||
fileRoot: "pokemon",
|
fileRoot: "pokemon",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
tint: 0.25,
|
tint: 0.25,
|
||||||
@ -69,14 +69,14 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuil
|
|||||||
console.log(encounter);
|
console.log(encounter);
|
||||||
|
|
||||||
// Calculate boss mon
|
// Calculate boss mon
|
||||||
const bossSpecies = getPokemonSpecies(Species.SNORLAX);
|
const bossSpecies = getPokemonSpecies(SpeciesId.SNORLAX);
|
||||||
const pokemonConfig: EnemyPokemonConfig = {
|
const pokemonConfig: EnemyPokemonConfig = {
|
||||||
species: bossSpecies,
|
species: bossSpecies,
|
||||||
isBoss: true,
|
isBoss: true,
|
||||||
shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked
|
shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked
|
||||||
status: [StatusEffect.SLEEP, 6], // Extra turns on timer for Snorlax's start of fight moves
|
status: [StatusEffect.SLEEP, 6], // Extra turns on timer for Snorlax's start of fight moves
|
||||||
nature: Nature.DOCILE,
|
nature: Nature.DOCILE,
|
||||||
moveSet: [Moves.BODY_SLAM, Moves.CRUNCH, Moves.SLEEP_TALK, Moves.REST],
|
moveSet: [MoveId.BODY_SLAM, MoveId.CRUNCH, MoveId.SLEEP_TALK, MoveId.REST],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType,
|
||||||
@ -106,9 +106,9 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuil
|
|||||||
encounter.enemyPartyConfigs = [config];
|
encounter.enemyPartyConfigs = [config];
|
||||||
|
|
||||||
// Load animations/sfx for Snorlax fight start moves
|
// Load animations/sfx for Snorlax fight start moves
|
||||||
loadCustomMovesForEncounter([Moves.SNORE]);
|
loadCustomMovesForEncounter([MoveId.SNORE]);
|
||||||
|
|
||||||
encounter.setDialogueToken("snorlaxName", getPokemonSpecies(Species.SNORLAX).getName());
|
encounter.setDialogueToken("snorlaxName", getPokemonSpecies(SpeciesId.SNORLAX).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -133,14 +133,12 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuil
|
|||||||
guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS],
|
guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS],
|
||||||
fillRemaining: true,
|
fillRemaining: true,
|
||||||
});
|
});
|
||||||
encounter.startOfBattleEffects.push(
|
encounter.startOfBattleEffects.push({
|
||||||
{
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
targets: [BattlerIndex.PLAYER],
|
||||||
targets: [BattlerIndex.PLAYER],
|
move: new PokemonMove(MoveId.SNORE),
|
||||||
move: new PokemonMove(Moves.SNORE),
|
ignorePp: true,
|
||||||
ignorePp: true,
|
});
|
||||||
},
|
|
||||||
);
|
|
||||||
await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]);
|
await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]);
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@ -183,7 +181,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuil
|
|||||||
fillRemaining: false,
|
fillRemaining: false,
|
||||||
});
|
});
|
||||||
// Snorlax exp to Pokemon that did the stealing
|
// Snorlax exp to Pokemon that did the stealing
|
||||||
setEncounterExp(instance.primaryPokemon!.id, getPokemonSpecies(Species.SNORLAX).baseExp);
|
setEncounterExp(instance.primaryPokemon!.id, getPokemonSpecies(SpeciesId.SNORLAX).baseExp);
|
||||||
leaveEncounterWithoutBattle();
|
leaveEncounterWithoutBattle();
|
||||||
})
|
})
|
||||||
.build(),
|
.build(),
|
||||||
|
@ -20,7 +20,7 @@ import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-enco
|
|||||||
import PokemonData from "#app/system/pokemon-data";
|
import PokemonData from "#app/system/pokemon-data";
|
||||||
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 { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { getBiomeKey } from "#app/field/arena";
|
import { getBiomeKey } from "#app/field/arena";
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { getPartyLuckValue, modifierTypes } from "#app/modifier/modifier-type";
|
import { getPartyLuckValue, modifierTypes } from "#app/modifier/modifier-type";
|
||||||
@ -39,7 +39,14 @@ import {
|
|||||||
const namespace = "mysteryEncounters/teleportingHijinks";
|
const namespace = "mysteryEncounters/teleportingHijinks";
|
||||||
|
|
||||||
const MONEY_COST_MULTIPLIER = 1.75;
|
const MONEY_COST_MULTIPLIER = 1.75;
|
||||||
const BIOME_CANDIDATES = [Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND, Biome.WASTELAND, Biome.DOJO];
|
const BIOME_CANDIDATES = [
|
||||||
|
BiomeId.SPACE,
|
||||||
|
BiomeId.FAIRY_CAVE,
|
||||||
|
BiomeId.LABORATORY,
|
||||||
|
BiomeId.ISLAND,
|
||||||
|
BiomeId.WASTELAND,
|
||||||
|
BiomeId.DOJO,
|
||||||
|
];
|
||||||
const MACHINE_INTERFACING_TYPES = [PokemonType.ELECTRIC, PokemonType.STEEL];
|
const MACHINE_INTERFACING_TYPES = [PokemonType.ELECTRIC, PokemonType.STEEL];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -229,7 +236,7 @@ async function doBiomeTransitionDialogueAndBattleInit() {
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function animateBiomeChange(nextBiome: Biome) {
|
async function animateBiomeChange(nextBiome: BiomeId) {
|
||||||
return new Promise<void>(resolve => {
|
return new Promise<void>(resolve => {
|
||||||
globalScene.tweens.add({
|
globalScene.tweens.add({
|
||||||
targets: [globalScene.arenaEnemy, globalScene.lastEnemyTrainer],
|
targets: [globalScene.arenaEnemy, globalScene.lastEnemyTrainer],
|
||||||
|
@ -11,14 +11,14 @@ import { randSeedShuffle } from "#app/utils/common";
|
|||||||
import type MysteryEncounter from "../mystery-encounter";
|
import type MysteryEncounter from "../mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "../mystery-encounter";
|
import { MysteryEncounterBuilder } from "../mystery-encounter";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { speciesStarterCosts } from "#app/data/balance/starters";
|
import { speciesStarterCosts } from "#app/data/balance/starters";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import type { PlayerPokemon } from "#app/field/pokemon";
|
import type { 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 type { IEggOptions } from "#app/data/egg";
|
import type { IEggOptions } from "#app/data/egg";
|
||||||
@ -42,75 +42,75 @@ const FINAL_STAGE_EVOLUTION_WAVE = 75;
|
|||||||
const FRIENDSHIP_ADDED = 20;
|
const FRIENDSHIP_ADDED = 20;
|
||||||
|
|
||||||
class BreederSpeciesEvolution {
|
class BreederSpeciesEvolution {
|
||||||
species: Species;
|
species: SpeciesId;
|
||||||
evolution: number;
|
evolution: number;
|
||||||
|
|
||||||
constructor(species: Species, evolution: number) {
|
constructor(species: SpeciesId, evolution: number) {
|
||||||
this.species = species;
|
this.species = species;
|
||||||
this.evolution = evolution;
|
this.evolution = evolution;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const POOL_1_POKEMON: (Species | BreederSpeciesEvolution)[][] = [
|
const POOL_1_POKEMON: (SpeciesId | BreederSpeciesEvolution)[][] = [
|
||||||
[Species.MUNCHLAX, new BreederSpeciesEvolution(Species.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.MUNCHLAX, new BreederSpeciesEvolution(SpeciesId.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[
|
[
|
||||||
Species.HAPPINY,
|
SpeciesId.HAPPINY,
|
||||||
new BreederSpeciesEvolution(Species.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
Species.MAGBY,
|
SpeciesId.MAGBY,
|
||||||
new BreederSpeciesEvolution(Species.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
Species.ELEKID,
|
SpeciesId.ELEKID,
|
||||||
new BreederSpeciesEvolution(Species.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[Species.RIOLU, new BreederSpeciesEvolution(Species.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.RIOLU, new BreederSpeciesEvolution(SpeciesId.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[
|
[
|
||||||
Species.BUDEW,
|
SpeciesId.BUDEW,
|
||||||
new BreederSpeciesEvolution(Species.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[Species.TOXEL, new BreederSpeciesEvolution(Species.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.TOXEL, new BreederSpeciesEvolution(SpeciesId.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[
|
[
|
||||||
Species.MIME_JR,
|
SpeciesId.MIME_JR,
|
||||||
new BreederSpeciesEvolution(Species.GALAR_MR_MIME, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.GALAR_MR_MIME, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
const POOL_2_POKEMON: (Species | BreederSpeciesEvolution)[][] = [
|
const POOL_2_POKEMON: (SpeciesId | BreederSpeciesEvolution)[][] = [
|
||||||
[
|
[
|
||||||
Species.PICHU,
|
SpeciesId.PICHU,
|
||||||
new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.RAICHU, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.RAICHU, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
Species.PICHU,
|
SpeciesId.PICHU,
|
||||||
new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.ALOLA_RAICHU, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.ALOLA_RAICHU, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[Species.SMOOCHUM, new BreederSpeciesEvolution(Species.JYNX, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.SMOOCHUM, new BreederSpeciesEvolution(SpeciesId.JYNX, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[
|
[
|
||||||
Species.IGGLYBUFF,
|
SpeciesId.IGGLYBUFF,
|
||||||
new BreederSpeciesEvolution(Species.JIGGLYPUFF, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.JIGGLYPUFF, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.WIGGLYTUFF, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.WIGGLYTUFF, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
Species.AZURILL,
|
SpeciesId.AZURILL,
|
||||||
new BreederSpeciesEvolution(Species.MARILL, FIRST_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.MARILL, FIRST_STAGE_EVOLUTION_WAVE),
|
||||||
new BreederSpeciesEvolution(Species.AZUMARILL, FINAL_STAGE_EVOLUTION_WAVE),
|
new BreederSpeciesEvolution(SpeciesId.AZUMARILL, FINAL_STAGE_EVOLUTION_WAVE),
|
||||||
],
|
],
|
||||||
[Species.WYNAUT, new BreederSpeciesEvolution(Species.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.WYNAUT, new BreederSpeciesEvolution(SpeciesId.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[Species.CHINGLING, new BreederSpeciesEvolution(Species.CHIMECHO, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.CHINGLING, new BreederSpeciesEvolution(SpeciesId.CHIMECHO, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[Species.BONSLY, new BreederSpeciesEvolution(Species.SUDOWOODO, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.BONSLY, new BreederSpeciesEvolution(SpeciesId.SUDOWOODO, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
[Species.MANTYKE, new BreederSpeciesEvolution(Species.MANTINE, SECOND_STAGE_EVOLUTION_WAVE)],
|
[SpeciesId.MANTYKE, new BreederSpeciesEvolution(SpeciesId.MANTINE, SECOND_STAGE_EVOLUTION_WAVE)],
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -144,10 +144,10 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncount
|
|||||||
|
|
||||||
const cleffaSpecies =
|
const cleffaSpecies =
|
||||||
waveIndex < FIRST_STAGE_EVOLUTION_WAVE
|
waveIndex < FIRST_STAGE_EVOLUTION_WAVE
|
||||||
? Species.CLEFFA
|
? SpeciesId.CLEFFA
|
||||||
: waveIndex < FINAL_STAGE_EVOLUTION_WAVE
|
: waveIndex < FINAL_STAGE_EVOLUTION_WAVE
|
||||||
? Species.CLEFAIRY
|
? SpeciesId.CLEFAIRY
|
||||||
: Species.CLEFABLE;
|
: SpeciesId.CLEFABLE;
|
||||||
encounter.spriteConfigs = [
|
encounter.spriteConfigs = [
|
||||||
{
|
{
|
||||||
spriteKey: cleffaSpecies.toString(),
|
spriteKey: cleffaSpecies.toString(),
|
||||||
@ -466,10 +466,10 @@ function getPartyConfig(): EnemyPartyConfig {
|
|||||||
// First mon is *always* this special cleffa
|
// First mon is *always* this special cleffa
|
||||||
const cleffaSpecies =
|
const cleffaSpecies =
|
||||||
waveIndex < FIRST_STAGE_EVOLUTION_WAVE
|
waveIndex < FIRST_STAGE_EVOLUTION_WAVE
|
||||||
? Species.CLEFFA
|
? SpeciesId.CLEFFA
|
||||||
: waveIndex < FINAL_STAGE_EVOLUTION_WAVE
|
: waveIndex < FINAL_STAGE_EVOLUTION_WAVE
|
||||||
? Species.CLEFAIRY
|
? SpeciesId.CLEFAIRY
|
||||||
: Species.CLEFABLE;
|
: SpeciesId.CLEFABLE;
|
||||||
const baseConfig: EnemyPartyConfig = {
|
const baseConfig: EnemyPartyConfig = {
|
||||||
trainerType: TrainerType.EXPERT_POKEMON_BREEDER,
|
trainerType: TrainerType.EXPERT_POKEMON_BREEDER,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
@ -482,14 +482,14 @@ function getPartyConfig(): EnemyPartyConfig {
|
|||||||
abilityIndex: 1, // Magic Guard
|
abilityIndex: 1, // Magic Guard
|
||||||
shiny: false,
|
shiny: false,
|
||||||
nature: Nature.ADAMANT,
|
nature: Nature.ADAMANT,
|
||||||
moveSet: [Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH, Moves.METEOR_MASH],
|
moveSet: [MoveId.FIRE_PUNCH, MoveId.ICE_PUNCH, MoveId.THUNDER_PUNCH, MoveId.METEOR_MASH],
|
||||||
ivs: [31, 31, 31, 31, 31, 31],
|
ivs: [31, 31, 31, 31, 31, 31],
|
||||||
tera: PokemonType.FAIRY,
|
tera: PokemonType.FAIRY,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
if (globalScene.arena.biomeType === Biome.SPACE) {
|
if (globalScene.arena.biomeType === BiomeId.SPACE) {
|
||||||
// All 3 members always Cleffa line, but different configs
|
// All 3 members always Cleffa line, but different configs
|
||||||
baseConfig.pokemonConfigs!.push(
|
baseConfig.pokemonConfigs!.push(
|
||||||
{
|
{
|
||||||
@ -502,7 +502,7 @@ function getPartyConfig(): EnemyPartyConfig {
|
|||||||
shiny: true,
|
shiny: true,
|
||||||
variant: 1,
|
variant: 1,
|
||||||
nature: Nature.MODEST,
|
nature: Nature.MODEST,
|
||||||
moveSet: [Moves.MOONBLAST, Moves.MYSTICAL_FIRE, Moves.ICE_BEAM, Moves.THUNDERBOLT],
|
moveSet: [MoveId.MOONBLAST, MoveId.MYSTICAL_FIRE, MoveId.ICE_BEAM, MoveId.THUNDERBOLT],
|
||||||
ivs: [31, 31, 31, 31, 31, 31],
|
ivs: [31, 31, 31, 31, 31, 31],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -515,7 +515,7 @@ function getPartyConfig(): EnemyPartyConfig {
|
|||||||
shiny: true,
|
shiny: true,
|
||||||
variant: 2,
|
variant: 2,
|
||||||
nature: Nature.BOLD,
|
nature: Nature.BOLD,
|
||||||
moveSet: [Moves.TRI_ATTACK, Moves.STORED_POWER, Moves.TAKE_HEART, Moves.MOONLIGHT],
|
moveSet: [MoveId.TRI_ATTACK, MoveId.STORED_POWER, MoveId.TAKE_HEART, MoveId.MOONLIGHT],
|
||||||
ivs: [31, 31, 31, 31, 31, 31],
|
ivs: [31, 31, 31, 31, 31, 31],
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@ -542,7 +542,7 @@ function getPartyConfig(): EnemyPartyConfig {
|
|||||||
return baseConfig;
|
return baseConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSpeciesFromPool(speciesPool: (Species | BreederSpeciesEvolution)[][], waveIndex: number): Species {
|
function getSpeciesFromPool(speciesPool: (SpeciesId | BreederSpeciesEvolution)[][], waveIndex: number): SpeciesId {
|
||||||
const poolCopy = randSeedShuffle(speciesPool.slice(0));
|
const poolCopy = randSeedShuffle(speciesPool.slice(0));
|
||||||
const speciesEvolutions = poolCopy.pop()!.slice(0);
|
const speciesEvolutions = poolCopy.pop()!.slice(0);
|
||||||
let speciesObject = speciesEvolutions.pop()!;
|
let speciesObject = speciesEvolutions.pop()!;
|
||||||
|
@ -17,7 +17,7 @@ import {
|
|||||||
import type PokemonSpecies from "#app/data/pokemon-species";
|
import type PokemonSpecies from "#app/data/pokemon-species";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { speciesStarterCosts } from "#app/data/balance/starters";
|
import { speciesStarterCosts } from "#app/data/balance/starters";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { PokeballType } from "#enums/pokeball";
|
import { PokeballType } from "#enums/pokeball";
|
||||||
import type { EnemyPokemon } from "#app/field/pokemon";
|
import type { EnemyPokemon } from "#app/field/pokemon";
|
||||||
import { PlayerPokemon } from "#app/field/pokemon";
|
import { PlayerPokemon } from "#app/field/pokemon";
|
||||||
@ -27,7 +27,7 @@ import PokemonData from "#app/system/pokemon-data";
|
|||||||
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 { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { NON_LEGEND_PARADOX_POKEMON, NON_LEGEND_ULTRA_BEASTS } from "#app/data/balance/special-species-groups";
|
import { NON_LEGEND_PARADOX_POKEMON, NON_LEGEND_ULTRA_BEASTS } from "#app/data/balance/special-species-groups";
|
||||||
import { timedEventManager } from "#app/global-event-manager";
|
import { timedEventManager } from "#app/global-event-manager";
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
|
|||||||
let tries = 0;
|
let 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 === AbilityId.NONE) && tries < 5) {
|
||||||
species = getSalesmanSpeciesOffer();
|
species = getSalesmanSpeciesOffer();
|
||||||
tries++;
|
tries++;
|
||||||
}
|
}
|
||||||
@ -110,15 +110,15 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
|
|||||||
*/
|
*/
|
||||||
if (
|
if (
|
||||||
r === 0 ||
|
r === 0 ||
|
||||||
((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) &&
|
((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === AbilityId.NONE) &&
|
||||||
validEventEncounters.length === 0)
|
validEventEncounters.length === 0)
|
||||||
) {
|
) {
|
||||||
// If you roll 1%, give shiny Magikarp with random variant
|
// If you roll 1%, give shiny Magikarp with random variant
|
||||||
species = getPokemonSpecies(Species.MAGIKARP);
|
species = getPokemonSpecies(SpeciesId.MAGIKARP);
|
||||||
pokemon = new PlayerPokemon(species, 5, 2, undefined, undefined, true);
|
pokemon = new PlayerPokemon(species, 5, 2, undefined, undefined, true);
|
||||||
} else if (
|
} else if (
|
||||||
validEventEncounters.length > 0 &&
|
validEventEncounters.length > 0 &&
|
||||||
(r <= EVENT_THRESHOLD || isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE)
|
(r <= EVENT_THRESHOLD || isNullOrUndefined(species.abilityHidden) || species.abilityHidden === AbilityId.NONE)
|
||||||
) {
|
) {
|
||||||
tries = 0;
|
tries = 0;
|
||||||
do {
|
do {
|
||||||
@ -128,7 +128,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
|
|||||||
pokemon = new PlayerPokemon(
|
pokemon = new PlayerPokemon(
|
||||||
species,
|
species,
|
||||||
5,
|
5,
|
||||||
species.abilityHidden === Abilities.NONE ? undefined : 2,
|
species.abilityHidden === AbilityId.NONE ? undefined : 2,
|
||||||
enc.formIndex,
|
enc.formIndex,
|
||||||
);
|
);
|
||||||
pokemon.trySetShinySeed();
|
pokemon.trySetShinySeed();
|
||||||
@ -151,7 +151,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBui
|
|||||||
pokemon.trySetShinySeed();
|
pokemon.trySetShinySeed();
|
||||||
} else {
|
} else {
|
||||||
// If there's, and this would never happen, no eligible event encounters with a hidden ability, just do Magikarp
|
// If there's, and this would never happen, no eligible event encounters with a hidden ability, just do Magikarp
|
||||||
species = getPokemonSpecies(Species.MAGIKARP);
|
species = getPokemonSpecies(SpeciesId.MAGIKARP);
|
||||||
pokemon = new PlayerPokemon(species, 5, 2, undefined, undefined, true);
|
pokemon = new PlayerPokemon(species, 5, 2, undefined, undefined, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,13 @@ import { globalScene } from "#app/global-scene";
|
|||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import type Pokemon from "#app/field/pokemon";
|
import type Pokemon from "#app/field/pokemon";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
@ -64,7 +64,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
disableAnimation: true,
|
disableAnimation: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
spriteKey: Species.SHUCKLE.toString(),
|
spriteKey: SpeciesId.SHUCKLE.toString(),
|
||||||
fileRoot: "pokemon",
|
fileRoot: "pokemon",
|
||||||
hasShadow: true,
|
hasShadow: true,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
@ -88,13 +88,13 @@ export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
disableSwitch: true,
|
disableSwitch: true,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.SHUCKLE),
|
species: getPokemonSpecies(SpeciesId.SHUCKLE),
|
||||||
isBoss: true,
|
isBoss: true,
|
||||||
bossSegments: 5,
|
bossSegments: 5,
|
||||||
shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked
|
shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked
|
||||||
customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }),
|
customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }),
|
||||||
nature: Nature.HARDY,
|
nature: Nature.HARDY,
|
||||||
moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER],
|
moveSet: [MoveId.INFESTATION, MoveId.SALT_CURE, MoveId.GASTRO_ACID, MoveId.HEAL_ORDER],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType,
|
||||||
@ -126,9 +126,9 @@ export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
|
|
||||||
encounter.enemyPartyConfigs = [config];
|
encounter.enemyPartyConfigs = [config];
|
||||||
|
|
||||||
loadCustomMovesForEncounter([Moves.GASTRO_ACID, Moves.STEALTH_ROCK]);
|
loadCustomMovesForEncounter([MoveId.GASTRO_ACID, MoveId.STEALTH_ROCK]);
|
||||||
|
|
||||||
encounter.setDialogueToken("shuckleName", getPokemonSpecies(Species.SHUCKLE).getName());
|
encounter.setDialogueToken("shuckleName", getPokemonSpecies(SpeciesId.SHUCKLE).getName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
@ -210,13 +210,13 @@ export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder
|
|||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.PLAYER],
|
targets: [BattlerIndex.PLAYER],
|
||||||
move: new PokemonMove(Moves.GASTRO_ACID),
|
move: new PokemonMove(MoveId.GASTRO_ACID),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.PLAYER],
|
targets: [BattlerIndex.PLAYER],
|
||||||
move: new PokemonMove(Moves.STEALTH_ROCK),
|
move: new PokemonMove(MoveId.STEALTH_ROCK),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -15,10 +15,10 @@ import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounte
|
|||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
@ -215,8 +215,8 @@ function endTrainerBattleAndShowDialogue(): Promise<void> {
|
|||||||
// Only trigger form change when Eiscue is in Noice form
|
// Only trigger form change when Eiscue is in Noice form
|
||||||
// Hardcoded Eiscue for now in case it is fused with another pokemon
|
// Hardcoded Eiscue for now in case it is fused with another pokemon
|
||||||
if (
|
if (
|
||||||
pokemon.species.speciesId === Species.EISCUE &&
|
pokemon.species.speciesId === SpeciesId.EISCUE &&
|
||||||
pokemon.hasAbility(Abilities.ICE_FACE) &&
|
pokemon.hasAbility(AbilityId.ICE_FACE) &&
|
||||||
pokemon.formIndex === 1
|
pokemon.formIndex === 1
|
||||||
) {
|
) {
|
||||||
globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger);
|
globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger);
|
||||||
@ -256,11 +256,11 @@ function getVictorTrainerConfig(): EnemyPartyConfig {
|
|||||||
trainerType: TrainerType.VICTOR,
|
trainerType: TrainerType.VICTOR,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.SWELLOW),
|
species: getPokemonSpecies(SpeciesId.SWELLOW),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 0, // Guts
|
abilityIndex: 0, // Guts
|
||||||
nature: Nature.ADAMANT,
|
nature: Nature.ADAMANT,
|
||||||
moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK],
|
moveSet: [MoveId.FACADE, MoveId.BRAVE_BIRD, MoveId.PROTECT, MoveId.QUICK_ATTACK],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType,
|
||||||
@ -274,11 +274,11 @@ function getVictorTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.OBSTAGOON),
|
species: getPokemonSpecies(SpeciesId.OBSTAGOON),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 1, // Guts
|
abilityIndex: 1, // Guts
|
||||||
nature: Nature.ADAMANT,
|
nature: Nature.ADAMANT,
|
||||||
moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH],
|
moveSet: [MoveId.FACADE, MoveId.OBSTRUCT, MoveId.NIGHT_SLASH, MoveId.FIRE_PUNCH],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType,
|
||||||
@ -300,11 +300,11 @@ function getVictoriaTrainerConfig(): EnemyPartyConfig {
|
|||||||
trainerType: TrainerType.VICTORIA,
|
trainerType: TrainerType.VICTORIA,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.ROSERADE),
|
species: getPokemonSpecies(SpeciesId.ROSERADE),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 0, // Natural Cure
|
abilityIndex: 0, // Natural Cure
|
||||||
nature: Nature.CALM,
|
nature: Nature.CALM,
|
||||||
moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER],
|
moveSet: [MoveId.SYNTHESIS, MoveId.SLUDGE_BOMB, MoveId.GIGA_DRAIN, MoveId.SLEEP_POWDER],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType,
|
||||||
@ -318,11 +318,11 @@ function getVictoriaTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.GARDEVOIR),
|
species: getPokemonSpecies(SpeciesId.GARDEVOIR),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
nature: Nature.TIMID,
|
nature: Nature.TIMID,
|
||||||
moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP],
|
moveSet: [MoveId.PSYSHOCK, MoveId.MOONBLAST, MoveId.SHADOW_BALL, MoveId.WILL_O_WISP],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [
|
modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [
|
||||||
@ -349,11 +349,11 @@ function getViviTrainerConfig(): EnemyPartyConfig {
|
|||||||
trainerType: TrainerType.VIVI,
|
trainerType: TrainerType.VIVI,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.SEAKING),
|
species: getPokemonSpecies(SpeciesId.SEAKING),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 3, // Lightning Rod
|
abilityIndex: 3, // Lightning Rod
|
||||||
nature: Nature.ADAMANT,
|
nature: Nature.ADAMANT,
|
||||||
moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST],
|
moveSet: [MoveId.WATERFALL, MoveId.MEGAHORN, MoveId.KNOCK_OFF, MoveId.REST],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType,
|
||||||
@ -368,11 +368,11 @@ function getViviTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.BRELOOM),
|
species: getPokemonSpecies(SpeciesId.BRELOOM),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 1, // Poison Heal
|
abilityIndex: 1, // Poison Heal
|
||||||
nature: Nature.JOLLY,
|
nature: Nature.JOLLY,
|
||||||
moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH],
|
moveSet: [MoveId.SPORE, MoveId.SWORDS_DANCE, MoveId.SEED_BOMB, MoveId.DRAIN_PUNCH],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType,
|
||||||
@ -386,11 +386,11 @@ function getViviTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.CAMERUPT),
|
species: getPokemonSpecies(SpeciesId.CAMERUPT),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
nature: Nature.CALM,
|
nature: Nature.CALM,
|
||||||
moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT],
|
moveSet: [MoveId.EARTH_POWER, MoveId.FIRE_BLAST, MoveId.YAWN, MoveId.PROTECT],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType,
|
||||||
@ -408,11 +408,11 @@ function getVickyTrainerConfig(): EnemyPartyConfig {
|
|||||||
trainerType: TrainerType.VICKY,
|
trainerType: TrainerType.VICKY,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.MEDICHAM),
|
species: getPokemonSpecies(SpeciesId.MEDICHAM),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
nature: Nature.IMPISH,
|
nature: Nature.IMPISH,
|
||||||
moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH],
|
moveSet: [MoveId.AXE_KICK, MoveId.ICE_PUNCH, MoveId.ZEN_HEADBUTT, MoveId.BULLET_PUNCH],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType,
|
||||||
@ -429,11 +429,11 @@ function getVitoTrainerConfig(): EnemyPartyConfig {
|
|||||||
trainerType: TrainerType.VITO,
|
trainerType: TrainerType.VITO,
|
||||||
pokemonConfigs: [
|
pokemonConfigs: [
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.HISUI_ELECTRODE),
|
species: getPokemonSpecies(SpeciesId.HISUI_ELECTRODE),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 0, // Soundproof
|
abilityIndex: 0, // Soundproof
|
||||||
nature: Nature.MODEST,
|
nature: Nature.MODEST,
|
||||||
moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE],
|
moveSet: [MoveId.THUNDERBOLT, MoveId.GIGA_DRAIN, MoveId.FOUL_PLAY, MoveId.THUNDER_WAVE],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType,
|
||||||
@ -443,11 +443,11 @@ function getVitoTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.SWALOT),
|
species: getPokemonSpecies(SpeciesId.SWALOT),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 2, // Gluttony
|
abilityIndex: 2, // Gluttony
|
||||||
nature: Nature.QUIET,
|
nature: Nature.QUIET,
|
||||||
moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE],
|
moveSet: [MoveId.SLUDGE_BOMB, MoveId.GIGA_DRAIN, MoveId.ICE_BEAM, MoveId.EARTHQUAKE],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType,
|
||||||
@ -496,11 +496,11 @@ function getVitoTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.DODRIO),
|
species: getPokemonSpecies(SpeciesId.DODRIO),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 2, // Tangled Feet
|
abilityIndex: 2, // Tangled Feet
|
||||||
nature: Nature.JOLLY,
|
nature: Nature.JOLLY,
|
||||||
moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF],
|
moveSet: [MoveId.DRILL_PECK, MoveId.QUICK_ATTACK, MoveId.THRASH, MoveId.KNOCK_OFF],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType,
|
||||||
@ -510,11 +510,11 @@ function getVitoTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.ALAKAZAM),
|
species: getPokemonSpecies(SpeciesId.ALAKAZAM),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
formIndex: 1,
|
formIndex: 1,
|
||||||
nature: Nature.BOLD,
|
nature: Nature.BOLD,
|
||||||
moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT],
|
moveSet: [MoveId.PSYCHIC, MoveId.SHADOW_BALL, MoveId.FOCUS_BLAST, MoveId.THUNDERBOLT],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType,
|
||||||
@ -524,11 +524,11 @@ function getVitoTrainerConfig(): EnemyPartyConfig {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
species: getPokemonSpecies(Species.DARMANITAN),
|
species: getPokemonSpecies(SpeciesId.DARMANITAN),
|
||||||
isBoss: false,
|
isBoss: false,
|
||||||
abilityIndex: 0, // Sheer Force
|
abilityIndex: 0, // Sheer Force
|
||||||
nature: Nature.IMPISH,
|
nature: Nature.IMPISH,
|
||||||
moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE],
|
moveSet: [MoveId.EARTHQUAKE, MoveId.U_TURN, MoveId.FLARE_BLITZ, MoveId.ROCK_SLIDE],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType,
|
||||||
|
@ -16,14 +16,14 @@ import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-en
|
|||||||
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option";
|
||||||
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 { SpeciesId } from "#enums/species-id";
|
||||||
import { HitHealModifier, PokemonHeldItemModifier, TurnHealModifier } from "#app/modifier/modifier";
|
import { HitHealModifier, PokemonHeldItemModifier, TurnHealModifier } from "#app/modifier/modifier";
|
||||||
import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import i18next from "#app/plugins/i18n";
|
import i18next from "#app/plugins/i18n";
|
||||||
import { ModifierTier } from "#app/modifier/modifier-tier";
|
import { ModifierTier } from "#app/modifier/modifier-tier";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants";
|
||||||
@ -51,7 +51,7 @@ export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
.withFleeAllowed(false)
|
.withFleeAllowed(false)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
spriteKey: Species.GARBODOR.toString() + "-gigantamax",
|
spriteKey: SpeciesId.GARBODOR.toString() + "-gigantamax",
|
||||||
fileRoot: "pokemon",
|
fileRoot: "pokemon",
|
||||||
hasShadow: false,
|
hasShadow: false,
|
||||||
disableAnimation: true,
|
disableAnimation: true,
|
||||||
@ -74,14 +74,14 @@ export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
const encounter = globalScene.currentBattle.mysteryEncounter!;
|
||||||
|
|
||||||
// Calculate boss mon (shiny locked)
|
// Calculate boss mon (shiny locked)
|
||||||
const bossSpecies = getPokemonSpecies(Species.GARBODOR);
|
const bossSpecies = getPokemonSpecies(SpeciesId.GARBODOR);
|
||||||
const pokemonConfig: EnemyPokemonConfig = {
|
const pokemonConfig: EnemyPokemonConfig = {
|
||||||
species: bossSpecies,
|
species: bossSpecies,
|
||||||
isBoss: true,
|
isBoss: true,
|
||||||
shiny: false, // Shiny lock because of custom intro sprite
|
shiny: false, // Shiny lock because of custom intro sprite
|
||||||
formIndex: 1, // Gmax
|
formIndex: 1, // Gmax
|
||||||
bossSegmentModifier: 1, // +1 Segment from normal
|
bossSegmentModifier: 1, // +1 Segment from normal
|
||||||
moveSet: [Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.HAMMER_ARM, Moves.PAYBACK],
|
moveSet: [MoveId.GUNK_SHOT, MoveId.STOMPING_TANTRUM, MoveId.HAMMER_ARM, MoveId.PAYBACK],
|
||||||
modifierConfigs: [
|
modifierConfigs: [
|
||||||
{
|
{
|
||||||
modifier: generateModifierType(modifierTypes.BERRY) as PokemonHeldItemModifierType,
|
modifier: generateModifierType(modifierTypes.BERRY) as PokemonHeldItemModifierType,
|
||||||
@ -127,7 +127,7 @@ export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
encounter.enemyPartyConfigs = [config];
|
encounter.enemyPartyConfigs = [config];
|
||||||
|
|
||||||
// Load animations/sfx for Garbodor fight start moves
|
// Load animations/sfx for Garbodor fight start moves
|
||||||
loadCustomMovesForEncounter([Moves.TOXIC, Moves.STOCKPILE]);
|
loadCustomMovesForEncounter([MoveId.TOXIC, MoveId.STOCKPILE]);
|
||||||
|
|
||||||
globalScene.loadSe("PRSFX- Dig2", "battle_anims", "PRSFX- Dig2.wav");
|
globalScene.loadSe("PRSFX- Dig2", "battle_anims", "PRSFX- Dig2.wav");
|
||||||
globalScene.loadSe("PRSFX- Venom Drench", "battle_anims", "PRSFX- Venom Drench.wav");
|
globalScene.loadSe("PRSFX- Venom Drench", "battle_anims", "PRSFX- Venom Drench.wav");
|
||||||
@ -206,13 +206,13 @@ export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilde
|
|||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.PLAYER],
|
targets: [BattlerIndex.PLAYER],
|
||||||
move: new PokemonMove(Moves.TOXIC),
|
move: new PokemonMove(MoveId.TOXIC),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sourceBattlerIndex: BattlerIndex.ENEMY,
|
sourceBattlerIndex: BattlerIndex.ENEMY,
|
||||||
targets: [BattlerIndex.ENEMY],
|
targets: [BattlerIndex.ENEMY],
|
||||||
move: new PokemonMove(Moves.STOCKPILE),
|
move: new PokemonMove(MoveId.STOCKPILE),
|
||||||
ignorePp: true,
|
ignorePp: true,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -28,7 +28,7 @@ import {
|
|||||||
} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import PokemonData from "#app/system/pokemon-data";
|
import PokemonData from "#app/system/pokemon-data";
|
||||||
import { isNullOrUndefined, randSeedInt } from "#app/utils/common";
|
import { isNullOrUndefined, randSeedInt } from "#app/utils/common";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { SelfStatusMove } from "#app/data/moves/move";
|
import { SelfStatusMove } from "#app/data/moves/move";
|
||||||
import { PokeballType } from "#enums/pokeball";
|
import { PokeballType } from "#enums/pokeball";
|
||||||
@ -73,7 +73,7 @@ export const UncommonBreedEncounter: MysteryEncounter = MysteryEncounterBuilder.
|
|||||||
const eggMoves = pokemon.getEggMoves();
|
const eggMoves = pokemon.getEggMoves();
|
||||||
if (eggMoves) {
|
if (eggMoves) {
|
||||||
const eggMoveIndex = randSeedInt(4);
|
const eggMoveIndex = randSeedInt(4);
|
||||||
const randomEggMove: Moves = eggMoves[eggMoveIndex];
|
const randomEggMove: MoveId = eggMoves[eggMoveIndex];
|
||||||
encounter.misc = {
|
encounter.misc = {
|
||||||
eggMove: randomEggMove,
|
eggMove: randomEggMove,
|
||||||
pokemon: pokemon,
|
pokemon: pokemon,
|
||||||
@ -270,10 +270,10 @@ export const UncommonBreedEncounter: MysteryEncounter = MysteryEncounterBuilder.
|
|||||||
)
|
)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
function givePokemonExtraEggMove(pokemon: EnemyPokemon, previousEggMove: Moves) {
|
function givePokemonExtraEggMove(pokemon: EnemyPokemon, previousEggMove: MoveId) {
|
||||||
const eggMoves = pokemon.getEggMoves();
|
const eggMoves = pokemon.getEggMoves();
|
||||||
if (eggMoves) {
|
if (eggMoves) {
|
||||||
let randomEggMove: Moves = eggMoves[randSeedInt(4)];
|
let randomEggMove: MoveId = eggMoves[randSeedInt(4)];
|
||||||
while (randomEggMove === previousEggMove) {
|
while (randomEggMove === previousEggMove) {
|
||||||
randomEggMove = eggMoves[randSeedInt(4)];
|
randomEggMove = eggMoves[randSeedInt(4)];
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
@ -49,55 +49,55 @@ const namespace = "mysteryEncounters/weirdDream";
|
|||||||
|
|
||||||
/** Exclude Ultra Beasts, Paradox, Eternatus, and all legendary/mythical/trio pokemon that are below 570 BST */
|
/** Exclude Ultra Beasts, Paradox, Eternatus, and all legendary/mythical/trio pokemon that are below 570 BST */
|
||||||
const EXCLUDED_TRANSFORMATION_SPECIES = [
|
const EXCLUDED_TRANSFORMATION_SPECIES = [
|
||||||
Species.ETERNATUS,
|
SpeciesId.ETERNATUS,
|
||||||
/** UBs */
|
/** UBs */
|
||||||
Species.NIHILEGO,
|
SpeciesId.NIHILEGO,
|
||||||
Species.BUZZWOLE,
|
SpeciesId.BUZZWOLE,
|
||||||
Species.PHEROMOSA,
|
SpeciesId.PHEROMOSA,
|
||||||
Species.XURKITREE,
|
SpeciesId.XURKITREE,
|
||||||
Species.CELESTEELA,
|
SpeciesId.CELESTEELA,
|
||||||
Species.KARTANA,
|
SpeciesId.KARTANA,
|
||||||
Species.GUZZLORD,
|
SpeciesId.GUZZLORD,
|
||||||
Species.POIPOLE,
|
SpeciesId.POIPOLE,
|
||||||
Species.NAGANADEL,
|
SpeciesId.NAGANADEL,
|
||||||
Species.STAKATAKA,
|
SpeciesId.STAKATAKA,
|
||||||
Species.BLACEPHALON,
|
SpeciesId.BLACEPHALON,
|
||||||
/** Paradox */
|
/** Paradox */
|
||||||
Species.GREAT_TUSK,
|
SpeciesId.GREAT_TUSK,
|
||||||
Species.SCREAM_TAIL,
|
SpeciesId.SCREAM_TAIL,
|
||||||
Species.BRUTE_BONNET,
|
SpeciesId.BRUTE_BONNET,
|
||||||
Species.FLUTTER_MANE,
|
SpeciesId.FLUTTER_MANE,
|
||||||
Species.SLITHER_WING,
|
SpeciesId.SLITHER_WING,
|
||||||
Species.SANDY_SHOCKS,
|
SpeciesId.SANDY_SHOCKS,
|
||||||
Species.ROARING_MOON,
|
SpeciesId.ROARING_MOON,
|
||||||
Species.WALKING_WAKE,
|
SpeciesId.WALKING_WAKE,
|
||||||
Species.GOUGING_FIRE,
|
SpeciesId.GOUGING_FIRE,
|
||||||
Species.RAGING_BOLT,
|
SpeciesId.RAGING_BOLT,
|
||||||
Species.IRON_TREADS,
|
SpeciesId.IRON_TREADS,
|
||||||
Species.IRON_BUNDLE,
|
SpeciesId.IRON_BUNDLE,
|
||||||
Species.IRON_HANDS,
|
SpeciesId.IRON_HANDS,
|
||||||
Species.IRON_JUGULIS,
|
SpeciesId.IRON_JUGULIS,
|
||||||
Species.IRON_MOTH,
|
SpeciesId.IRON_MOTH,
|
||||||
Species.IRON_THORNS,
|
SpeciesId.IRON_THORNS,
|
||||||
Species.IRON_VALIANT,
|
SpeciesId.IRON_VALIANT,
|
||||||
Species.IRON_LEAVES,
|
SpeciesId.IRON_LEAVES,
|
||||||
Species.IRON_BOULDER,
|
SpeciesId.IRON_BOULDER,
|
||||||
Species.IRON_CROWN,
|
SpeciesId.IRON_CROWN,
|
||||||
/** These are banned so they don't appear in the < 570 BST pool */
|
/** These are banned so they don't appear in the < 570 BST pool */
|
||||||
Species.COSMOG,
|
SpeciesId.COSMOG,
|
||||||
Species.MELTAN,
|
SpeciesId.MELTAN,
|
||||||
Species.KUBFU,
|
SpeciesId.KUBFU,
|
||||||
Species.COSMOEM,
|
SpeciesId.COSMOEM,
|
||||||
Species.POIPOLE,
|
SpeciesId.POIPOLE,
|
||||||
Species.TERAPAGOS,
|
SpeciesId.TERAPAGOS,
|
||||||
Species.TYPE_NULL,
|
SpeciesId.TYPE_NULL,
|
||||||
Species.CALYREX,
|
SpeciesId.CALYREX,
|
||||||
Species.NAGANADEL,
|
SpeciesId.NAGANADEL,
|
||||||
Species.URSHIFU,
|
SpeciesId.URSHIFU,
|
||||||
Species.OGERPON,
|
SpeciesId.OGERPON,
|
||||||
Species.OKIDOGI,
|
SpeciesId.OKIDOGI,
|
||||||
Species.MUNKIDORI,
|
SpeciesId.MUNKIDORI,
|
||||||
Species.FEZANDIPITI,
|
SpeciesId.FEZANDIPITI,
|
||||||
];
|
];
|
||||||
|
|
||||||
const SUPER_LEGENDARY_BST_THRESHOLD = 600;
|
const SUPER_LEGENDARY_BST_THRESHOLD = 600;
|
||||||
@ -500,7 +500,7 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) {
|
|||||||
async function postProcessTransformedPokemon(
|
async function postProcessTransformedPokemon(
|
||||||
previousPokemon: PlayerPokemon,
|
previousPokemon: PlayerPokemon,
|
||||||
newPokemon: PlayerPokemon,
|
newPokemon: PlayerPokemon,
|
||||||
speciesRootForm: Species,
|
speciesRootForm: SpeciesId,
|
||||||
forBattle = false,
|
forBattle = false,
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
let isNewStarter = false;
|
let isNewStarter = false;
|
||||||
@ -768,7 +768,7 @@ function doSideBySideTransformations(transformations: PokemonTransformation[]) {
|
|||||||
*/
|
*/
|
||||||
async function addEggMoveToNewPokemonMoveset(
|
async function addEggMoveToNewPokemonMoveset(
|
||||||
newPokemon: PlayerPokemon,
|
newPokemon: PlayerPokemon,
|
||||||
speciesRootForm: Species,
|
speciesRootForm: SpeciesId,
|
||||||
forBattle = false,
|
forBattle = false,
|
||||||
): Promise<number | null> {
|
): Promise<number | null> {
|
||||||
let eggMoveIndex: null | number = null;
|
let eggMoveIndex: null | number = null;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import type { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue";
|
import type { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue";
|
||||||
import type { Moves } from "#app/enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import type { PlayerPokemon } from "#app/field/pokemon";
|
import type { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import type Pokemon from "#app/field/pokemon";
|
import type Pokemon from "#app/field/pokemon";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
@ -300,7 +300,7 @@ export class MysteryEncounterOptionBuilder implements Partial<IMysteryEncounterO
|
|||||||
* @param options see {@linkcode CanLearnMoveRequirementOptions}
|
* @param options see {@linkcode CanLearnMoveRequirementOptions}
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
withPokemonCanLearnMoveRequirement(move: Moves | Moves[], options?: CanLearnMoveRequirementOptions) {
|
withPokemonCanLearnMoveRequirement(move: MoveId | MoveId[], options?: CanLearnMoveRequirementOptions) {
|
||||||
return this.withPrimaryPokemonRequirement(new CanLearnMoveRequirement(move, options));
|
return this.withPrimaryPokemonRequirement(new CanLearnMoveRequirement(move, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,10 +10,10 @@ import type { PlayerPokemon } from "#app/field/pokemon";
|
|||||||
import { AttackTypeBoosterModifier } from "#app/modifier/modifier";
|
import { AttackTypeBoosterModifier } from "#app/modifier/modifier";
|
||||||
import type { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type";
|
import type { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type";
|
||||||
import { isNullOrUndefined } from "#app/utils/common";
|
import { isNullOrUndefined } from "#app/utils/common";
|
||||||
import type { Abilities } from "#enums/abilities";
|
import type { AbilityId } from "#enums/ability-id";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import type { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import type { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { SpeciesFormKey } from "#enums/species-form-key";
|
import { SpeciesFormKey } from "#enums/species-form-key";
|
||||||
import { TimeOfDay } from "#enums/time-of-day";
|
import { TimeOfDay } from "#enums/time-of-day";
|
||||||
|
|
||||||
@ -424,11 +424,11 @@ export class MoneyRequirement extends EncounterSceneRequirement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class SpeciesRequirement extends EncounterPokemonRequirement {
|
export class SpeciesRequirement extends EncounterPokemonRequirement {
|
||||||
requiredSpecies: Species[];
|
requiredSpecies: SpeciesId[];
|
||||||
minNumberOfPokemon: number;
|
minNumberOfPokemon: number;
|
||||||
invertQuery: boolean;
|
invertQuery: boolean;
|
||||||
|
|
||||||
constructor(species: Species | Species[], minNumberOfPokemon = 1, invertQuery = false) {
|
constructor(species: SpeciesId | SpeciesId[], minNumberOfPokemon = 1, invertQuery = false) {
|
||||||
super();
|
super();
|
||||||
this.minNumberOfPokemon = minNumberOfPokemon;
|
this.minNumberOfPokemon = minNumberOfPokemon;
|
||||||
this.invertQuery = invertQuery;
|
this.invertQuery = invertQuery;
|
||||||
@ -457,7 +457,7 @@ export class SpeciesRequirement extends EncounterPokemonRequirement {
|
|||||||
|
|
||||||
override getDialogueToken(pokemon?: PlayerPokemon): [string, string] {
|
override getDialogueToken(pokemon?: PlayerPokemon): [string, string] {
|
||||||
if (pokemon?.species.speciesId && this.requiredSpecies.includes(pokemon.species.speciesId)) {
|
if (pokemon?.species.speciesId && this.requiredSpecies.includes(pokemon.species.speciesId)) {
|
||||||
return ["species", Species[pokemon.species.speciesId]];
|
return ["species", SpeciesId[pokemon.species.speciesId]];
|
||||||
}
|
}
|
||||||
return ["species", ""];
|
return ["species", ""];
|
||||||
}
|
}
|
||||||
@ -549,12 +549,17 @@ export class TypeRequirement extends EncounterPokemonRequirement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class MoveRequirement extends EncounterPokemonRequirement {
|
export class MoveRequirement extends EncounterPokemonRequirement {
|
||||||
requiredMoves: Moves[] = [];
|
requiredMoves: MoveId[] = [];
|
||||||
minNumberOfPokemon: number;
|
minNumberOfPokemon: number;
|
||||||
invertQuery: boolean;
|
invertQuery: boolean;
|
||||||
excludeDisallowedPokemon: boolean;
|
excludeDisallowedPokemon: boolean;
|
||||||
|
|
||||||
constructor(moves: Moves | Moves[], excludeDisallowedPokemon: boolean, minNumberOfPokemon = 1, invertQuery = false) {
|
constructor(
|
||||||
|
moves: MoveId | MoveId[],
|
||||||
|
excludeDisallowedPokemon: boolean,
|
||||||
|
minNumberOfPokemon = 1,
|
||||||
|
invertQuery = false,
|
||||||
|
) {
|
||||||
super();
|
super();
|
||||||
this.excludeDisallowedPokemon = excludeDisallowedPokemon;
|
this.excludeDisallowedPokemon = excludeDisallowedPokemon;
|
||||||
this.minNumberOfPokemon = minNumberOfPokemon;
|
this.minNumberOfPokemon = minNumberOfPokemon;
|
||||||
@ -602,11 +607,11 @@ export class MoveRequirement extends EncounterPokemonRequirement {
|
|||||||
* NOTE: If the Pokemon already knows the move, this requirement will fail, since it's not technically learnable.
|
* NOTE: If the Pokemon already knows the move, this requirement will fail, since it's not technically learnable.
|
||||||
*/
|
*/
|
||||||
export class CompatibleMoveRequirement extends EncounterPokemonRequirement {
|
export class CompatibleMoveRequirement extends EncounterPokemonRequirement {
|
||||||
requiredMoves: Moves[];
|
requiredMoves: MoveId[];
|
||||||
minNumberOfPokemon: number;
|
minNumberOfPokemon: number;
|
||||||
invertQuery: boolean;
|
invertQuery: boolean;
|
||||||
|
|
||||||
constructor(learnableMove: Moves | Moves[], minNumberOfPokemon = 1, invertQuery = false) {
|
constructor(learnableMove: MoveId | MoveId[], minNumberOfPokemon = 1, invertQuery = false) {
|
||||||
super();
|
super();
|
||||||
this.minNumberOfPokemon = minNumberOfPokemon;
|
this.minNumberOfPokemon = minNumberOfPokemon;
|
||||||
this.invertQuery = invertQuery;
|
this.invertQuery = invertQuery;
|
||||||
@ -644,20 +649,20 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement {
|
|||||||
pokemon?.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(reqMove),
|
pokemon?.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(reqMove),
|
||||||
);
|
);
|
||||||
if (includedCompatMoves.length > 0) {
|
if (includedCompatMoves.length > 0) {
|
||||||
return ["compatibleMove", Moves[includedCompatMoves[0]]];
|
return ["compatibleMove", MoveId[includedCompatMoves[0]]];
|
||||||
}
|
}
|
||||||
return ["compatibleMove", ""];
|
return ["compatibleMove", ""];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class AbilityRequirement extends EncounterPokemonRequirement {
|
export class AbilityRequirement extends EncounterPokemonRequirement {
|
||||||
requiredAbilities: Abilities[];
|
requiredAbilities: AbilityId[];
|
||||||
minNumberOfPokemon: number;
|
minNumberOfPokemon: number;
|
||||||
invertQuery: boolean;
|
invertQuery: boolean;
|
||||||
excludeDisallowedPokemon: boolean;
|
excludeDisallowedPokemon: boolean;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
abilities: Abilities | Abilities[],
|
abilities: AbilityId | AbilityId[],
|
||||||
excludeDisallowedPokemon: boolean,
|
excludeDisallowedPokemon: boolean,
|
||||||
minNumberOfPokemon = 1,
|
minNumberOfPokemon = 1,
|
||||||
invertQuery = false,
|
invertQuery = false,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { DarkDealEncounter } from "./encounters/dark-deal-encounter";
|
import { DarkDealEncounter } from "./encounters/dark-deal-encounter";
|
||||||
import { DepartmentStoreSaleEncounter } from "./encounters/department-store-sale-encounter";
|
import { DepartmentStoreSaleEncounter } from "./encounters/department-store-sale-encounter";
|
||||||
@ -71,44 +71,44 @@ export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 12;
|
|||||||
export const ANTI_VARIANCE_WEIGHT_MODIFIER = 15;
|
export const ANTI_VARIANCE_WEIGHT_MODIFIER = 15;
|
||||||
|
|
||||||
export const EXTREME_ENCOUNTER_BIOMES = [
|
export const EXTREME_ENCOUNTER_BIOMES = [
|
||||||
Biome.SEA,
|
BiomeId.SEA,
|
||||||
Biome.SEABED,
|
BiomeId.SEABED,
|
||||||
Biome.BADLANDS,
|
BiomeId.BADLANDS,
|
||||||
Biome.DESERT,
|
BiomeId.DESERT,
|
||||||
Biome.ICE_CAVE,
|
BiomeId.ICE_CAVE,
|
||||||
Biome.VOLCANO,
|
BiomeId.VOLCANO,
|
||||||
Biome.WASTELAND,
|
BiomeId.WASTELAND,
|
||||||
Biome.ABYSS,
|
BiomeId.ABYSS,
|
||||||
Biome.SPACE,
|
BiomeId.SPACE,
|
||||||
Biome.END,
|
BiomeId.END,
|
||||||
];
|
];
|
||||||
|
|
||||||
export const NON_EXTREME_ENCOUNTER_BIOMES = [
|
export const NON_EXTREME_ENCOUNTER_BIOMES = [
|
||||||
Biome.TOWN,
|
BiomeId.TOWN,
|
||||||
Biome.PLAINS,
|
BiomeId.PLAINS,
|
||||||
Biome.GRASS,
|
BiomeId.GRASS,
|
||||||
Biome.TALL_GRASS,
|
BiomeId.TALL_GRASS,
|
||||||
Biome.METROPOLIS,
|
BiomeId.METROPOLIS,
|
||||||
Biome.FOREST,
|
BiomeId.FOREST,
|
||||||
Biome.SWAMP,
|
BiomeId.SWAMP,
|
||||||
Biome.BEACH,
|
BiomeId.BEACH,
|
||||||
Biome.LAKE,
|
BiomeId.LAKE,
|
||||||
Biome.MOUNTAIN,
|
BiomeId.MOUNTAIN,
|
||||||
Biome.CAVE,
|
BiomeId.CAVE,
|
||||||
Biome.MEADOW,
|
BiomeId.MEADOW,
|
||||||
Biome.POWER_PLANT,
|
BiomeId.POWER_PLANT,
|
||||||
Biome.GRAVEYARD,
|
BiomeId.GRAVEYARD,
|
||||||
Biome.DOJO,
|
BiomeId.DOJO,
|
||||||
Biome.FACTORY,
|
BiomeId.FACTORY,
|
||||||
Biome.RUINS,
|
BiomeId.RUINS,
|
||||||
Biome.CONSTRUCTION_SITE,
|
BiomeId.CONSTRUCTION_SITE,
|
||||||
Biome.JUNGLE,
|
BiomeId.JUNGLE,
|
||||||
Biome.FAIRY_CAVE,
|
BiomeId.FAIRY_CAVE,
|
||||||
Biome.TEMPLE,
|
BiomeId.TEMPLE,
|
||||||
Biome.SLUM,
|
BiomeId.SLUM,
|
||||||
Biome.SNOWY_FOREST,
|
BiomeId.SNOWY_FOREST,
|
||||||
Biome.ISLAND,
|
BiomeId.ISLAND,
|
||||||
Biome.LABORATORY,
|
BiomeId.LABORATORY,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -120,55 +120,55 @@ export const NON_EXTREME_ENCOUNTER_BIOMES = [
|
|||||||
* + ICE_CAVE
|
* + ICE_CAVE
|
||||||
*/
|
*/
|
||||||
export const HUMAN_TRANSITABLE_BIOMES = [
|
export const HUMAN_TRANSITABLE_BIOMES = [
|
||||||
Biome.TOWN,
|
BiomeId.TOWN,
|
||||||
Biome.PLAINS,
|
BiomeId.PLAINS,
|
||||||
Biome.GRASS,
|
BiomeId.GRASS,
|
||||||
Biome.TALL_GRASS,
|
BiomeId.TALL_GRASS,
|
||||||
Biome.METROPOLIS,
|
BiomeId.METROPOLIS,
|
||||||
Biome.FOREST,
|
BiomeId.FOREST,
|
||||||
Biome.SWAMP,
|
BiomeId.SWAMP,
|
||||||
Biome.BEACH,
|
BiomeId.BEACH,
|
||||||
Biome.LAKE,
|
BiomeId.LAKE,
|
||||||
Biome.MOUNTAIN,
|
BiomeId.MOUNTAIN,
|
||||||
Biome.BADLANDS,
|
BiomeId.BADLANDS,
|
||||||
Biome.CAVE,
|
BiomeId.CAVE,
|
||||||
Biome.DESERT,
|
BiomeId.DESERT,
|
||||||
Biome.ICE_CAVE,
|
BiomeId.ICE_CAVE,
|
||||||
Biome.MEADOW,
|
BiomeId.MEADOW,
|
||||||
Biome.POWER_PLANT,
|
BiomeId.POWER_PLANT,
|
||||||
Biome.GRAVEYARD,
|
BiomeId.GRAVEYARD,
|
||||||
Biome.DOJO,
|
BiomeId.DOJO,
|
||||||
Biome.FACTORY,
|
BiomeId.FACTORY,
|
||||||
Biome.RUINS,
|
BiomeId.RUINS,
|
||||||
Biome.CONSTRUCTION_SITE,
|
BiomeId.CONSTRUCTION_SITE,
|
||||||
Biome.JUNGLE,
|
BiomeId.JUNGLE,
|
||||||
Biome.FAIRY_CAVE,
|
BiomeId.FAIRY_CAVE,
|
||||||
Biome.TEMPLE,
|
BiomeId.TEMPLE,
|
||||||
Biome.SLUM,
|
BiomeId.SLUM,
|
||||||
Biome.SNOWY_FOREST,
|
BiomeId.SNOWY_FOREST,
|
||||||
Biome.ISLAND,
|
BiomeId.ISLAND,
|
||||||
Biome.LABORATORY,
|
BiomeId.LABORATORY,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Places where you could expect a town or city, some form of large civilization
|
* Places where you could expect a town or city, some form of large civilization
|
||||||
*/
|
*/
|
||||||
export const CIVILIZATION_ENCOUNTER_BIOMES = [
|
export const CIVILIZATION_ENCOUNTER_BIOMES = [
|
||||||
Biome.TOWN,
|
BiomeId.TOWN,
|
||||||
Biome.PLAINS,
|
BiomeId.PLAINS,
|
||||||
Biome.GRASS,
|
BiomeId.GRASS,
|
||||||
Biome.TALL_GRASS,
|
BiomeId.TALL_GRASS,
|
||||||
Biome.METROPOLIS,
|
BiomeId.METROPOLIS,
|
||||||
Biome.BEACH,
|
BiomeId.BEACH,
|
||||||
Biome.LAKE,
|
BiomeId.LAKE,
|
||||||
Biome.MEADOW,
|
BiomeId.MEADOW,
|
||||||
Biome.POWER_PLANT,
|
BiomeId.POWER_PLANT,
|
||||||
Biome.GRAVEYARD,
|
BiomeId.GRAVEYARD,
|
||||||
Biome.DOJO,
|
BiomeId.DOJO,
|
||||||
Biome.FACTORY,
|
BiomeId.FACTORY,
|
||||||
Biome.CONSTRUCTION_SITE,
|
BiomeId.CONSTRUCTION_SITE,
|
||||||
Biome.SLUM,
|
BiomeId.SLUM,
|
||||||
Biome.ISLAND,
|
BiomeId.ISLAND,
|
||||||
];
|
];
|
||||||
|
|
||||||
export const allMysteryEncounters: {
|
export const allMysteryEncounters: {
|
||||||
@ -224,41 +224,41 @@ const anyBiomeEncounters: MysteryEncounterType[] = [
|
|||||||
* Adding specific Encounters to the mysteryEncountersByBiome map is for specific cases and special circumstances
|
* Adding specific Encounters to the mysteryEncountersByBiome map is for specific cases and special circumstances
|
||||||
* that biome groups do not cover
|
* that biome groups do not cover
|
||||||
*/
|
*/
|
||||||
export const mysteryEncountersByBiome = new Map<Biome, MysteryEncounterType[]>([
|
export const mysteryEncountersByBiome = new Map<BiomeId, MysteryEncounterType[]>([
|
||||||
[Biome.TOWN, []],
|
[BiomeId.TOWN, []],
|
||||||
[Biome.PLAINS, [MysteryEncounterType.SLUMBERING_SNORLAX]],
|
[BiomeId.PLAINS, [MysteryEncounterType.SLUMBERING_SNORLAX]],
|
||||||
[Biome.GRASS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]],
|
[BiomeId.GRASS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]],
|
||||||
[Biome.TALL_GRASS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]],
|
[BiomeId.TALL_GRASS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]],
|
||||||
[Biome.METROPOLIS, []],
|
[BiomeId.METROPOLIS, []],
|
||||||
[Biome.FOREST, [MysteryEncounterType.SAFARI_ZONE, MysteryEncounterType.ABSOLUTE_AVARICE]],
|
[BiomeId.FOREST, [MysteryEncounterType.SAFARI_ZONE, MysteryEncounterType.ABSOLUTE_AVARICE]],
|
||||||
[Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]],
|
[BiomeId.SEA, [MysteryEncounterType.LOST_AT_SEA]],
|
||||||
[Biome.SWAMP, [MysteryEncounterType.SAFARI_ZONE]],
|
[BiomeId.SWAMP, [MysteryEncounterType.SAFARI_ZONE]],
|
||||||
[Biome.BEACH, []],
|
[BiomeId.BEACH, []],
|
||||||
[Biome.LAKE, []],
|
[BiomeId.LAKE, []],
|
||||||
[Biome.SEABED, []],
|
[BiomeId.SEABED, []],
|
||||||
[Biome.MOUNTAIN, []],
|
[BiomeId.MOUNTAIN, []],
|
||||||
[Biome.BADLANDS, [MysteryEncounterType.DANCING_LESSONS]],
|
[BiomeId.BADLANDS, [MysteryEncounterType.DANCING_LESSONS]],
|
||||||
[Biome.CAVE, [MysteryEncounterType.THE_STRONG_STUFF]],
|
[BiomeId.CAVE, [MysteryEncounterType.THE_STRONG_STUFF]],
|
||||||
[Biome.DESERT, [MysteryEncounterType.DANCING_LESSONS]],
|
[BiomeId.DESERT, [MysteryEncounterType.DANCING_LESSONS]],
|
||||||
[Biome.ICE_CAVE, []],
|
[BiomeId.ICE_CAVE, []],
|
||||||
[Biome.MEADOW, []],
|
[BiomeId.MEADOW, []],
|
||||||
[Biome.POWER_PLANT, []],
|
[BiomeId.POWER_PLANT, []],
|
||||||
[Biome.VOLCANO, [MysteryEncounterType.FIERY_FALLOUT, MysteryEncounterType.DANCING_LESSONS]],
|
[BiomeId.VOLCANO, [MysteryEncounterType.FIERY_FALLOUT, MysteryEncounterType.DANCING_LESSONS]],
|
||||||
[Biome.GRAVEYARD, []],
|
[BiomeId.GRAVEYARD, []],
|
||||||
[Biome.DOJO, []],
|
[BiomeId.DOJO, []],
|
||||||
[Biome.FACTORY, []],
|
[BiomeId.FACTORY, []],
|
||||||
[Biome.RUINS, []],
|
[BiomeId.RUINS, []],
|
||||||
[Biome.WASTELAND, [MysteryEncounterType.DANCING_LESSONS]],
|
[BiomeId.WASTELAND, [MysteryEncounterType.DANCING_LESSONS]],
|
||||||
[Biome.ABYSS, [MysteryEncounterType.DANCING_LESSONS]],
|
[BiomeId.ABYSS, [MysteryEncounterType.DANCING_LESSONS]],
|
||||||
[Biome.SPACE, [MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER]],
|
[BiomeId.SPACE, [MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER]],
|
||||||
[Biome.CONSTRUCTION_SITE, []],
|
[BiomeId.CONSTRUCTION_SITE, []],
|
||||||
[Biome.JUNGLE, [MysteryEncounterType.SAFARI_ZONE]],
|
[BiomeId.JUNGLE, [MysteryEncounterType.SAFARI_ZONE]],
|
||||||
[Biome.FAIRY_CAVE, []],
|
[BiomeId.FAIRY_CAVE, []],
|
||||||
[Biome.TEMPLE, []],
|
[BiomeId.TEMPLE, []],
|
||||||
[Biome.SLUM, []],
|
[BiomeId.SLUM, []],
|
||||||
[Biome.SNOWY_FOREST, []],
|
[BiomeId.SNOWY_FOREST, []],
|
||||||
[Biome.ISLAND, []],
|
[BiomeId.ISLAND, []],
|
||||||
[Biome.LABORATORY, []],
|
[BiomeId.LABORATORY, []],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export function initMysteryEncounters() {
|
export function initMysteryEncounters() {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { Moves } from "#app/enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import type { PlayerPokemon } from "#app/field/pokemon";
|
import type { PlayerPokemon } from "#app/field/pokemon";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
import { isNullOrUndefined } from "#app/utils/common";
|
import { isNullOrUndefined } from "#app/utils/common";
|
||||||
@ -21,13 +21,13 @@ export interface CanLearnMoveRequirementOptions {
|
|||||||
* Requires that a pokemon can learn a specific move/moveset.
|
* Requires that a pokemon can learn a specific move/moveset.
|
||||||
*/
|
*/
|
||||||
export class CanLearnMoveRequirement extends EncounterPokemonRequirement {
|
export class CanLearnMoveRequirement extends EncounterPokemonRequirement {
|
||||||
private readonly requiredMoves: Moves[];
|
private readonly requiredMoves: MoveId[];
|
||||||
private readonly excludeLevelMoves?: boolean;
|
private readonly excludeLevelMoves?: boolean;
|
||||||
private readonly excludeTmMoves?: boolean;
|
private readonly excludeTmMoves?: boolean;
|
||||||
private readonly excludeEggMoves?: boolean;
|
private readonly excludeEggMoves?: boolean;
|
||||||
private readonly includeFainted?: boolean;
|
private readonly includeFainted?: boolean;
|
||||||
|
|
||||||
constructor(requiredMoves: Moves | Moves[], options: CanLearnMoveRequirementOptions = {}) {
|
constructor(requiredMoves: MoveId | MoveId[], options: CanLearnMoveRequirementOptions = {}) {
|
||||||
super();
|
super();
|
||||||
this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [requiredMoves];
|
this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [requiredMoves];
|
||||||
|
|
||||||
@ -69,12 +69,12 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement {
|
|||||||
return ["requiredMoves", this.requiredMoves.map(m => new PokemonMove(m).getName()).join(", ")];
|
return ["requiredMoves", this.requiredMoves.map(m => new PokemonMove(m).getName()).join(", ")];
|
||||||
}
|
}
|
||||||
|
|
||||||
private getPokemonLevelMoves(pkm: PlayerPokemon): Moves[] {
|
private getPokemonLevelMoves(pkm: PlayerPokemon): MoveId[] {
|
||||||
return pkm.getLevelMoves().map(([_level, move]) => move);
|
return pkm.getLevelMoves().map(([_level, move]) => move);
|
||||||
}
|
}
|
||||||
|
|
||||||
private getAllPokemonMoves(pkm: PlayerPokemon): Moves[] {
|
private getAllPokemonMoves(pkm: PlayerPokemon): MoveId[] {
|
||||||
const allPokemonMoves: Moves[] = [];
|
const allPokemonMoves: MoveId[] = [];
|
||||||
|
|
||||||
if (!this.excludeLevelMoves) {
|
if (!this.excludeLevelMoves) {
|
||||||
allPokemonMoves.push(...(this.getPokemonLevelMoves(pkm) ?? []));
|
allPokemonMoves.push(...(this.getPokemonLevelMoves(pkm) ?? []));
|
||||||
|
@ -1,130 +1,137 @@
|
|||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves that "steal" things
|
* Moves that "steal" things
|
||||||
*/
|
*/
|
||||||
export const STEALING_MOVES = [Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO];
|
export const STEALING_MOVES = [
|
||||||
|
MoveId.PLUCK,
|
||||||
|
MoveId.COVET,
|
||||||
|
MoveId.KNOCK_OFF,
|
||||||
|
MoveId.THIEF,
|
||||||
|
MoveId.TRICK,
|
||||||
|
MoveId.SWITCHEROO,
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves that "charm" someone
|
* Moves that "charm" someone
|
||||||
*/
|
*/
|
||||||
export const CHARMING_MOVES = [
|
export const CHARMING_MOVES = [
|
||||||
Moves.CHARM,
|
MoveId.CHARM,
|
||||||
Moves.FLATTER,
|
MoveId.FLATTER,
|
||||||
Moves.DRAGON_CHEER,
|
MoveId.DRAGON_CHEER,
|
||||||
Moves.ALLURING_VOICE,
|
MoveId.ALLURING_VOICE,
|
||||||
Moves.ATTRACT,
|
MoveId.ATTRACT,
|
||||||
Moves.SWEET_SCENT,
|
MoveId.SWEET_SCENT,
|
||||||
Moves.CAPTIVATE,
|
MoveId.CAPTIVATE,
|
||||||
Moves.AROMATIC_MIST,
|
MoveId.AROMATIC_MIST,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves for the Dancer ability
|
* Moves for the Dancer ability
|
||||||
*/
|
*/
|
||||||
export const DANCING_MOVES = [
|
export const DANCING_MOVES = [
|
||||||
Moves.AQUA_STEP,
|
MoveId.AQUA_STEP,
|
||||||
Moves.CLANGOROUS_SOUL,
|
MoveId.CLANGOROUS_SOUL,
|
||||||
Moves.DRAGON_DANCE,
|
MoveId.DRAGON_DANCE,
|
||||||
Moves.FEATHER_DANCE,
|
MoveId.FEATHER_DANCE,
|
||||||
Moves.FIERY_DANCE,
|
MoveId.FIERY_DANCE,
|
||||||
Moves.LUNAR_DANCE,
|
MoveId.LUNAR_DANCE,
|
||||||
Moves.PETAL_DANCE,
|
MoveId.PETAL_DANCE,
|
||||||
Moves.REVELATION_DANCE,
|
MoveId.REVELATION_DANCE,
|
||||||
Moves.QUIVER_DANCE,
|
MoveId.QUIVER_DANCE,
|
||||||
Moves.SWORDS_DANCE,
|
MoveId.SWORDS_DANCE,
|
||||||
Moves.TEETER_DANCE,
|
MoveId.TEETER_DANCE,
|
||||||
Moves.VICTORY_DANCE,
|
MoveId.VICTORY_DANCE,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves that can distract someone/something
|
* Moves that can distract someone/something
|
||||||
*/
|
*/
|
||||||
export const DISTRACTION_MOVES = [
|
export const DISTRACTION_MOVES = [
|
||||||
Moves.FAKE_OUT,
|
MoveId.FAKE_OUT,
|
||||||
Moves.FOLLOW_ME,
|
MoveId.FOLLOW_ME,
|
||||||
Moves.TAUNT,
|
MoveId.TAUNT,
|
||||||
Moves.ROAR,
|
MoveId.ROAR,
|
||||||
Moves.TELEPORT,
|
MoveId.TELEPORT,
|
||||||
Moves.CHARM,
|
MoveId.CHARM,
|
||||||
Moves.FAKE_TEARS,
|
MoveId.FAKE_TEARS,
|
||||||
Moves.TICKLE,
|
MoveId.TICKLE,
|
||||||
Moves.CAPTIVATE,
|
MoveId.CAPTIVATE,
|
||||||
Moves.RAGE_POWDER,
|
MoveId.RAGE_POWDER,
|
||||||
Moves.SUBSTITUTE,
|
MoveId.SUBSTITUTE,
|
||||||
Moves.SHED_TAIL,
|
MoveId.SHED_TAIL,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves that protect in some way
|
* Moves that protect in some way
|
||||||
*/
|
*/
|
||||||
export const PROTECTING_MOVES = [
|
export const PROTECTING_MOVES = [
|
||||||
Moves.PROTECT,
|
MoveId.PROTECT,
|
||||||
Moves.WIDE_GUARD,
|
MoveId.WIDE_GUARD,
|
||||||
Moves.MAX_GUARD,
|
MoveId.MAX_GUARD,
|
||||||
Moves.SAFEGUARD,
|
MoveId.SAFEGUARD,
|
||||||
Moves.REFLECT,
|
MoveId.REFLECT,
|
||||||
Moves.BARRIER,
|
MoveId.BARRIER,
|
||||||
Moves.QUICK_GUARD,
|
MoveId.QUICK_GUARD,
|
||||||
Moves.FLOWER_SHIELD,
|
MoveId.FLOWER_SHIELD,
|
||||||
Moves.KINGS_SHIELD,
|
MoveId.KINGS_SHIELD,
|
||||||
Moves.CRAFTY_SHIELD,
|
MoveId.CRAFTY_SHIELD,
|
||||||
Moves.SPIKY_SHIELD,
|
MoveId.SPIKY_SHIELD,
|
||||||
Moves.OBSTRUCT,
|
MoveId.OBSTRUCT,
|
||||||
Moves.DETECT,
|
MoveId.DETECT,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves that (loosely) can be used to trap/rob someone
|
* Moves that (loosely) can be used to trap/rob someone
|
||||||
*/
|
*/
|
||||||
export const EXTORTION_MOVES = [
|
export const EXTORTION_MOVES = [
|
||||||
Moves.BIND,
|
MoveId.BIND,
|
||||||
Moves.CLAMP,
|
MoveId.CLAMP,
|
||||||
Moves.INFESTATION,
|
MoveId.INFESTATION,
|
||||||
Moves.SAND_TOMB,
|
MoveId.SAND_TOMB,
|
||||||
Moves.SNAP_TRAP,
|
MoveId.SNAP_TRAP,
|
||||||
Moves.THUNDER_CAGE,
|
MoveId.THUNDER_CAGE,
|
||||||
Moves.WRAP,
|
MoveId.WRAP,
|
||||||
Moves.SPIRIT_SHACKLE,
|
MoveId.SPIRIT_SHACKLE,
|
||||||
Moves.MEAN_LOOK,
|
MoveId.MEAN_LOOK,
|
||||||
Moves.JAW_LOCK,
|
MoveId.JAW_LOCK,
|
||||||
Moves.BLOCK,
|
MoveId.BLOCK,
|
||||||
Moves.SPIDER_WEB,
|
MoveId.SPIDER_WEB,
|
||||||
Moves.ANCHOR_SHOT,
|
MoveId.ANCHOR_SHOT,
|
||||||
Moves.OCTOLOCK,
|
MoveId.OCTOLOCK,
|
||||||
Moves.PURSUIT,
|
MoveId.PURSUIT,
|
||||||
Moves.CONSTRICT,
|
MoveId.CONSTRICT,
|
||||||
Moves.BEAT_UP,
|
MoveId.BEAT_UP,
|
||||||
Moves.COIL,
|
MoveId.COIL,
|
||||||
Moves.WRING_OUT,
|
MoveId.WRING_OUT,
|
||||||
Moves.STRING_SHOT,
|
MoveId.STRING_SHOT,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abilities that (loosely) can be used to trap/rob someone
|
* Abilities that (loosely) can be used to trap/rob someone
|
||||||
*/
|
*/
|
||||||
export const EXTORTION_ABILITIES = [
|
export const EXTORTION_ABILITIES = [
|
||||||
Abilities.INTIMIDATE,
|
AbilityId.INTIMIDATE,
|
||||||
Abilities.ARENA_TRAP,
|
AbilityId.ARENA_TRAP,
|
||||||
Abilities.SHADOW_TAG,
|
AbilityId.SHADOW_TAG,
|
||||||
Abilities.SUCTION_CUPS,
|
AbilityId.SUCTION_CUPS,
|
||||||
Abilities.STICKY_HOLD,
|
AbilityId.STICKY_HOLD,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abilities that signify resistance to fire
|
* Abilities that signify resistance to fire
|
||||||
*/
|
*/
|
||||||
export const FIRE_RESISTANT_ABILITIES = [
|
export const FIRE_RESISTANT_ABILITIES = [
|
||||||
Abilities.FLAME_BODY,
|
AbilityId.FLAME_BODY,
|
||||||
Abilities.FLASH_FIRE,
|
AbilityId.FLASH_FIRE,
|
||||||
Abilities.WELL_BAKED_BODY,
|
AbilityId.WELL_BAKED_BODY,
|
||||||
Abilities.HEATPROOF,
|
AbilityId.HEATPROOF,
|
||||||
Abilities.THERMAL_EXCHANGE,
|
AbilityId.THERMAL_EXCHANGE,
|
||||||
Abilities.THICK_FAT,
|
AbilityId.THICK_FAT,
|
||||||
Abilities.WATER_BUBBLE,
|
AbilityId.WATER_BUBBLE,
|
||||||
Abilities.MAGMA_ARMOR,
|
AbilityId.MAGMA_ARMOR,
|
||||||
Abilities.WATER_VEIL,
|
AbilityId.WATER_VEIL,
|
||||||
Abilities.STEAM_ENGINE,
|
AbilityId.STEAM_ENGINE,
|
||||||
Abilities.PRIMORDIAL_SEA,
|
AbilityId.PRIMORDIAL_SEA,
|
||||||
];
|
];
|
||||||
|
@ -33,13 +33,13 @@ import { PartyUiMode } from "#app/ui/party-ui-handler";
|
|||||||
import { UiMode } from "#enums/ui-mode";
|
import { UiMode } from "#enums/ui-mode";
|
||||||
import { isNullOrUndefined, randSeedInt, randomString, randSeedItem } from "#app/utils/common";
|
import { isNullOrUndefined, randSeedInt, randomString, randSeedItem } from "#app/utils/common";
|
||||||
import type { BattlerTagType } from "#enums/battler-tag-type";
|
import type { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import type { TrainerType } from "#enums/trainer-type";
|
import type { TrainerType } from "#enums/trainer-type";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
import Trainer, { TrainerVariant } from "#app/field/trainer";
|
||||||
import type { Gender } from "#app/data/gender";
|
import type { Gender } from "#app/data/gender";
|
||||||
import type { Nature } from "#enums/nature";
|
import type { Nature } from "#enums/nature";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
|
import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
|
||||||
import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
|
import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
|
||||||
import { Status } from "#app/data/status-effect";
|
import { Status } from "#app/data/status-effect";
|
||||||
@ -106,7 +106,7 @@ export interface EnemyPokemonConfig {
|
|||||||
level?: number;
|
level?: number;
|
||||||
gender?: Gender;
|
gender?: Gender;
|
||||||
passive?: boolean;
|
passive?: boolean;
|
||||||
moveSet?: Moves[];
|
moveSet?: MoveId[];
|
||||||
nature?: Nature;
|
nature?: Nature;
|
||||||
ivs?: [number, number, number, number, number, number];
|
ivs?: [number, number, number, number, number, number];
|
||||||
shiny?: boolean;
|
shiny?: boolean;
|
||||||
@ -460,7 +460,7 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig):
|
|||||||
* This promise does not need to be awaited on if called in an encounter onInit (will just load lazily)
|
* This promise does not need to be awaited on if called in an encounter onInit (will just load lazily)
|
||||||
* @param moves
|
* @param moves
|
||||||
*/
|
*/
|
||||||
export function loadCustomMovesForEncounter(moves: Moves | Moves[]) {
|
export function loadCustomMovesForEncounter(moves: MoveId | MoveId[]) {
|
||||||
moves = Array.isArray(moves) ? moves : [moves];
|
moves = Array.isArray(moves) ? moves : [moves];
|
||||||
return Promise.all(moves.map(move => initMoveAnim(move))).then(() => loadMoveAnimAssets(moves));
|
return Promise.all(moves.map(move => initMoveAnim(move))).then(() => loadMoveAnimAssets(moves));
|
||||||
}
|
}
|
||||||
@ -1088,16 +1088,16 @@ export function getRandomEncounterSpecies(level: number, isBoss = false, rerollH
|
|||||||
export function calculateMEAggregateStats(baseSpawnWeight: number) {
|
export function calculateMEAggregateStats(baseSpawnWeight: number) {
|
||||||
const numRuns = 1000;
|
const numRuns = 1000;
|
||||||
let run = 0;
|
let run = 0;
|
||||||
const biomes = Object.keys(Biome).filter(key => Number.isNaN(Number(key)));
|
const biomes = Object.keys(BiomeId).filter(key => Number.isNaN(Number(key)));
|
||||||
const alwaysPickTheseBiomes = [
|
const alwaysPickTheseBiomes = [
|
||||||
Biome.ISLAND,
|
BiomeId.ISLAND,
|
||||||
Biome.ABYSS,
|
BiomeId.ABYSS,
|
||||||
Biome.WASTELAND,
|
BiomeId.WASTELAND,
|
||||||
Biome.FAIRY_CAVE,
|
BiomeId.FAIRY_CAVE,
|
||||||
Biome.TEMPLE,
|
BiomeId.TEMPLE,
|
||||||
Biome.LABORATORY,
|
BiomeId.LABORATORY,
|
||||||
Biome.SPACE,
|
BiomeId.SPACE,
|
||||||
Biome.WASTELAND,
|
BiomeId.WASTELAND,
|
||||||
];
|
];
|
||||||
|
|
||||||
const calculateNumEncounters = (): any[] => {
|
const calculateNumEncounters = (): any[] => {
|
||||||
@ -1106,7 +1106,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) {
|
|||||||
let mostRecentEncounterWave = 0;
|
let mostRecentEncounterWave = 0;
|
||||||
const encountersByBiome = new Map<string, number>(biomes.map(b => [b, 0]));
|
const encountersByBiome = new Map<string, number>(biomes.map(b => [b, 0]));
|
||||||
const validMEfloorsByBiome = new Map<string, number>(biomes.map(b => [b, 0]));
|
const validMEfloorsByBiome = new Map<string, number>(biomes.map(b => [b, 0]));
|
||||||
let currentBiome = Biome.TOWN;
|
let currentBiome = BiomeId.TOWN;
|
||||||
let currentArena = globalScene.newArena(currentBiome);
|
let currentArena = globalScene.newArena(currentBiome);
|
||||||
globalScene.setSeed(randomString(24));
|
globalScene.setSeed(randomString(24));
|
||||||
globalScene.resetSeed();
|
globalScene.resetSeed();
|
||||||
@ -1119,9 +1119,9 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) {
|
|||||||
// New biome
|
// New biome
|
||||||
if (i % 10 === 1) {
|
if (i % 10 === 1) {
|
||||||
if (Array.isArray(biomeLinks[currentBiome])) {
|
if (Array.isArray(biomeLinks[currentBiome])) {
|
||||||
let biomes: Biome[];
|
let biomes: BiomeId[];
|
||||||
globalScene.executeWithSeedOffset(() => {
|
globalScene.executeWithSeedOffset(() => {
|
||||||
biomes = (biomeLinks[currentBiome] as (Biome | [Biome, number])[])
|
biomes = (biomeLinks[currentBiome] as (BiomeId | [BiomeId, number])[])
|
||||||
.filter(b => {
|
.filter(b => {
|
||||||
return !Array.isArray(b) || !randSeedInt(b[1]);
|
return !Array.isArray(b) || !randSeedInt(b[1]);
|
||||||
})
|
})
|
||||||
@ -1136,10 +1136,10 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (biomeLinks.hasOwnProperty(currentBiome)) {
|
} else if (biomeLinks.hasOwnProperty(currentBiome)) {
|
||||||
currentBiome = biomeLinks[currentBiome] as Biome;
|
currentBiome = biomeLinks[currentBiome] as BiomeId;
|
||||||
} else {
|
} else {
|
||||||
if (!(i % 50)) {
|
if (!(i % 50)) {
|
||||||
currentBiome = Biome.END;
|
currentBiome = BiomeId.END;
|
||||||
} else {
|
} else {
|
||||||
currentBiome = globalScene.generateRandomBiome(i);
|
currentBiome = globalScene.generateRandomBiome(i);
|
||||||
}
|
}
|
||||||
@ -1161,7 +1161,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) {
|
|||||||
// Otherwise, roll encounter
|
// Otherwise, roll encounter
|
||||||
|
|
||||||
const roll = randSeedInt(256);
|
const roll = randSeedInt(256);
|
||||||
validMEfloorsByBiome.set(Biome[currentBiome], (validMEfloorsByBiome.get(Biome[currentBiome]) ?? 0) + 1);
|
validMEfloorsByBiome.set(BiomeId[currentBiome], (validMEfloorsByBiome.get(BiomeId[currentBiome]) ?? 0) + 1);
|
||||||
|
|
||||||
// If total number of encounters is lower than expected for the run, slightly favor a new encounter
|
// If total number of encounters is lower than expected for the run, slightly favor a new encounter
|
||||||
// Do the reverse as well
|
// Do the reverse as well
|
||||||
@ -1197,7 +1197,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) {
|
|||||||
: tierValue > rareThreshold
|
: tierValue > rareThreshold
|
||||||
? ++numEncounters[2]
|
? ++numEncounters[2]
|
||||||
: ++numEncounters[3];
|
: ++numEncounters[3];
|
||||||
encountersByBiome.set(Biome[currentBiome], (encountersByBiome.get(Biome[currentBiome]) ?? 0) + 1);
|
encountersByBiome.set(BiomeId[currentBiome], (encountersByBiome.get(BiomeId[currentBiome]) ?? 0) + 1);
|
||||||
} else {
|
} else {
|
||||||
encounterRate += WEIGHT_INCREMENT_ON_SPAWN_MISS;
|
encounterRate += WEIGHT_INCREMENT_ON_SPAWN_MISS;
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ import { achvs } from "#app/system/achv";
|
|||||||
import { UiMode } from "#enums/ui-mode";
|
import { UiMode } from "#enums/ui-mode";
|
||||||
import type { PartyOption } from "#app/ui/party-ui-handler";
|
import type { PartyOption } from "#app/ui/party-ui-handler";
|
||||||
import { PartyUiMode } from "#app/ui/party-ui-handler";
|
import { PartyUiMode } from "#app/ui/party-ui-handler";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import type { PokemonType } from "#enums/pokemon-type";
|
import type { PokemonType } from "#enums/pokemon-type";
|
||||||
import type PokemonSpecies from "#app/data/pokemon-species";
|
import type PokemonSpecies from "#app/data/pokemon-species";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
@ -35,7 +35,7 @@ import type { PermanentStat } from "#enums/stat";
|
|||||||
import { VictoryPhase } from "#app/phases/victory-phase";
|
import { VictoryPhase } from "#app/phases/victory-phase";
|
||||||
import { SummaryUiMode } from "#app/ui/summary-ui-handler";
|
import { SummaryUiMode } from "#app/ui/summary-ui-handler";
|
||||||
import { CustomPokemonData } from "#app/data/custom-pokemon-data";
|
import { CustomPokemonData } from "#app/data/custom-pokemon-data";
|
||||||
import type { Abilities } from "#enums/abilities";
|
import type { AbilityId } from "#enums/ability-id";
|
||||||
import type { PokeballType } from "#enums/pokeball";
|
import type { PokeballType } from "#enums/pokeball";
|
||||||
import { StatusEffect } from "#enums/status-effect";
|
import { StatusEffect } from "#enums/status-effect";
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ export const STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER = 1;
|
|||||||
* @param variant
|
* @param variant
|
||||||
*/
|
*/
|
||||||
export function getSpriteKeysFromSpecies(
|
export function getSpriteKeysFromSpecies(
|
||||||
species: Species,
|
species: SpeciesId,
|
||||||
female?: boolean,
|
female?: boolean,
|
||||||
formIndex?: number,
|
formIndex?: number,
|
||||||
shiny?: boolean,
|
shiny?: boolean,
|
||||||
@ -247,17 +247,17 @@ export function getHighestStatTotalPlayerPokemon(isAllowed = false, isFainted =
|
|||||||
*/
|
*/
|
||||||
export function getRandomSpeciesByStarterCost(
|
export function getRandomSpeciesByStarterCost(
|
||||||
starterTiers: number | [number, number],
|
starterTiers: number | [number, number],
|
||||||
excludedSpecies?: Species[],
|
excludedSpecies?: SpeciesId[],
|
||||||
types?: PokemonType[],
|
types?: PokemonType[],
|
||||||
allowSubLegendary = true,
|
allowSubLegendary = true,
|
||||||
allowLegendary = true,
|
allowLegendary = true,
|
||||||
allowMythical = true,
|
allowMythical = true,
|
||||||
): Species {
|
): SpeciesId {
|
||||||
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(speciesStarterCosts)
|
let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarterCosts)
|
||||||
.map(s => [Number.parseInt(s) as Species, speciesStarterCosts[s] as number])
|
.map(s => [Number.parseInt(s) as SpeciesId, speciesStarterCosts[s] as number])
|
||||||
.filter(s => {
|
.filter(s => {
|
||||||
const pokemonSpecies = getPokemonSpecies(s[0]);
|
const pokemonSpecies = getPokemonSpecies(s[0]);
|
||||||
return (
|
return (
|
||||||
@ -294,7 +294,7 @@ export function getRandomSpeciesByStarterCost(
|
|||||||
return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index][0].speciesId;
|
return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index][0].speciesId;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Species.BULBASAUR;
|
return SpeciesId.BULBASAUR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -903,34 +903,34 @@ export function doPlayerFlee(pokemon: EnemyPokemon): Promise<void> {
|
|||||||
/**
|
/**
|
||||||
* Bug Species and their corresponding weights
|
* Bug Species and their corresponding weights
|
||||||
*/
|
*/
|
||||||
const GOLDEN_BUG_NET_SPECIES_POOL: [Species, number][] = [
|
const GOLDEN_BUG_NET_SPECIES_POOL: [SpeciesId, number][] = [
|
||||||
[Species.SCYTHER, 40],
|
[SpeciesId.SCYTHER, 40],
|
||||||
[Species.SCIZOR, 40],
|
[SpeciesId.SCIZOR, 40],
|
||||||
[Species.KLEAVOR, 40],
|
[SpeciesId.KLEAVOR, 40],
|
||||||
[Species.PINSIR, 40],
|
[SpeciesId.PINSIR, 40],
|
||||||
[Species.HERACROSS, 40],
|
[SpeciesId.HERACROSS, 40],
|
||||||
[Species.YANMA, 40],
|
[SpeciesId.YANMA, 40],
|
||||||
[Species.YANMEGA, 40],
|
[SpeciesId.YANMEGA, 40],
|
||||||
[Species.SHUCKLE, 40],
|
[SpeciesId.SHUCKLE, 40],
|
||||||
[Species.ANORITH, 40],
|
[SpeciesId.ANORITH, 40],
|
||||||
[Species.ARMALDO, 40],
|
[SpeciesId.ARMALDO, 40],
|
||||||
[Species.ESCAVALIER, 40],
|
[SpeciesId.ESCAVALIER, 40],
|
||||||
[Species.ACCELGOR, 40],
|
[SpeciesId.ACCELGOR, 40],
|
||||||
[Species.JOLTIK, 40],
|
[SpeciesId.JOLTIK, 40],
|
||||||
[Species.GALVANTULA, 40],
|
[SpeciesId.GALVANTULA, 40],
|
||||||
[Species.DURANT, 40],
|
[SpeciesId.DURANT, 40],
|
||||||
[Species.LARVESTA, 40],
|
[SpeciesId.LARVESTA, 40],
|
||||||
[Species.VOLCARONA, 40],
|
[SpeciesId.VOLCARONA, 40],
|
||||||
[Species.DEWPIDER, 40],
|
[SpeciesId.DEWPIDER, 40],
|
||||||
[Species.ARAQUANID, 40],
|
[SpeciesId.ARAQUANID, 40],
|
||||||
[Species.WIMPOD, 40],
|
[SpeciesId.WIMPOD, 40],
|
||||||
[Species.GOLISOPOD, 40],
|
[SpeciesId.GOLISOPOD, 40],
|
||||||
[Species.SIZZLIPEDE, 40],
|
[SpeciesId.SIZZLIPEDE, 40],
|
||||||
[Species.CENTISKORCH, 40],
|
[SpeciesId.CENTISKORCH, 40],
|
||||||
[Species.NYMBLE, 40],
|
[SpeciesId.NYMBLE, 40],
|
||||||
[Species.LOKIX, 40],
|
[SpeciesId.LOKIX, 40],
|
||||||
[Species.BUZZWOLE, 1],
|
[SpeciesId.BUZZWOLE, 1],
|
||||||
[Species.PHEROMOSA, 1],
|
[SpeciesId.PHEROMOSA, 1],
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -951,7 +951,7 @@ export function getGoldenBugNetSpecies(level: number): PokemonSpecies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Defaults to Scyther
|
// Defaults to Scyther
|
||||||
return getPokemonSpecies(Species.SCYTHER);
|
return getPokemonSpecies(SpeciesId.SCYTHER);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1024,7 +1024,7 @@ export function isPokemonValidForEncounterOptionSelection(
|
|||||||
* Permanently overrides the ability (not passive) of a pokemon.
|
* Permanently overrides the ability (not passive) of a pokemon.
|
||||||
* If the pokemon is a fusion, instead overrides the fused pokemon's ability.
|
* If the pokemon is a fusion, instead overrides the fused pokemon's ability.
|
||||||
*/
|
*/
|
||||||
export function applyAbilityOverrideToPokemon(pokemon: Pokemon, ability: Abilities) {
|
export function applyAbilityOverrideToPokemon(pokemon: Pokemon, ability: AbilityId) {
|
||||||
if (pokemon.isFusion()) {
|
if (pokemon.isFusion()) {
|
||||||
if (!pokemon.fusionCustomPokemonData) {
|
if (!pokemon.fusionCustomPokemonData) {
|
||||||
pokemon.fusionCustomPokemonData = new CustomPokemonData();
|
pokemon.fusionCustomPokemonData = new CustomPokemonData();
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,438 +1,443 @@
|
|||||||
import type { TrainerTierPools } from "#app/data/trainers/typedefs";
|
import type { TrainerTierPools } from "#app/data/trainers/typedefs";
|
||||||
import { TrainerPoolTier } from "#enums/trainer-pool-tier";
|
import { TrainerPoolTier } from "#enums/trainer-pool-tier";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
/** Team Rocket's admin trainer pool. */
|
/** Team Rocket's admin trainer pool. */
|
||||||
const ROCKET: TrainerTierPools = {
|
const ROCKET: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.RATTATA,
|
SpeciesId.RATTATA,
|
||||||
Species.SPEAROW,
|
SpeciesId.SPEAROW,
|
||||||
Species.EKANS,
|
SpeciesId.EKANS,
|
||||||
Species.VILEPLUME,
|
SpeciesId.VILEPLUME,
|
||||||
Species.DIGLETT,
|
SpeciesId.DIGLETT,
|
||||||
Species.GROWLITHE,
|
SpeciesId.GROWLITHE,
|
||||||
Species.GRIMER,
|
SpeciesId.GRIMER,
|
||||||
Species.DROWZEE,
|
SpeciesId.DROWZEE,
|
||||||
Species.VOLTORB,
|
SpeciesId.VOLTORB,
|
||||||
Species.EXEGGCUTE,
|
SpeciesId.EXEGGCUTE,
|
||||||
Species.CUBONE,
|
SpeciesId.CUBONE,
|
||||||
Species.KOFFING,
|
SpeciesId.KOFFING,
|
||||||
Species.MAGIKARP,
|
SpeciesId.MAGIKARP,
|
||||||
Species.ZUBAT,
|
SpeciesId.ZUBAT,
|
||||||
Species.ONIX,
|
SpeciesId.ONIX,
|
||||||
Species.HOUNDOUR,
|
SpeciesId.HOUNDOUR,
|
||||||
Species.MURKROW,
|
SpeciesId.MURKROW,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.ABRA,
|
SpeciesId.ABRA,
|
||||||
Species.GASTLY,
|
SpeciesId.GASTLY,
|
||||||
Species.OMANYTE,
|
SpeciesId.OMANYTE,
|
||||||
Species.KABUTO,
|
SpeciesId.KABUTO,
|
||||||
Species.PORYGON,
|
SpeciesId.PORYGON,
|
||||||
Species.MANKEY,
|
SpeciesId.MANKEY,
|
||||||
Species.SCYTHER,
|
SpeciesId.SCYTHER,
|
||||||
Species.ELEKID,
|
SpeciesId.ELEKID,
|
||||||
Species.MAGBY,
|
SpeciesId.MAGBY,
|
||||||
Species.ALOLA_SANDSHREW,
|
SpeciesId.ALOLA_SANDSHREW,
|
||||||
Species.ALOLA_MEOWTH,
|
SpeciesId.ALOLA_MEOWTH,
|
||||||
Species.ALOLA_GEODUDE,
|
SpeciesId.ALOLA_GEODUDE,
|
||||||
Species.ALOLA_GRIMER,
|
SpeciesId.ALOLA_GRIMER,
|
||||||
Species.PALDEA_TAUROS,
|
SpeciesId.PALDEA_TAUROS,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.DRATINI, Species.LARVITAR],
|
[TrainerPoolTier.RARE]: [SpeciesId.DRATINI, SpeciesId.LARVITAR],
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Team Magma's admin trainer pool */
|
/** Team Magma's admin trainer pool */
|
||||||
const MAGMA: TrainerTierPools = {
|
const MAGMA: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.DIGLETT,
|
SpeciesId.DIGLETT,
|
||||||
Species.GROWLITHE,
|
SpeciesId.GROWLITHE,
|
||||||
Species.VULPIX,
|
SpeciesId.VULPIX,
|
||||||
Species.KOFFING,
|
SpeciesId.KOFFING,
|
||||||
Species.RHYHORN,
|
SpeciesId.RHYHORN,
|
||||||
Species.SLUGMA,
|
SpeciesId.SLUGMA,
|
||||||
Species.HOUNDOUR,
|
SpeciesId.HOUNDOUR,
|
||||||
Species.POOCHYENA,
|
SpeciesId.POOCHYENA,
|
||||||
Species.TORKOAL,
|
SpeciesId.TORKOAL,
|
||||||
Species.ZANGOOSE,
|
SpeciesId.ZANGOOSE,
|
||||||
Species.SOLROCK,
|
SpeciesId.SOLROCK,
|
||||||
Species.BALTOY,
|
SpeciesId.BALTOY,
|
||||||
Species.ROLYCOLY,
|
SpeciesId.ROLYCOLY,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.MAGBY,
|
SpeciesId.MAGBY,
|
||||||
Species.TRAPINCH,
|
SpeciesId.TRAPINCH,
|
||||||
Species.LILEEP,
|
SpeciesId.LILEEP,
|
||||||
Species.ANORITH,
|
SpeciesId.ANORITH,
|
||||||
Species.GOLETT,
|
SpeciesId.GOLETT,
|
||||||
Species.FLETCHLING,
|
SpeciesId.FLETCHLING,
|
||||||
Species.SALANDIT,
|
SpeciesId.SALANDIT,
|
||||||
Species.TURTONATOR,
|
SpeciesId.TURTONATOR,
|
||||||
Species.TOEDSCOOL,
|
SpeciesId.TOEDSCOOL,
|
||||||
Species.CAPSAKID,
|
SpeciesId.CAPSAKID,
|
||||||
Species.HISUI_GROWLITHE,
|
SpeciesId.HISUI_GROWLITHE,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.CHARCADET, Species.ARON],
|
[TrainerPoolTier.RARE]: [SpeciesId.CHARCADET, SpeciesId.ARON],
|
||||||
};
|
};
|
||||||
|
|
||||||
const AQUA: TrainerTierPools = {
|
const AQUA: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.TENTACOOL,
|
SpeciesId.TENTACOOL,
|
||||||
Species.GRIMER,
|
SpeciesId.GRIMER,
|
||||||
Species.AZURILL,
|
SpeciesId.AZURILL,
|
||||||
Species.CHINCHOU,
|
SpeciesId.CHINCHOU,
|
||||||
Species.REMORAID,
|
SpeciesId.REMORAID,
|
||||||
Species.POOCHYENA,
|
SpeciesId.POOCHYENA,
|
||||||
Species.LOTAD,
|
SpeciesId.LOTAD,
|
||||||
Species.WINGULL,
|
SpeciesId.WINGULL,
|
||||||
Species.WAILMER,
|
SpeciesId.WAILMER,
|
||||||
Species.SEVIPER,
|
SpeciesId.SEVIPER,
|
||||||
Species.BARBOACH,
|
SpeciesId.BARBOACH,
|
||||||
Species.CORPHISH,
|
SpeciesId.CORPHISH,
|
||||||
Species.SPHEAL,
|
SpeciesId.SPHEAL,
|
||||||
Species.CLAMPERL,
|
SpeciesId.CLAMPERL,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.MANTYKE,
|
SpeciesId.MANTYKE,
|
||||||
Species.HORSEA,
|
SpeciesId.HORSEA,
|
||||||
Species.FEEBAS,
|
SpeciesId.FEEBAS,
|
||||||
Species.TYMPOLE,
|
SpeciesId.TYMPOLE,
|
||||||
Species.SKRELP,
|
SpeciesId.SKRELP,
|
||||||
Species.WIMPOD,
|
SpeciesId.WIMPOD,
|
||||||
Species.DHELMISE,
|
SpeciesId.DHELMISE,
|
||||||
Species.ARROKUDA,
|
SpeciesId.ARROKUDA,
|
||||||
Species.CLOBBOPUS,
|
SpeciesId.CLOBBOPUS,
|
||||||
Species.HISUI_QWILFISH,
|
SpeciesId.HISUI_QWILFISH,
|
||||||
Species.WIGLETT,
|
SpeciesId.WIGLETT,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.BASCULEGION, Species.DONDOZO],
|
[TrainerPoolTier.RARE]: [SpeciesId.BASCULEGION, SpeciesId.DONDOZO],
|
||||||
};
|
};
|
||||||
|
|
||||||
const GALACTIC: TrainerTierPools = {
|
const GALACTIC: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.ZUBAT,
|
SpeciesId.ZUBAT,
|
||||||
Species.MAGNEMITE,
|
SpeciesId.MAGNEMITE,
|
||||||
Species.RHYHORN,
|
SpeciesId.RHYHORN,
|
||||||
Species.TANGELA,
|
SpeciesId.TANGELA,
|
||||||
Species.LICKITUNG,
|
SpeciesId.LICKITUNG,
|
||||||
Species.MAGIKARP,
|
SpeciesId.MAGIKARP,
|
||||||
Species.YANMA,
|
SpeciesId.YANMA,
|
||||||
Species.MURKROW,
|
SpeciesId.MURKROW,
|
||||||
Species.SWINUB,
|
SpeciesId.SWINUB,
|
||||||
Species.ELEKID,
|
SpeciesId.ELEKID,
|
||||||
Species.MAGBY,
|
SpeciesId.MAGBY,
|
||||||
Species.BRONZOR,
|
SpeciesId.BRONZOR,
|
||||||
Species.SKORUPI,
|
SpeciesId.SKORUPI,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.ABRA,
|
SpeciesId.ABRA,
|
||||||
Species.GLIGAR,
|
SpeciesId.GLIGAR,
|
||||||
Species.SNEASEL,
|
SpeciesId.SNEASEL,
|
||||||
Species.DUSKULL,
|
SpeciesId.DUSKULL,
|
||||||
Species.DRIFLOON,
|
SpeciesId.DRIFLOON,
|
||||||
Species.CRANIDOS,
|
SpeciesId.CRANIDOS,
|
||||||
Species.SHIELDON,
|
SpeciesId.SHIELDON,
|
||||||
Species.ROTOM,
|
SpeciesId.ROTOM,
|
||||||
Species.HISUI_QWILFISH,
|
SpeciesId.HISUI_QWILFISH,
|
||||||
|
],
|
||||||
|
[TrainerPoolTier.RARE]: [
|
||||||
|
SpeciesId.SPIRITOMB,
|
||||||
|
SpeciesId.TEDDIURSA,
|
||||||
|
SpeciesId.HISUI_SNEASEL,
|
||||||
|
SpeciesId.HISUI_LILLIGANT,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.SPIRITOMB, Species.TEDDIURSA, Species.HISUI_SNEASEL, Species.HISUI_LILLIGANT],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const PLASMA_ZINZOLIN: TrainerTierPools = {
|
const PLASMA_ZINZOLIN: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.SNEASEL,
|
SpeciesId.SNEASEL,
|
||||||
Species.SWINUB,
|
SpeciesId.SWINUB,
|
||||||
Species.SNORUNT,
|
SpeciesId.SNORUNT,
|
||||||
Species.SNOVER,
|
SpeciesId.SNOVER,
|
||||||
Species.TIMBURR,
|
SpeciesId.TIMBURR,
|
||||||
Species.TYMPOLE,
|
SpeciesId.TYMPOLE,
|
||||||
Species.SANDILE,
|
SpeciesId.SANDILE,
|
||||||
Species.DARUMAKA,
|
SpeciesId.DARUMAKA,
|
||||||
Species.VANILLITE,
|
SpeciesId.VANILLITE,
|
||||||
Species.FOONGUS,
|
SpeciesId.FOONGUS,
|
||||||
Species.FRILLISH,
|
SpeciesId.FRILLISH,
|
||||||
Species.JOLTIK,
|
SpeciesId.JOLTIK,
|
||||||
Species.FERROSEED,
|
SpeciesId.FERROSEED,
|
||||||
Species.CUBCHOO,
|
SpeciesId.CUBCHOO,
|
||||||
Species.GALAR_DARUMAKA,
|
SpeciesId.GALAR_DARUMAKA,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.SPHEAL,
|
SpeciesId.SPHEAL,
|
||||||
Species.DRILBUR,
|
SpeciesId.DRILBUR,
|
||||||
Species.SIGILYPH,
|
SpeciesId.SIGILYPH,
|
||||||
Species.YAMASK,
|
SpeciesId.YAMASK,
|
||||||
Species.ZORUA,
|
SpeciesId.ZORUA,
|
||||||
Species.TYNAMO,
|
SpeciesId.TYNAMO,
|
||||||
Species.MIENFOO,
|
SpeciesId.MIENFOO,
|
||||||
Species.GOLETT,
|
SpeciesId.GOLETT,
|
||||||
Species.PAWNIARD,
|
SpeciesId.PAWNIARD,
|
||||||
Species.VULLABY,
|
SpeciesId.VULLABY,
|
||||||
Species.DURANT,
|
SpeciesId.DURANT,
|
||||||
Species.BERGMITE,
|
SpeciesId.BERGMITE,
|
||||||
Species.EISCUE,
|
SpeciesId.EISCUE,
|
||||||
Species.ALOLA_SANDSHREW,
|
SpeciesId.ALOLA_SANDSHREW,
|
||||||
Species.HISUI_ZORUA,
|
SpeciesId.HISUI_ZORUA,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.DEINO, Species.FRIGIBAX, Species.HISUI_BRAVIARY],
|
[TrainerPoolTier.RARE]: [SpeciesId.DEINO, SpeciesId.FRIGIBAX, SpeciesId.HISUI_BRAVIARY],
|
||||||
};
|
};
|
||||||
|
|
||||||
const PLASMA_COLRESS: TrainerTierPools = {
|
const PLASMA_COLRESS: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.MAGNEMITE,
|
SpeciesId.MAGNEMITE,
|
||||||
Species.GRIMER,
|
SpeciesId.GRIMER,
|
||||||
Species.VOLTORB,
|
SpeciesId.VOLTORB,
|
||||||
Species.PORYGON,
|
SpeciesId.PORYGON,
|
||||||
Species.BRONZOR,
|
SpeciesId.BRONZOR,
|
||||||
Species.ROTOM,
|
SpeciesId.ROTOM,
|
||||||
Species.MUNNA,
|
SpeciesId.MUNNA,
|
||||||
Species.DWEBBLE,
|
SpeciesId.DWEBBLE,
|
||||||
Species.FERROSEED,
|
SpeciesId.FERROSEED,
|
||||||
Species.ELGYEM,
|
SpeciesId.ELGYEM,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.BELDUM,
|
SpeciesId.BELDUM,
|
||||||
Species.SIGILYPH,
|
SpeciesId.SIGILYPH,
|
||||||
Species.TIRTOUGA,
|
SpeciesId.TIRTOUGA,
|
||||||
Species.ARCHEN,
|
SpeciesId.ARCHEN,
|
||||||
Species.TYNAMO,
|
SpeciesId.TYNAMO,
|
||||||
Species.GOLETT,
|
SpeciesId.GOLETT,
|
||||||
Species.BLIPBUG,
|
SpeciesId.BLIPBUG,
|
||||||
Species.VAROOM,
|
SpeciesId.VAROOM,
|
||||||
Species.ALOLA_GRIMER,
|
SpeciesId.ALOLA_GRIMER,
|
||||||
Species.HISUI_VOLTORB,
|
SpeciesId.HISUI_VOLTORB,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.ELEKID, Species.MAGBY, Species.PAWNIARD, Species.DURALUDON],
|
[TrainerPoolTier.RARE]: [SpeciesId.ELEKID, SpeciesId.MAGBY, SpeciesId.PAWNIARD, SpeciesId.DURALUDON],
|
||||||
};
|
};
|
||||||
|
|
||||||
const FLARE: TrainerTierPools = {
|
const FLARE: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.ELECTRIKE,
|
SpeciesId.ELECTRIKE,
|
||||||
Species.SKORUPI,
|
SpeciesId.SKORUPI,
|
||||||
Species.PURRLOIN,
|
SpeciesId.PURRLOIN,
|
||||||
Species.FOONGUS,
|
SpeciesId.FOONGUS,
|
||||||
Species.BUNNELBY,
|
SpeciesId.BUNNELBY,
|
||||||
Species.FLETCHLING,
|
SpeciesId.FLETCHLING,
|
||||||
Species.LITLEO,
|
SpeciesId.LITLEO,
|
||||||
Species.PANGORO,
|
SpeciesId.PANGORO,
|
||||||
Species.ESPURR,
|
SpeciesId.ESPURR,
|
||||||
Species.INKAY,
|
SpeciesId.INKAY,
|
||||||
Species.CLAUNCHER,
|
SpeciesId.CLAUNCHER,
|
||||||
Species.HELIOPTILE,
|
SpeciesId.HELIOPTILE,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.HOUNDOUR,
|
SpeciesId.HOUNDOUR,
|
||||||
Species.SNEASEL,
|
SpeciesId.SNEASEL,
|
||||||
Species.LITWICK,
|
SpeciesId.LITWICK,
|
||||||
Species.HONEDGE,
|
SpeciesId.HONEDGE,
|
||||||
Species.BINACLE,
|
SpeciesId.BINACLE,
|
||||||
Species.SKRELP,
|
SpeciesId.SKRELP,
|
||||||
Species.NOIBAT,
|
SpeciesId.NOIBAT,
|
||||||
Species.PHANTUMP,
|
SpeciesId.PHANTUMP,
|
||||||
Species.PUMPKABOO,
|
SpeciesId.PUMPKABOO,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.GOOMY, Species.HISUI_AVALUGG],
|
[TrainerPoolTier.RARE]: [SpeciesId.GOOMY, SpeciesId.HISUI_AVALUGG],
|
||||||
};
|
};
|
||||||
|
|
||||||
const AETHER: TrainerTierPools = {
|
const AETHER: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.ABRA,
|
SpeciesId.ABRA,
|
||||||
Species.SLOWPOKE,
|
SpeciesId.SLOWPOKE,
|
||||||
Species.MAGNEMITE,
|
SpeciesId.MAGNEMITE,
|
||||||
Species.EXEGGUTOR,
|
SpeciesId.EXEGGUTOR,
|
||||||
Species.NATU,
|
SpeciesId.NATU,
|
||||||
Species.BALTOY,
|
SpeciesId.BALTOY,
|
||||||
Species.MIME_JR,
|
SpeciesId.MIME_JR,
|
||||||
Species.ELGYEM,
|
SpeciesId.ELGYEM,
|
||||||
Species.INKAY,
|
SpeciesId.INKAY,
|
||||||
Species.BRUXISH,
|
SpeciesId.BRUXISH,
|
||||||
Species.BLIPBUG,
|
SpeciesId.BLIPBUG,
|
||||||
Species.ALOLA_RAICHU,
|
SpeciesId.ALOLA_RAICHU,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.RALTS,
|
SpeciesId.RALTS,
|
||||||
Species.MEDITITE,
|
SpeciesId.MEDITITE,
|
||||||
Species.BELDUM,
|
SpeciesId.BELDUM,
|
||||||
Species.SOLOSIS,
|
SpeciesId.SOLOSIS,
|
||||||
Species.HATENNA,
|
SpeciesId.HATENNA,
|
||||||
Species.STANTLER,
|
SpeciesId.STANTLER,
|
||||||
Species.GIRAFARIG,
|
SpeciesId.GIRAFARIG,
|
||||||
Species.ALOLA_GRIMER,
|
SpeciesId.ALOLA_GRIMER,
|
||||||
Species.GALAR_SLOWPOKE,
|
SpeciesId.GALAR_SLOWPOKE,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.PORYGON, Species.ARMAROUGE],
|
[TrainerPoolTier.RARE]: [SpeciesId.PORYGON, SpeciesId.ARMAROUGE],
|
||||||
};
|
};
|
||||||
|
|
||||||
const SKULL: TrainerTierPools = {
|
const SKULL: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.GASTLY,
|
SpeciesId.GASTLY,
|
||||||
Species.KOFFING,
|
SpeciesId.KOFFING,
|
||||||
Species.ZUBAT,
|
SpeciesId.ZUBAT,
|
||||||
Species.VENONAT,
|
SpeciesId.VENONAT,
|
||||||
Species.STUNKY,
|
SpeciesId.STUNKY,
|
||||||
Species.CROAGUNK,
|
SpeciesId.CROAGUNK,
|
||||||
Species.VENIPEDE,
|
SpeciesId.VENIPEDE,
|
||||||
Species.SCRAGGY,
|
SpeciesId.SCRAGGY,
|
||||||
Species.MAREANIE,
|
SpeciesId.MAREANIE,
|
||||||
Species.FOMANTIS,
|
SpeciesId.FOMANTIS,
|
||||||
Species.ALOLA_GRIMER,
|
SpeciesId.ALOLA_GRIMER,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.NIDORAN_F,
|
SpeciesId.NIDORAN_F,
|
||||||
Species.SKORUPI,
|
SpeciesId.SKORUPI,
|
||||||
Species.PAWNIARD,
|
SpeciesId.PAWNIARD,
|
||||||
Species.VULLABY,
|
SpeciesId.VULLABY,
|
||||||
Species.TOXEL,
|
SpeciesId.TOXEL,
|
||||||
Species.GLIMMET,
|
SpeciesId.GLIMMET,
|
||||||
Species.PALDEA_WOOPER,
|
SpeciesId.PALDEA_WOOPER,
|
||||||
Species.GALAR_SLOWPOKE,
|
SpeciesId.GALAR_SLOWPOKE,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.SKRELP, Species.HISUI_SNEASEL],
|
[TrainerPoolTier.RARE]: [SpeciesId.SKRELP, SpeciesId.HISUI_SNEASEL],
|
||||||
};
|
};
|
||||||
|
|
||||||
const MACRO_COSMOS: TrainerTierPools = {
|
const MACRO_COSMOS: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.VULPIX,
|
SpeciesId.VULPIX,
|
||||||
Species.FEEBAS,
|
SpeciesId.FEEBAS,
|
||||||
Species.MAWILE,
|
SpeciesId.MAWILE,
|
||||||
Species.FROSLASS,
|
SpeciesId.FROSLASS,
|
||||||
Species.GOTHITA,
|
SpeciesId.GOTHITA,
|
||||||
Species.FLABEBE,
|
SpeciesId.FLABEBE,
|
||||||
Species.SALANDIT,
|
SpeciesId.SALANDIT,
|
||||||
Species.TSAREENA,
|
SpeciesId.TSAREENA,
|
||||||
Species.SINISTEA,
|
SpeciesId.SINISTEA,
|
||||||
Species.HATENNA,
|
SpeciesId.HATENNA,
|
||||||
Species.INDEEDEE,
|
SpeciesId.INDEEDEE,
|
||||||
Species.GALAR_PONYTA,
|
SpeciesId.GALAR_PONYTA,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.TOGEPI,
|
SpeciesId.TOGEPI,
|
||||||
Species.VULLABY,
|
SpeciesId.VULLABY,
|
||||||
Species.MAREANIE,
|
SpeciesId.MAREANIE,
|
||||||
Species.CUFANT,
|
SpeciesId.CUFANT,
|
||||||
Species.TINKATINK,
|
SpeciesId.TINKATINK,
|
||||||
Species.ALOLA_VULPIX,
|
SpeciesId.ALOLA_VULPIX,
|
||||||
Species.GALAR_CORSOLA,
|
SpeciesId.GALAR_CORSOLA,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.APPLIN, Species.HISUI_LILLIGANT],
|
[TrainerPoolTier.RARE]: [SpeciesId.APPLIN, SpeciesId.HISUI_LILLIGANT],
|
||||||
};
|
};
|
||||||
|
|
||||||
const STAR_DARK: TrainerTierPools = {
|
const STAR_DARK: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.MURKROW,
|
SpeciesId.MURKROW,
|
||||||
Species.SEEDOT,
|
SpeciesId.SEEDOT,
|
||||||
Species.SABLEYE,
|
SpeciesId.SABLEYE,
|
||||||
Species.CACNEA,
|
SpeciesId.CACNEA,
|
||||||
Species.STUNKY,
|
SpeciesId.STUNKY,
|
||||||
Species.SANDILE,
|
SpeciesId.SANDILE,
|
||||||
Species.INKAY,
|
SpeciesId.INKAY,
|
||||||
Species.NYMBLE,
|
SpeciesId.NYMBLE,
|
||||||
Species.MASCHIFF,
|
SpeciesId.MASCHIFF,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.UMBREON,
|
SpeciesId.UMBREON,
|
||||||
Species.CORPHISH,
|
SpeciesId.CORPHISH,
|
||||||
Species.SNEASEL,
|
SpeciesId.SNEASEL,
|
||||||
Species.ZORUA,
|
SpeciesId.ZORUA,
|
||||||
Species.IMPIDIMP,
|
SpeciesId.IMPIDIMP,
|
||||||
Species.BOMBIRDIER,
|
SpeciesId.BOMBIRDIER,
|
||||||
Species.GALAR_ZIGZAGOON,
|
SpeciesId.GALAR_ZIGZAGOON,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.DEINO, Species.SPRIGATITO],
|
[TrainerPoolTier.RARE]: [SpeciesId.DEINO, SpeciesId.SPRIGATITO],
|
||||||
};
|
};
|
||||||
|
|
||||||
const STAR_FIRE: TrainerTierPools = {
|
const STAR_FIRE: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.GROWLITHE,
|
SpeciesId.GROWLITHE,
|
||||||
Species.HOUNDOUR,
|
SpeciesId.HOUNDOUR,
|
||||||
Species.NUMEL,
|
SpeciesId.NUMEL,
|
||||||
Species.TORKOAL,
|
SpeciesId.TORKOAL,
|
||||||
Species.FLETCHLING,
|
SpeciesId.FLETCHLING,
|
||||||
Species.LITLEO,
|
SpeciesId.LITLEO,
|
||||||
Species.SIZZLIPEDE,
|
SpeciesId.SIZZLIPEDE,
|
||||||
Species.ROLYCOLY,
|
SpeciesId.ROLYCOLY,
|
||||||
Species.CAPSAKID,
|
SpeciesId.CAPSAKID,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.PONYTA,
|
SpeciesId.PONYTA,
|
||||||
Species.FLAREON,
|
SpeciesId.FLAREON,
|
||||||
Species.MAGBY,
|
SpeciesId.MAGBY,
|
||||||
Species.DARUMAKA,
|
SpeciesId.DARUMAKA,
|
||||||
Species.LITWICK,
|
SpeciesId.LITWICK,
|
||||||
Species.SALANDIT,
|
SpeciesId.SALANDIT,
|
||||||
Species.TURTONATOR,
|
SpeciesId.TURTONATOR,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.LARVESTA, Species.FUECOCO],
|
[TrainerPoolTier.RARE]: [SpeciesId.LARVESTA, SpeciesId.FUECOCO],
|
||||||
};
|
};
|
||||||
|
|
||||||
const STAR_POISON: TrainerTierPools = {
|
const STAR_POISON: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.GRIMER,
|
SpeciesId.GRIMER,
|
||||||
Species.VENONAT,
|
SpeciesId.VENONAT,
|
||||||
Species.SEVIPER,
|
SpeciesId.SEVIPER,
|
||||||
Species.STUNKY,
|
SpeciesId.STUNKY,
|
||||||
Species.FOONGUS,
|
SpeciesId.FOONGUS,
|
||||||
Species.MAREANIE,
|
SpeciesId.MAREANIE,
|
||||||
Species.TOXEL,
|
SpeciesId.TOXEL,
|
||||||
Species.GRAFAIAI,
|
SpeciesId.GRAFAIAI,
|
||||||
Species.PALDEA_WOOPER,
|
SpeciesId.PALDEA_WOOPER,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.ZUBAT,
|
SpeciesId.ZUBAT,
|
||||||
Species.GASTLY,
|
SpeciesId.GASTLY,
|
||||||
Species.SKRELP,
|
SpeciesId.SKRELP,
|
||||||
Species.OVERQWIL,
|
SpeciesId.OVERQWIL,
|
||||||
Species.ALOLA_GRIMER,
|
SpeciesId.ALOLA_GRIMER,
|
||||||
Species.GALAR_SLOWPOKE,
|
SpeciesId.GALAR_SLOWPOKE,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.GLIMMET, Species.BULBASAUR],
|
[TrainerPoolTier.RARE]: [SpeciesId.GLIMMET, SpeciesId.BULBASAUR],
|
||||||
};
|
};
|
||||||
|
|
||||||
const STAR_FAIRY: TrainerTierPools = {
|
const STAR_FAIRY: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.IGGLYBUFF,
|
SpeciesId.IGGLYBUFF,
|
||||||
Species.AZURILL,
|
SpeciesId.AZURILL,
|
||||||
Species.COTTONEE,
|
SpeciesId.COTTONEE,
|
||||||
Species.FLABEBE,
|
SpeciesId.FLABEBE,
|
||||||
Species.KLEFKI,
|
SpeciesId.KLEFKI,
|
||||||
Species.CUTIEFLY,
|
SpeciesId.CUTIEFLY,
|
||||||
Species.HATENNA,
|
SpeciesId.HATENNA,
|
||||||
Species.TINKATINK,
|
SpeciesId.TINKATINK,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.CLEFFA,
|
SpeciesId.CLEFFA,
|
||||||
Species.TOGEPI,
|
SpeciesId.TOGEPI,
|
||||||
Species.GARDEVOIR,
|
SpeciesId.GARDEVOIR,
|
||||||
Species.SYLVEON,
|
SpeciesId.SYLVEON,
|
||||||
Species.MIMIKYU,
|
SpeciesId.MIMIKYU,
|
||||||
Species.IMPIDIMP,
|
SpeciesId.IMPIDIMP,
|
||||||
Species.ALOLA_VULPIX,
|
SpeciesId.ALOLA_VULPIX,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.GALAR_PONYTA, Species.POPPLIO],
|
[TrainerPoolTier.RARE]: [SpeciesId.GALAR_PONYTA, SpeciesId.POPPLIO],
|
||||||
};
|
};
|
||||||
|
|
||||||
const STAR_FIGHTING: TrainerTierPools = {
|
const STAR_FIGHTING: TrainerTierPools = {
|
||||||
[TrainerPoolTier.COMMON]: [
|
[TrainerPoolTier.COMMON]: [
|
||||||
Species.TYROGUE,
|
SpeciesId.TYROGUE,
|
||||||
Species.SHROOMISH,
|
SpeciesId.SHROOMISH,
|
||||||
Species.MAKUHITA,
|
SpeciesId.MAKUHITA,
|
||||||
Species.RIOLU,
|
SpeciesId.RIOLU,
|
||||||
Species.CROAGUNK,
|
SpeciesId.CROAGUNK,
|
||||||
Species.SCRAGGY,
|
SpeciesId.SCRAGGY,
|
||||||
Species.MIENFOO,
|
SpeciesId.MIENFOO,
|
||||||
Species.PASSIMIAN,
|
SpeciesId.PASSIMIAN,
|
||||||
Species.PAWMI,
|
SpeciesId.PAWMI,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.UNCOMMON]: [
|
[TrainerPoolTier.UNCOMMON]: [
|
||||||
Species.MEDITITE,
|
SpeciesId.MEDITITE,
|
||||||
Species.GALLADE,
|
SpeciesId.GALLADE,
|
||||||
Species.TIMBURR,
|
SpeciesId.TIMBURR,
|
||||||
Species.HAWLUCHA,
|
SpeciesId.HAWLUCHA,
|
||||||
Species.STUFFUL,
|
SpeciesId.STUFFUL,
|
||||||
Species.FALINKS,
|
SpeciesId.FALINKS,
|
||||||
Species.FLAMIGO,
|
SpeciesId.FLAMIGO,
|
||||||
Species.PALDEA_TAUROS,
|
SpeciesId.PALDEA_TAUROS,
|
||||||
],
|
],
|
||||||
[TrainerPoolTier.RARE]: [Species.JANGMO_O, Species.QUAXLY],
|
[TrainerPoolTier.RARE]: [SpeciesId.JANGMO_O, SpeciesId.QUAXLY],
|
||||||
};
|
};
|
||||||
|
|
||||||
export type EvilTeam =
|
export type EvilTeam =
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
import type { EnemyPokemon } from "#app/field/pokemon";
|
import type { EnemyPokemon } from "#app/field/pokemon";
|
||||||
import type { PersistentModifier } from "#app/modifier/modifier";
|
import type { PersistentModifier } from "#app/modifier/modifier";
|
||||||
import type { PartyMemberStrength } from "#enums/party-member-strength";
|
import type { PartyMemberStrength } from "#enums/party-member-strength";
|
||||||
import type { Species } from "#enums/species";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
import type { TrainerConfig } from "./trainer-config";
|
import type { TrainerConfig } from "./trainer-config";
|
||||||
import type { TrainerPartyTemplate } from "./TrainerPartyTemplate";
|
import type { TrainerPartyTemplate } from "./TrainerPartyTemplate";
|
||||||
|
|
||||||
@ -11,7 +11,7 @@ export type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[];
|
|||||||
export type GenAIFunc = (party: EnemyPokemon[]) => void;
|
export type GenAIFunc = (party: EnemyPokemon[]) => void;
|
||||||
|
|
||||||
export interface TrainerTierPools {
|
export interface TrainerTierPools {
|
||||||
[key: number]: Species[];
|
[key: number]: SpeciesId[];
|
||||||
}
|
}
|
||||||
export interface TrainerConfigs {
|
export interface TrainerConfigs {
|
||||||
[key: number]: TrainerConfig;
|
[key: number]: TrainerConfig;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { WeatherType } from "#enums/weather-type";
|
import { WeatherType } from "#enums/weather-type";
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
import type Pokemon from "../field/pokemon";
|
import type Pokemon from "../field/pokemon";
|
||||||
@ -289,13 +289,13 @@ export function getRandomWeatherType(arena: Arena): WeatherType {
|
|||||||
let weatherPool: WeatherPoolEntry[] = [];
|
let weatherPool: WeatherPoolEntry[] = [];
|
||||||
const hasSun = arena.getTimeOfDay() < 2;
|
const hasSun = arena.getTimeOfDay() < 2;
|
||||||
switch (arena.biomeType) {
|
switch (arena.biomeType) {
|
||||||
case Biome.GRASS:
|
case BiomeId.GRASS:
|
||||||
weatherPool = [{ weatherType: WeatherType.NONE, weight: 7 }];
|
weatherPool = [{ weatherType: WeatherType.NONE, weight: 7 }];
|
||||||
if (hasSun) {
|
if (hasSun) {
|
||||||
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 });
|
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Biome.TALL_GRASS:
|
case BiomeId.TALL_GRASS:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 8 },
|
{ weatherType: WeatherType.NONE, weight: 8 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 5 },
|
{ weatherType: WeatherType.RAIN, weight: 5 },
|
||||||
@ -304,26 +304,26 @@ export function getRandomWeatherType(arena: Arena): WeatherType {
|
|||||||
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 8 });
|
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 8 });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Biome.FOREST:
|
case BiomeId.FOREST:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 8 },
|
{ weatherType: WeatherType.NONE, weight: 8 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 5 },
|
{ weatherType: WeatherType.RAIN, weight: 5 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.SEA:
|
case BiomeId.SEA:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 3 },
|
{ weatherType: WeatherType.NONE, weight: 3 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 12 },
|
{ weatherType: WeatherType.RAIN, weight: 12 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.SWAMP:
|
case BiomeId.SWAMP:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 3 },
|
{ weatherType: WeatherType.NONE, weight: 3 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 4 },
|
{ weatherType: WeatherType.RAIN, weight: 4 },
|
||||||
{ weatherType: WeatherType.FOG, weight: 1 },
|
{ weatherType: WeatherType.FOG, weight: 1 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.BEACH:
|
case BiomeId.BEACH:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 8 },
|
{ weatherType: WeatherType.NONE, weight: 8 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 3 },
|
{ weatherType: WeatherType.RAIN, weight: 3 },
|
||||||
@ -332,17 +332,17 @@ export function getRandomWeatherType(arena: Arena): WeatherType {
|
|||||||
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 });
|
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Biome.LAKE:
|
case BiomeId.LAKE:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 10 },
|
{ weatherType: WeatherType.NONE, weight: 10 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 5 },
|
{ weatherType: WeatherType.RAIN, weight: 5 },
|
||||||
{ weatherType: WeatherType.FOG, weight: 1 },
|
{ weatherType: WeatherType.FOG, weight: 1 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.SEABED:
|
case BiomeId.SEABED:
|
||||||
weatherPool = [{ weatherType: WeatherType.RAIN, weight: 1 }];
|
weatherPool = [{ weatherType: WeatherType.RAIN, weight: 1 }];
|
||||||
break;
|
break;
|
||||||
case Biome.BADLANDS:
|
case BiomeId.BADLANDS:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 8 },
|
{ weatherType: WeatherType.NONE, weight: 8 },
|
||||||
{ weatherType: WeatherType.SANDSTORM, weight: 2 },
|
{ weatherType: WeatherType.SANDSTORM, weight: 2 },
|
||||||
@ -351,26 +351,26 @@ export function getRandomWeatherType(arena: Arena): WeatherType {
|
|||||||
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 });
|
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Biome.DESERT:
|
case BiomeId.DESERT:
|
||||||
weatherPool = [{ weatherType: WeatherType.SANDSTORM, weight: 2 }];
|
weatherPool = [{ weatherType: WeatherType.SANDSTORM, weight: 2 }];
|
||||||
if (hasSun) {
|
if (hasSun) {
|
||||||
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 });
|
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Biome.ICE_CAVE:
|
case BiomeId.ICE_CAVE:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 3 },
|
{ weatherType: WeatherType.NONE, weight: 3 },
|
||||||
{ weatherType: WeatherType.SNOW, weight: 4 },
|
{ weatherType: WeatherType.SNOW, weight: 4 },
|
||||||
{ weatherType: WeatherType.HAIL, weight: 1 },
|
{ weatherType: WeatherType.HAIL, weight: 1 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.MEADOW:
|
case BiomeId.MEADOW:
|
||||||
weatherPool = [{ weatherType: WeatherType.NONE, weight: 2 }];
|
weatherPool = [{ weatherType: WeatherType.NONE, weight: 2 }];
|
||||||
if (hasSun) {
|
if (hasSun) {
|
||||||
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 });
|
weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Biome.VOLCANO:
|
case BiomeId.VOLCANO:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{
|
{
|
||||||
weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE,
|
weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE,
|
||||||
@ -378,25 +378,25 @@ export function getRandomWeatherType(arena: Arena): WeatherType {
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.GRAVEYARD:
|
case BiomeId.GRAVEYARD:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 3 },
|
{ weatherType: WeatherType.NONE, weight: 3 },
|
||||||
{ weatherType: WeatherType.FOG, weight: 1 },
|
{ weatherType: WeatherType.FOG, weight: 1 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.JUNGLE:
|
case BiomeId.JUNGLE:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 8 },
|
{ weatherType: WeatherType.NONE, weight: 8 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 2 },
|
{ weatherType: WeatherType.RAIN, weight: 2 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.SNOWY_FOREST:
|
case BiomeId.SNOWY_FOREST:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.SNOW, weight: 7 },
|
{ weatherType: WeatherType.SNOW, weight: 7 },
|
||||||
{ weatherType: WeatherType.HAIL, weight: 1 },
|
{ weatherType: WeatherType.HAIL, weight: 1 },
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case Biome.ISLAND:
|
case BiomeId.ISLAND:
|
||||||
weatherPool = [
|
weatherPool = [
|
||||||
{ weatherType: WeatherType.NONE, weight: 5 },
|
{ weatherType: WeatherType.NONE, weight: 5 },
|
||||||
{ weatherType: WeatherType.RAIN, weight: 1 },
|
{ weatherType: WeatherType.RAIN, weight: 1 },
|
||||||
@ -407,7 +407,7 @@ export function getRandomWeatherType(arena: Arena): WeatherType {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arena.biomeType === Biome.TOWN && timedEventManager.isEventActive()) {
|
if (arena.biomeType === BiomeId.TOWN && timedEventManager.isEventActive()) {
|
||||||
timedEventManager.getWeather()?.map(w => weatherPool.push(w));
|
timedEventManager.getWeather()?.map(w => weatherPool.push(w));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,11 +4,11 @@ export enum MoveFlags {
|
|||||||
IGNORE_PROTECT = 1 << 1,
|
IGNORE_PROTECT = 1 << 1,
|
||||||
/**
|
/**
|
||||||
* Sound-based moves have the following effects:
|
* Sound-based moves have the following effects:
|
||||||
* - Pokemon with the {@linkcode Abilities.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves.
|
* - Pokemon with the {@linkcode AbilityId.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves.
|
||||||
* - Pokemon affected by {@linkcode Moves.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns.
|
* - Pokemon affected by {@linkcode MoveId.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns.
|
||||||
* - Sound-based moves used by a Pokemon with {@linkcode Abilities.LIQUID_VOICE Liquid Voice} become Water-type moves.
|
* - Sound-based moves used by a Pokemon with {@linkcode AbilityId.LIQUID_VOICE Liquid Voice} become Water-type moves.
|
||||||
* - Sound-based moves used by a Pokemon with {@linkcode Abilities.PUNK_ROCK Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves.
|
* - Sound-based moves used by a Pokemon with {@linkcode AbilityId.PUNK_ROCK Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves.
|
||||||
* - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode Moves.SUBSTITUTE Substitute}.
|
* - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode MoveId.SUBSTITUTE Substitute}.
|
||||||
*
|
*
|
||||||
* cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move
|
* cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move
|
||||||
*/
|
*/
|
||||||
@ -20,19 +20,19 @@ export enum MoveFlags {
|
|||||||
PUNCHING_MOVE = 1 << 7,
|
PUNCHING_MOVE = 1 << 7,
|
||||||
SLICING_MOVE = 1 << 8,
|
SLICING_MOVE = 1 << 8,
|
||||||
/**
|
/**
|
||||||
* Indicates a move should be affected by {@linkcode Abilities.RECKLESS}
|
* Indicates a move should be affected by {@linkcode AbilityId.RECKLESS}
|
||||||
* @see {@linkcode Move.recklessMove()}
|
* @see {@linkcode Move.recklessMove()}
|
||||||
*/
|
*/
|
||||||
RECKLESS_MOVE = 1 << 9,
|
RECKLESS_MOVE = 1 << 9,
|
||||||
/** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */
|
/** Indicates a move should be affected by {@linkcode AbilityId.BULLETPROOF} */
|
||||||
BALLBOMB_MOVE = 1 << 10,
|
BALLBOMB_MOVE = 1 << 10,
|
||||||
/** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */
|
/** Grass types and pokemon with {@linkcode AbilityId.OVERCOAT} are immune to powder moves */
|
||||||
POWDER_MOVE = 1 << 11,
|
POWDER_MOVE = 1 << 11,
|
||||||
/** Indicates a move should trigger {@linkcode Abilities.DANCER} */
|
/** Indicates a move should trigger {@linkcode AbilityId.DANCER} */
|
||||||
DANCE_MOVE = 1 << 12,
|
DANCE_MOVE = 1 << 12,
|
||||||
/** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */
|
/** Indicates a move should trigger {@linkcode AbilityId.WIND_RIDER} */
|
||||||
WIND_MOVE = 1 << 13,
|
WIND_MOVE = 1 << 13,
|
||||||
/** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */
|
/** Indicates a move should trigger {@linkcode AbilityId.TRIAGE} */
|
||||||
TRIAGE_MOVE = 1 << 14,
|
TRIAGE_MOVE = 1 << 14,
|
||||||
IGNORE_ABILITIES = 1 << 15,
|
IGNORE_ABILITIES = 1 << 15,
|
||||||
/** Enables all hits of a multi-hit move to be accuracy checked individually */
|
/** Enables all hits of a multi-hit move to be accuracy checked individually */
|
||||||
@ -41,6 +41,6 @@ export enum MoveFlags {
|
|||||||
IGNORE_SUBSTITUTE = 1 << 17,
|
IGNORE_SUBSTITUTE = 1 << 17,
|
||||||
/** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */
|
/** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */
|
||||||
REDIRECT_COUNTER = 1 << 18,
|
REDIRECT_COUNTER = 1 << 18,
|
||||||
/** Indicates a move is able to be reflected by {@linkcode Abilities.MAGIC_BOUNCE} and {@linkcode Moves.MAGIC_COAT} */
|
/** Indicates a move is able to be reflected by {@linkcode AbilityId.MAGIC_BOUNCE} and {@linkcode MoveId.MAGIC_COAT} */
|
||||||
REFLECTABLE = 1 << 19
|
REFLECTABLE = 1 << 19
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
export enum Abilities {
|
export enum AbilityId {
|
||||||
/**{@link https://bulbapedia.bulbagarden.net/wiki/None_(ability) | Source} */
|
/**{@link https://bulbapedia.bulbagarden.net/wiki/None_(ability) | Source} */
|
||||||
NONE,
|
NONE,
|
||||||
/**{@link https://bulbapedia.bulbagarden.net/wiki/Stench_(ability) | Source} */
|
/**{@link https://bulbapedia.bulbagarden.net/wiki/Stench_(ability) | Source} */
|
@ -1,4 +1,4 @@
|
|||||||
export enum Biome {
|
export enum BiomeId {
|
||||||
// TODO: Should -1 be part of the enum signature (for "unknown place")
|
// TODO: Should -1 be part of the enum signature (for "unknown place")
|
||||||
TOWN,
|
TOWN,
|
||||||
PLAINS,
|
PLAINS,
|
@ -1,4 +1,4 @@
|
|||||||
export enum Moves {
|
export enum MoveId {
|
||||||
/**{@link https://bulbapedia.bulbagarden.net/wiki/None_(move) | Source} */
|
/**{@link https://bulbapedia.bulbagarden.net/wiki/None_(move) | Source} */
|
||||||
NONE,
|
NONE,
|
||||||
/**{@link https://bulbapedia.bulbagarden.net/wiki/Pound_(move) | Source} */
|
/**{@link https://bulbapedia.bulbagarden.net/wiki/Pound_(move) | Source} */
|
@ -1,4 +1,4 @@
|
|||||||
export enum Species {
|
export enum SpeciesId {
|
||||||
/**{@link https://bulbapedia.bulbagarden.net/wiki/Bulbasaur_(Pokémon) | Source} */
|
/**{@link https://bulbapedia.bulbagarden.net/wiki/Bulbasaur_(Pokémon) | Source} */
|
||||||
BULBASAUR = 1,
|
BULBASAUR = 1,
|
||||||
/**{@link https://bulbapedia.bulbagarden.net/wiki/Ivysaur_(Pokémon) | Source} */
|
/**{@link https://bulbapedia.bulbagarden.net/wiki/Ivysaur_(Pokémon) | Source} */
|
@ -31,19 +31,19 @@ import type Pokemon from "#app/field/pokemon";
|
|||||||
import Overrides from "#app/overrides";
|
import Overrides from "#app/overrides";
|
||||||
import { TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena";
|
import { TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena";
|
||||||
import type { ArenaTagType } from "#enums/arena-tag-type";
|
import type { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { TimeOfDay } from "#enums/time-of-day";
|
import { TimeOfDay } from "#enums/time-of-day";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "#app/data/pokemon-forms";
|
import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "#app/data/pokemon-forms";
|
||||||
import { CommonAnimPhase } from "#app/phases/common-anim-phase";
|
import { CommonAnimPhase } from "#app/phases/common-anim-phase";
|
||||||
import { WeatherType } from "#enums/weather-type";
|
import { WeatherType } from "#enums/weather-type";
|
||||||
import { FieldEffectModifier } from "#app/modifier/modifier";
|
import { FieldEffectModifier } from "#app/modifier/modifier";
|
||||||
|
|
||||||
export class Arena {
|
export class Arena {
|
||||||
public biomeType: Biome;
|
public biomeType: BiomeId;
|
||||||
public weather: Weather | null;
|
public weather: Weather | null;
|
||||||
public terrain: Terrain | null;
|
public terrain: Terrain | null;
|
||||||
public tags: ArenaTag[];
|
public tags: ArenaTag[];
|
||||||
@ -64,7 +64,7 @@ export class Arena {
|
|||||||
|
|
||||||
public readonly eventTarget: EventTarget = new EventTarget();
|
public readonly eventTarget: EventTarget = new EventTarget();
|
||||||
|
|
||||||
constructor(biome: Biome, bgm: string, playerFaints = 0) {
|
constructor(biome: BiomeId, bgm: string, playerFaints = 0) {
|
||||||
this.biomeType = biome;
|
this.biomeType = biome;
|
||||||
this.tags = [];
|
this.tags = [];
|
||||||
this.bgm = bgm;
|
this.bgm = bgm;
|
||||||
@ -116,7 +116,7 @@ export class Arena {
|
|||||||
const isBossSpecies =
|
const isBossSpecies =
|
||||||
!!globalScene.getEncounterBossSegments(waveIndex, level) &&
|
!!globalScene.getEncounterBossSegments(waveIndex, level) &&
|
||||||
!!this.pokemonPool[BiomePoolTier.BOSS].length &&
|
!!this.pokemonPool[BiomePoolTier.BOSS].length &&
|
||||||
(this.biomeType !== Biome.END || globalScene.gameMode.isClassic || globalScene.gameMode.isWaveFinal(waveIndex));
|
(this.biomeType !== BiomeId.END || globalScene.gameMode.isClassic || globalScene.gameMode.isWaveFinal(waveIndex));
|
||||||
const randVal = isBossSpecies ? 64 : 512;
|
const randVal = isBossSpecies ? 64 : 512;
|
||||||
// luck influences encounter rarity
|
// luck influences encounter rarity
|
||||||
let luckModifier = 0;
|
let luckModifier = 0;
|
||||||
@ -153,9 +153,9 @@ export class Arena {
|
|||||||
ret = globalScene.randomSpecies(waveIndex, level);
|
ret = globalScene.randomSpecies(waveIndex, level);
|
||||||
} else {
|
} else {
|
||||||
const entry = tierPool[randSeedInt(tierPool.length)];
|
const entry = tierPool[randSeedInt(tierPool.length)];
|
||||||
let species: Species;
|
let species: SpeciesId;
|
||||||
if (typeof entry === "number") {
|
if (typeof entry === "number") {
|
||||||
species = entry as Species;
|
species = entry as SpeciesId;
|
||||||
} else {
|
} else {
|
||||||
const levelThresholds = Object.keys(entry);
|
const levelThresholds = Object.keys(entry);
|
||||||
for (let l = levelThresholds.length - 1; l >= 0; l--) {
|
for (let l = levelThresholds.length - 1; l >= 0; l--) {
|
||||||
@ -199,7 +199,7 @@ export class Arena {
|
|||||||
|
|
||||||
const newSpeciesId = ret.getWildSpeciesForLevel(level, true, isBoss ?? isBossSpecies, globalScene.gameMode);
|
const newSpeciesId = ret.getWildSpeciesForLevel(level, true, isBoss ?? isBossSpecies, globalScene.gameMode);
|
||||||
if (newSpeciesId !== ret.speciesId) {
|
if (newSpeciesId !== ret.speciesId) {
|
||||||
console.log("Replaced", Species[ret.speciesId], "with", Species[newSpeciesId]);
|
console.log("Replaced", SpeciesId[ret.speciesId], "with", SpeciesId[newSpeciesId]);
|
||||||
ret = getPokemonSpecies(newSpeciesId);
|
ret = getPokemonSpecies(newSpeciesId);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -239,30 +239,30 @@ export class Arena {
|
|||||||
|
|
||||||
getSpeciesFormIndex(species: PokemonSpecies): number {
|
getSpeciesFormIndex(species: PokemonSpecies): number {
|
||||||
switch (species.speciesId) {
|
switch (species.speciesId) {
|
||||||
case Species.BURMY:
|
case SpeciesId.BURMY:
|
||||||
case Species.WORMADAM:
|
case SpeciesId.WORMADAM:
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.BEACH:
|
case BiomeId.BEACH:
|
||||||
return 1;
|
return 1;
|
||||||
case Biome.SLUM:
|
case BiomeId.SLUM:
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Species.ROTOM:
|
case SpeciesId.ROTOM:
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.VOLCANO:
|
case BiomeId.VOLCANO:
|
||||||
return 1;
|
return 1;
|
||||||
case Biome.SEA:
|
case BiomeId.SEA:
|
||||||
return 2;
|
return 2;
|
||||||
case Biome.ICE_CAVE:
|
case BiomeId.ICE_CAVE:
|
||||||
return 3;
|
return 3;
|
||||||
case Biome.MOUNTAIN:
|
case BiomeId.MOUNTAIN:
|
||||||
return 4;
|
return 4;
|
||||||
case Biome.TALL_GRASS:
|
case BiomeId.TALL_GRASS:
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Species.LYCANROC:
|
case SpeciesId.LYCANROC:
|
||||||
const timeOfDay = this.getTimeOfDay();
|
const timeOfDay = this.getTimeOfDay();
|
||||||
switch (timeOfDay) {
|
switch (timeOfDay) {
|
||||||
case TimeOfDay.DAY:
|
case TimeOfDay.DAY:
|
||||||
@ -281,9 +281,9 @@ export class Arena {
|
|||||||
|
|
||||||
getBgTerrainColorRatioForBiome(): number {
|
getBgTerrainColorRatioForBiome(): number {
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.SPACE:
|
case BiomeId.SPACE:
|
||||||
return 1;
|
return 1;
|
||||||
case Biome.END:
|
case BiomeId.END:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,8 +372,8 @@ export class Arena {
|
|||||||
*/
|
*/
|
||||||
triggerWeatherBasedFormChanges(): void {
|
triggerWeatherBasedFormChanges(): void {
|
||||||
globalScene.getField(true).forEach(p => {
|
globalScene.getField(true).forEach(p => {
|
||||||
const isCastformWithForecast = p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM;
|
const isCastformWithForecast = p.hasAbility(AbilityId.FORECAST) && p.species.speciesId === SpeciesId.CASTFORM;
|
||||||
const isCherrimWithFlowerGift = p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM;
|
const isCherrimWithFlowerGift = p.hasAbility(AbilityId.FLOWER_GIFT) && p.species.speciesId === SpeciesId.CHERRIM;
|
||||||
|
|
||||||
if (isCastformWithForecast || isCherrimWithFlowerGift) {
|
if (isCastformWithForecast || isCherrimWithFlowerGift) {
|
||||||
globalScene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger);
|
globalScene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger);
|
||||||
@ -387,9 +387,9 @@ export class Arena {
|
|||||||
triggerWeatherBasedFormChangesToNormal(): void {
|
triggerWeatherBasedFormChangesToNormal(): void {
|
||||||
globalScene.getField(true).forEach(p => {
|
globalScene.getField(true).forEach(p => {
|
||||||
const isCastformWithForecast =
|
const isCastformWithForecast =
|
||||||
p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM;
|
p.hasAbility(AbilityId.FORECAST, false, true) && p.species.speciesId === SpeciesId.CASTFORM;
|
||||||
const isCherrimWithFlowerGift =
|
const isCherrimWithFlowerGift =
|
||||||
p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM;
|
p.hasAbility(AbilityId.FLOWER_GIFT, false, true) && p.species.speciesId === SpeciesId.CHERRIM;
|
||||||
|
|
||||||
if (isCastformWithForecast || isCherrimWithFlowerGift) {
|
if (isCastformWithForecast || isCherrimWithFlowerGift) {
|
||||||
return globalScene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger);
|
return globalScene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger);
|
||||||
@ -488,42 +488,42 @@ export class Arena {
|
|||||||
*/
|
*/
|
||||||
getTrainerChance(): number {
|
getTrainerChance(): number {
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.METROPOLIS:
|
case BiomeId.METROPOLIS:
|
||||||
return 2;
|
return 2;
|
||||||
case Biome.SLUM:
|
case BiomeId.SLUM:
|
||||||
case Biome.BEACH:
|
case BiomeId.BEACH:
|
||||||
case Biome.DOJO:
|
case BiomeId.DOJO:
|
||||||
case Biome.CONSTRUCTION_SITE:
|
case BiomeId.CONSTRUCTION_SITE:
|
||||||
return 4;
|
return 4;
|
||||||
case Biome.PLAINS:
|
case BiomeId.PLAINS:
|
||||||
case Biome.GRASS:
|
case BiomeId.GRASS:
|
||||||
case Biome.LAKE:
|
case BiomeId.LAKE:
|
||||||
case Biome.CAVE:
|
case BiomeId.CAVE:
|
||||||
return 6;
|
return 6;
|
||||||
case Biome.TALL_GRASS:
|
case BiomeId.TALL_GRASS:
|
||||||
case Biome.FOREST:
|
case BiomeId.FOREST:
|
||||||
case Biome.SEA:
|
case BiomeId.SEA:
|
||||||
case Biome.SWAMP:
|
case BiomeId.SWAMP:
|
||||||
case Biome.MOUNTAIN:
|
case BiomeId.MOUNTAIN:
|
||||||
case Biome.BADLANDS:
|
case BiomeId.BADLANDS:
|
||||||
case Biome.DESERT:
|
case BiomeId.DESERT:
|
||||||
case Biome.MEADOW:
|
case BiomeId.MEADOW:
|
||||||
case Biome.POWER_PLANT:
|
case BiomeId.POWER_PLANT:
|
||||||
case Biome.GRAVEYARD:
|
case BiomeId.GRAVEYARD:
|
||||||
case Biome.FACTORY:
|
case BiomeId.FACTORY:
|
||||||
case Biome.SNOWY_FOREST:
|
case BiomeId.SNOWY_FOREST:
|
||||||
return 8;
|
return 8;
|
||||||
case Biome.ICE_CAVE:
|
case BiomeId.ICE_CAVE:
|
||||||
case Biome.VOLCANO:
|
case BiomeId.VOLCANO:
|
||||||
case Biome.RUINS:
|
case BiomeId.RUINS:
|
||||||
case Biome.WASTELAND:
|
case BiomeId.WASTELAND:
|
||||||
case Biome.JUNGLE:
|
case BiomeId.JUNGLE:
|
||||||
case Biome.FAIRY_CAVE:
|
case BiomeId.FAIRY_CAVE:
|
||||||
return 12;
|
return 12;
|
||||||
case Biome.SEABED:
|
case BiomeId.SEABED:
|
||||||
case Biome.ABYSS:
|
case BiomeId.ABYSS:
|
||||||
case Biome.SPACE:
|
case BiomeId.SPACE:
|
||||||
case Biome.TEMPLE:
|
case BiomeId.TEMPLE:
|
||||||
return 16;
|
return 16;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
@ -532,7 +532,7 @@ export class Arena {
|
|||||||
|
|
||||||
getTimeOfDay(): TimeOfDay {
|
getTimeOfDay(): TimeOfDay {
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.ABYSS:
|
case BiomeId.ABYSS:
|
||||||
return TimeOfDay.NIGHT;
|
return TimeOfDay.NIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -555,16 +555,16 @@ export class Arena {
|
|||||||
|
|
||||||
isOutside(): boolean {
|
isOutside(): boolean {
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.SEABED:
|
case BiomeId.SEABED:
|
||||||
case Biome.CAVE:
|
case BiomeId.CAVE:
|
||||||
case Biome.ICE_CAVE:
|
case BiomeId.ICE_CAVE:
|
||||||
case Biome.POWER_PLANT:
|
case BiomeId.POWER_PLANT:
|
||||||
case Biome.DOJO:
|
case BiomeId.DOJO:
|
||||||
case Biome.FACTORY:
|
case BiomeId.FACTORY:
|
||||||
case Biome.ABYSS:
|
case BiomeId.ABYSS:
|
||||||
case Biome.FAIRY_CAVE:
|
case BiomeId.FAIRY_CAVE:
|
||||||
case Biome.TEMPLE:
|
case BiomeId.TEMPLE:
|
||||||
case Biome.LABORATORY:
|
case BiomeId.LABORATORY:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
@ -589,7 +589,7 @@ export class Arena {
|
|||||||
return this.overrideTint();
|
return this.overrideTint();
|
||||||
}
|
}
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.ABYSS:
|
case BiomeId.ABYSS:
|
||||||
return [64, 64, 64];
|
return [64, 64, 64];
|
||||||
default:
|
default:
|
||||||
return [128, 128, 128];
|
return [128, 128, 128];
|
||||||
@ -615,9 +615,9 @@ export class Arena {
|
|||||||
return this.overrideTint();
|
return this.overrideTint();
|
||||||
}
|
}
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.ABYSS:
|
case BiomeId.ABYSS:
|
||||||
case Biome.SPACE:
|
case BiomeId.SPACE:
|
||||||
case Biome.END:
|
case BiomeId.END:
|
||||||
return this.getDayTint();
|
return this.getDayTint();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -674,7 +674,7 @@ export class Arena {
|
|||||||
* Adds a new tag to the arena
|
* Adds a new tag to the arena
|
||||||
* @param tagType {@linkcode ArenaTagType} the tag being added
|
* @param tagType {@linkcode ArenaTagType} the tag being added
|
||||||
* @param turnCount How many turns the tag lasts
|
* @param turnCount How many turns the tag lasts
|
||||||
* @param sourceMove {@linkcode Moves} the move the tag came from, or `undefined` if not from a move
|
* @param sourceMove {@linkcode MoveId} the move the tag came from, or `undefined` if not from a move
|
||||||
* @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById})
|
* @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById})
|
||||||
* @param side {@linkcode ArenaTagSide} which side(s) the tag applies to
|
* @param side {@linkcode ArenaTagSide} which side(s) the tag applies to
|
||||||
* @param quiet If a message should be queued on screen to announce the tag being added
|
* @param quiet If a message should be queued on screen to announce the tag being added
|
||||||
@ -684,7 +684,7 @@ export class Arena {
|
|||||||
addTag(
|
addTag(
|
||||||
tagType: ArenaTagType,
|
tagType: ArenaTagType,
|
||||||
turnCount: number,
|
turnCount: number,
|
||||||
sourceMove: Moves | undefined,
|
sourceMove: MoveId | undefined,
|
||||||
sourceId: number,
|
sourceId: number,
|
||||||
side: ArenaTagSide = ArenaTagSide.BOTH,
|
side: ArenaTagSide = ArenaTagSide.BOTH,
|
||||||
quiet = false,
|
quiet = false,
|
||||||
@ -835,78 +835,78 @@ export class Arena {
|
|||||||
/** The loop point of any given biome track, read as seconds and milliseconds. */
|
/** The loop point of any given biome track, read as seconds and milliseconds. */
|
||||||
getBgmLoopPoint(): number {
|
getBgmLoopPoint(): number {
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.TOWN:
|
case BiomeId.TOWN:
|
||||||
return 7.288;
|
return 7.288;
|
||||||
case Biome.PLAINS:
|
case BiomeId.PLAINS:
|
||||||
return 17.485;
|
return 17.485;
|
||||||
case Biome.GRASS:
|
case BiomeId.GRASS:
|
||||||
return 1.995;
|
return 1.995;
|
||||||
case Biome.TALL_GRASS:
|
case BiomeId.TALL_GRASS:
|
||||||
return 9.608;
|
return 9.608;
|
||||||
case Biome.METROPOLIS:
|
case BiomeId.METROPOLIS:
|
||||||
return 141.47;
|
return 141.47;
|
||||||
case Biome.FOREST:
|
case BiomeId.FOREST:
|
||||||
return 0.341;
|
return 0.341;
|
||||||
case Biome.SEA:
|
case BiomeId.SEA:
|
||||||
return 0.024;
|
return 0.024;
|
||||||
case Biome.SWAMP:
|
case BiomeId.SWAMP:
|
||||||
return 4.461;
|
return 4.461;
|
||||||
case Biome.BEACH:
|
case BiomeId.BEACH:
|
||||||
return 3.462;
|
return 3.462;
|
||||||
case Biome.LAKE:
|
case BiomeId.LAKE:
|
||||||
return 7.215;
|
return 7.215;
|
||||||
case Biome.SEABED:
|
case BiomeId.SEABED:
|
||||||
return 2.6;
|
return 2.6;
|
||||||
case Biome.MOUNTAIN:
|
case BiomeId.MOUNTAIN:
|
||||||
return 4.018;
|
return 4.018;
|
||||||
case Biome.BADLANDS:
|
case BiomeId.BADLANDS:
|
||||||
return 17.79;
|
return 17.79;
|
||||||
case Biome.CAVE:
|
case BiomeId.CAVE:
|
||||||
return 14.24;
|
return 14.24;
|
||||||
case Biome.DESERT:
|
case BiomeId.DESERT:
|
||||||
return 1.143;
|
return 1.143;
|
||||||
case Biome.ICE_CAVE:
|
case BiomeId.ICE_CAVE:
|
||||||
return 0.0;
|
return 0.0;
|
||||||
case Biome.MEADOW:
|
case BiomeId.MEADOW:
|
||||||
return 3.891;
|
return 3.891;
|
||||||
case Biome.POWER_PLANT:
|
case BiomeId.POWER_PLANT:
|
||||||
return 9.447;
|
return 9.447;
|
||||||
case Biome.VOLCANO:
|
case BiomeId.VOLCANO:
|
||||||
return 17.637;
|
return 17.637;
|
||||||
case Biome.GRAVEYARD:
|
case BiomeId.GRAVEYARD:
|
||||||
return 13.711;
|
return 13.711;
|
||||||
case Biome.DOJO:
|
case BiomeId.DOJO:
|
||||||
return 6.205;
|
return 6.205;
|
||||||
case Biome.FACTORY:
|
case BiomeId.FACTORY:
|
||||||
return 4.985;
|
return 4.985;
|
||||||
case Biome.RUINS:
|
case BiomeId.RUINS:
|
||||||
return 0.0;
|
return 0.0;
|
||||||
case Biome.WASTELAND:
|
case BiomeId.WASTELAND:
|
||||||
return 6.336;
|
return 6.336;
|
||||||
case Biome.ABYSS:
|
case BiomeId.ABYSS:
|
||||||
return 5.13;
|
return 5.13;
|
||||||
case Biome.SPACE:
|
case BiomeId.SPACE:
|
||||||
return 20.036;
|
return 20.036;
|
||||||
case Biome.CONSTRUCTION_SITE:
|
case BiomeId.CONSTRUCTION_SITE:
|
||||||
return 1.222;
|
return 1.222;
|
||||||
case Biome.JUNGLE:
|
case BiomeId.JUNGLE:
|
||||||
return 0.0;
|
return 0.0;
|
||||||
case Biome.FAIRY_CAVE:
|
case BiomeId.FAIRY_CAVE:
|
||||||
return 4.542;
|
return 4.542;
|
||||||
case Biome.TEMPLE:
|
case BiomeId.TEMPLE:
|
||||||
return 2.547;
|
return 2.547;
|
||||||
case Biome.ISLAND:
|
case BiomeId.ISLAND:
|
||||||
return 2.751;
|
return 2.751;
|
||||||
case Biome.LABORATORY:
|
case BiomeId.LABORATORY:
|
||||||
return 114.862;
|
return 114.862;
|
||||||
case Biome.SLUM:
|
case BiomeId.SLUM:
|
||||||
return 0.0;
|
return 0.0;
|
||||||
case Biome.SNOWY_FOREST:
|
case BiomeId.SNOWY_FOREST:
|
||||||
return 3.047;
|
return 3.047;
|
||||||
case Biome.END:
|
case BiomeId.END:
|
||||||
return 17.153;
|
return 17.153;
|
||||||
default:
|
default:
|
||||||
console.warn(`missing bgm loop-point for biome "${Biome[this.biomeType]}" (=${this.biomeType})`);
|
console.warn(`missing bgm loop-point for biome "${BiomeId[this.biomeType]}" (=${this.biomeType})`);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -916,37 +916,37 @@ export class Arena {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getBiomeKey(biome: Biome): string {
|
export function getBiomeKey(biome: BiomeId): string {
|
||||||
return Biome[biome].toLowerCase();
|
return BiomeId[biome].toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getBiomeHasProps(biomeType: Biome): boolean {
|
export function getBiomeHasProps(biomeType: BiomeId): boolean {
|
||||||
switch (biomeType) {
|
switch (biomeType) {
|
||||||
case Biome.METROPOLIS:
|
case BiomeId.METROPOLIS:
|
||||||
case Biome.BEACH:
|
case BiomeId.BEACH:
|
||||||
case Biome.LAKE:
|
case BiomeId.LAKE:
|
||||||
case Biome.SEABED:
|
case BiomeId.SEABED:
|
||||||
case Biome.MOUNTAIN:
|
case BiomeId.MOUNTAIN:
|
||||||
case Biome.BADLANDS:
|
case BiomeId.BADLANDS:
|
||||||
case Biome.CAVE:
|
case BiomeId.CAVE:
|
||||||
case Biome.DESERT:
|
case BiomeId.DESERT:
|
||||||
case Biome.ICE_CAVE:
|
case BiomeId.ICE_CAVE:
|
||||||
case Biome.MEADOW:
|
case BiomeId.MEADOW:
|
||||||
case Biome.POWER_PLANT:
|
case BiomeId.POWER_PLANT:
|
||||||
case Biome.VOLCANO:
|
case BiomeId.VOLCANO:
|
||||||
case Biome.GRAVEYARD:
|
case BiomeId.GRAVEYARD:
|
||||||
case Biome.FACTORY:
|
case BiomeId.FACTORY:
|
||||||
case Biome.RUINS:
|
case BiomeId.RUINS:
|
||||||
case Biome.WASTELAND:
|
case BiomeId.WASTELAND:
|
||||||
case Biome.ABYSS:
|
case BiomeId.ABYSS:
|
||||||
case Biome.CONSTRUCTION_SITE:
|
case BiomeId.CONSTRUCTION_SITE:
|
||||||
case Biome.JUNGLE:
|
case BiomeId.JUNGLE:
|
||||||
case Biome.FAIRY_CAVE:
|
case BiomeId.FAIRY_CAVE:
|
||||||
case Biome.TEMPLE:
|
case BiomeId.TEMPLE:
|
||||||
case Biome.SNOWY_FOREST:
|
case BiomeId.SNOWY_FOREST:
|
||||||
case Biome.ISLAND:
|
case BiomeId.ISLAND:
|
||||||
case Biome.LABORATORY:
|
case BiomeId.LABORATORY:
|
||||||
case Biome.END:
|
case BiomeId.END:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -955,7 +955,7 @@ export function getBiomeHasProps(biomeType: Biome): boolean {
|
|||||||
|
|
||||||
export class ArenaBase extends Phaser.GameObjects.Container {
|
export class ArenaBase extends Phaser.GameObjects.Container {
|
||||||
public player: boolean;
|
public player: boolean;
|
||||||
public biome: Biome;
|
public biome: BiomeId;
|
||||||
public propValue: number;
|
public propValue: number;
|
||||||
public base: Phaser.GameObjects.Sprite;
|
public base: Phaser.GameObjects.Sprite;
|
||||||
public props: Phaser.GameObjects.Sprite[];
|
public props: Phaser.GameObjects.Sprite[];
|
||||||
@ -978,7 +978,7 @@ export class ArenaBase extends Phaser.GameObjects.Container {
|
|||||||
: [];
|
: [];
|
||||||
}
|
}
|
||||||
|
|
||||||
setBiome(biome: Biome, propValue?: number): void {
|
setBiome(biome: BiomeId, propValue?: number): void {
|
||||||
const hasProps = getBiomeHasProps(biome);
|
const hasProps = getBiomeHasProps(biome);
|
||||||
const biomeKey = getBiomeKey(biome);
|
const biomeKey = getBiomeKey(biome);
|
||||||
const baseKey = `${biomeKey}_${this.player ? "a" : "b"}`;
|
const baseKey = `${biomeKey}_${this.player ? "a" : "b"}`;
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import type { GameObjects } from "phaser";
|
import type { GameObjects } from "phaser";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter";
|
||||||
import type { Species } from "#enums/species";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
import { isNullOrUndefined } from "#app/utils/common";
|
import { isNullOrUndefined } from "#app/utils/common";
|
||||||
import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import type { Variant } from "#app/sprites/variant";
|
import type { Variant } from "#app/sprites/variant";
|
||||||
import { doShinySparkleAnim } from "#app/field/anims";
|
import { doShinySparkleAnim } from "#app/field/anims";
|
||||||
import PlayAnimationConfig = Phaser.Types.Animations.PlayAnimationConfig;
|
|
||||||
import { loadPokemonVariantAssets } from "#app/sprites/pokemon-sprite";
|
import { loadPokemonVariantAssets } from "#app/sprites/pokemon-sprite";
|
||||||
|
import PlayAnimationConfig = Phaser.Types.Animations.PlayAnimationConfig;
|
||||||
|
|
||||||
type KnownFileRoot =
|
type KnownFileRoot =
|
||||||
| "arenas"
|
| "arenas"
|
||||||
@ -39,7 +39,7 @@ export class MysteryEncounterSpriteConfig {
|
|||||||
/** Refer to [/public/images](../../public/images) directorty for all folder names */
|
/** Refer to [/public/images](../../public/images) directorty for all folder names */
|
||||||
fileRoot: (KnownFileRoot & string) | string;
|
fileRoot: (KnownFileRoot & string) | string;
|
||||||
/** Optional replacement for `spriteKey`/`fileRoot`. Just know this defaults to male/genderless, form 0, no shiny */
|
/** Optional replacement for `spriteKey`/`fileRoot`. Just know this defaults to male/genderless, form 0, no shiny */
|
||||||
species?: Species;
|
species?: SpeciesId;
|
||||||
/** Enable shadow. Defaults to `false` */
|
/** Enable shadow. Defaults to `false` */
|
||||||
hasShadow?: boolean = false;
|
hasShadow?: boolean = false;
|
||||||
/** Disable animation. Defaults to `false` */
|
/** Disable animation. Defaults to `false` */
|
||||||
|
@ -220,14 +220,14 @@ import i18next from "i18next";
|
|||||||
import { speciesEggMoves } from "#app/data/balance/egg-moves";
|
import { speciesEggMoves } from "#app/data/balance/egg-moves";
|
||||||
import { ModifierTier } from "#app/modifier/modifier-tier";
|
import { ModifierTier } from "#app/modifier/modifier-tier";
|
||||||
import { applyChallenges, ChallengeType } from "#app/data/challenge";
|
import { applyChallenges, ChallengeType } from "#app/data/challenge";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import type { BerryType } from "#enums/berry-type";
|
import type { BerryType } from "#enums/berry-type";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
import { DamageAnimPhase } from "#app/phases/damage-anim-phase";
|
import { DamageAnimPhase } from "#app/phases/damage-anim-phase";
|
||||||
import { FaintPhase } from "#app/phases/faint-phase";
|
import { FaintPhase } from "#app/phases/faint-phase";
|
||||||
@ -333,8 +333,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
public status: Status | null;
|
public status: Status | null;
|
||||||
public friendship: number;
|
public friendship: number;
|
||||||
public metLevel: number;
|
public metLevel: number;
|
||||||
public metBiome: Biome | -1;
|
public metBiome: BiomeId | -1;
|
||||||
public metSpecies: Species;
|
public metSpecies: SpeciesId;
|
||||||
public metWave: number;
|
public metWave: number;
|
||||||
public luck: number;
|
public luck: number;
|
||||||
public pauseEvolutions: boolean;
|
public pauseEvolutions: boolean;
|
||||||
@ -381,7 +381,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
public maskEnabled: boolean;
|
public maskEnabled: boolean;
|
||||||
public maskSprite: Phaser.GameObjects.Sprite | null;
|
public maskSprite: Phaser.GameObjects.Sprite | null;
|
||||||
|
|
||||||
public usedTMs: Moves[];
|
public usedTMs: MoveId[];
|
||||||
|
|
||||||
private shinySparkle: Phaser.GameObjects.Sprite;
|
private shinySparkle: Phaser.GameObjects.Sprite;
|
||||||
|
|
||||||
@ -1123,7 +1123,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get this {@linkcode Pokemon}'s {@linkcode PokemonSpeciesForm}.
|
* Get this {@linkcode Pokemon}'s {@linkcode PokemonSpeciesForm}.
|
||||||
* @param ignoreOverride - Whether to ignore overridden species from {@linkcode Moves.TRANSFORM}, default `false`.
|
* @param ignoreOverride - Whether to ignore overridden species from {@linkcode MoveId.TRANSFORM}, default `false`.
|
||||||
* This overrides `useIllusion` if `true`.
|
* This overrides `useIllusion` if `true`.
|
||||||
* @param useIllusion - `true` to use the speciesForm of the illusion; default `false`.
|
* @param useIllusion - `true` to use the speciesForm of the illusion; default `false`.
|
||||||
*/
|
*/
|
||||||
@ -1571,7 +1571,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (this.status && this.status.effect === StatusEffect.PARALYSIS) {
|
if (this.status && this.status.effect === StatusEffect.PARALYSIS) {
|
||||||
ret >>= 1;
|
ret >>= 1;
|
||||||
}
|
}
|
||||||
if (this.getTag(BattlerTagType.UNBURDEN) && this.hasAbility(Abilities.UNBURDEN)) {
|
if (this.getTag(BattlerTagType.UNBURDEN) && this.hasAbility(AbilityId.UNBURDEN)) {
|
||||||
ret *= 2;
|
ret *= 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1601,7 +1601,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (s === Stat.HP) {
|
if (s === Stat.HP) {
|
||||||
statHolder.value = statHolder.value + this.level + 10;
|
statHolder.value = statHolder.value + this.level + 10;
|
||||||
globalScene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder);
|
globalScene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder);
|
||||||
if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) {
|
if (this.hasAbility(AbilityId.WONDER_GUARD, false, true)) {
|
||||||
statHolder.value = 1;
|
statHolder.value = 1;
|
||||||
}
|
}
|
||||||
if (this.hp > statHolder.value || this.hp === undefined) {
|
if (this.hp > statHolder.value || this.hp === undefined) {
|
||||||
@ -1817,21 +1817,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the {@linkcode Pokemon} has a fusion with the specified {@linkcode Species}.
|
* Checks if the {@linkcode Pokemon} has a fusion with the specified {@linkcode SpeciesId}.
|
||||||
* @param species the pokemon {@linkcode Species} to check
|
* @param species the pokemon {@linkcode SpeciesId} to check
|
||||||
* @returns `true` if the {@linkcode Pokemon} has a fusion with the specified {@linkcode Species}, `false` otherwise
|
* @returns `true` if the {@linkcode Pokemon} has a fusion with the specified {@linkcode SpeciesId}, `false` otherwise
|
||||||
*/
|
*/
|
||||||
hasFusionSpecies(species: Species): boolean {
|
hasFusionSpecies(species: SpeciesId): boolean {
|
||||||
return this.fusionSpecies?.speciesId === species;
|
return this.fusionSpecies?.speciesId === species;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the {@linkcode Pokemon} has is the specified {@linkcode Species} or is fused with it.
|
* Checks if the {@linkcode Pokemon} has is the specified {@linkcode SpeciesId} or is fused with it.
|
||||||
* @param species the pokemon {@linkcode Species} to check
|
* @param species the pokemon {@linkcode SpeciesId} to check
|
||||||
* @param formKey If provided, requires the species to be in that form
|
* @param formKey If provided, requires the species to be in that form
|
||||||
* @returns `true` if the pokemon is the species or is fused with it, `false` otherwise
|
* @returns `true` if the pokemon is the species or is fused with it, `false` otherwise
|
||||||
*/
|
*/
|
||||||
hasSpecies(species: Species, formKey?: string): boolean {
|
hasSpecies(species: SpeciesId, formKey?: string): boolean {
|
||||||
if (isNullOrUndefined(formKey)) {
|
if (isNullOrUndefined(formKey)) {
|
||||||
return this.species.speciesId === species || this.fusionSpecies?.speciesId === species;
|
return this.species.speciesId === species || this.fusionSpecies?.speciesId === species;
|
||||||
}
|
}
|
||||||
@ -1848,7 +1848,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
const ret = !ignoreOverride && this.summonData.moveset ? this.summonData.moveset : this.moveset;
|
const ret = !ignoreOverride && this.summonData.moveset ? this.summonData.moveset : this.moveset;
|
||||||
|
|
||||||
// Overrides moveset based on arrays specified in overrides.ts
|
// Overrides moveset based on arrays specified in overrides.ts
|
||||||
let overrideArray: Moves | Array<Moves> = this.isPlayer()
|
let overrideArray: MoveId | Array<MoveId> = this.isPlayer()
|
||||||
? Overrides.MOVESET_OVERRIDE
|
? Overrides.MOVESET_OVERRIDE
|
||||||
: Overrides.OPP_MOVESET_OVERRIDE;
|
: Overrides.OPP_MOVESET_OVERRIDE;
|
||||||
if (!Array.isArray(overrideArray)) {
|
if (!Array.isArray(overrideArray)) {
|
||||||
@ -1858,7 +1858,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (!this.isPlayer()) {
|
if (!this.isPlayer()) {
|
||||||
this.moveset = [];
|
this.moveset = [];
|
||||||
}
|
}
|
||||||
overrideArray.forEach((move: Moves, index: number) => {
|
overrideArray.forEach((move: MoveId, index: number) => {
|
||||||
const ppUsed = this.moveset[index]?.ppUsed ?? 0;
|
const ppUsed = this.moveset[index]?.ppUsed ?? 0;
|
||||||
this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp));
|
this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp));
|
||||||
});
|
});
|
||||||
@ -1871,11 +1871,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
* Checks which egg moves have been unlocked for the {@linkcode Pokemon} based
|
* Checks which egg moves have been unlocked for the {@linkcode Pokemon} based
|
||||||
* on the species it was met at or by the first {@linkcode Pokemon} in its evolution
|
* on the species it was met at or by the first {@linkcode Pokemon} in its evolution
|
||||||
* line that can act as a starter and provides those egg moves.
|
* line that can act as a starter and provides those egg moves.
|
||||||
* @returns an array of {@linkcode Moves}, the length of which is determined by how many
|
* @returns an array of {@linkcode MoveId}, the length of which is determined by how many
|
||||||
* egg moves are unlocked for that species.
|
* egg moves are unlocked for that species.
|
||||||
*/
|
*/
|
||||||
getUnlockedEggMoves(): Moves[] {
|
getUnlockedEggMoves(): MoveId[] {
|
||||||
const moves: Moves[] = [];
|
const moves: MoveId[] = [];
|
||||||
const species =
|
const species =
|
||||||
this.metSpecies in speciesEggMoves ? this.metSpecies : this.getSpeciesForm(true).getRootSpeciesId(true);
|
this.metSpecies in speciesEggMoves ? this.metSpecies : this.getSpeciesForm(true).getRootSpeciesId(true);
|
||||||
if (species in speciesEggMoves) {
|
if (species in speciesEggMoves) {
|
||||||
@ -1894,10 +1894,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
*
|
*
|
||||||
* Available egg moves are only included if the {@linkcode Pokemon} was
|
* Available egg moves are only included if the {@linkcode Pokemon} was
|
||||||
* in the starting party of the run and if Fresh Start is not active.
|
* in the starting party of the run and if Fresh Start is not active.
|
||||||
* @returns an array of {@linkcode Moves}, the length of which is determined
|
* @returns an array of {@linkcode MoveId}, the length of which is determined
|
||||||
* by how many learnable moves there are for the {@linkcode Pokemon}.
|
* by how many learnable moves there are for the {@linkcode Pokemon}.
|
||||||
*/
|
*/
|
||||||
public getLearnableLevelMoves(): Moves[] {
|
public getLearnableLevelMoves(): MoveId[] {
|
||||||
let levelMoves = this.getLevelMoves(1, true, false, true).map(lm => lm[1]);
|
let levelMoves = this.getLevelMoves(1, true, false, true).map(lm => lm[1]);
|
||||||
if (this.metBiome === -1 && !globalScene.gameMode.isFreshStartChallenge() && !globalScene.gameMode.isDaily) {
|
if (this.metBiome === -1 && !globalScene.gameMode.isFreshStartChallenge() && !globalScene.gameMode.isDaily) {
|
||||||
levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
|
levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
|
||||||
@ -2071,7 +2071,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
return allAbilities[this.customPokemonData.ability];
|
return allAbilities[this.customPokemonData.ability];
|
||||||
}
|
}
|
||||||
let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex);
|
let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex);
|
||||||
if (abilityId === Abilities.NONE) {
|
if (abilityId === AbilityId.NONE) {
|
||||||
abilityId = this.species.ability1;
|
abilityId = this.species.ability1;
|
||||||
}
|
}
|
||||||
return allAbilities[abilityId];
|
return allAbilities[abilityId];
|
||||||
@ -2165,9 +2165,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
((Overrides.PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || Overrides.HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
((Overrides.PASSIVE_ABILITY_OVERRIDE !== AbilityId.NONE || Overrides.HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
||||||
this.isPlayer()) ||
|
this.isPlayer()) ||
|
||||||
((Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
((Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== AbilityId.NONE || Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
||||||
!this.isPlayer())
|
!this.isPlayer())
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
@ -2238,7 +2238,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
* @param ignoreOverride Whether to ignore ability changing effects; default `false`
|
* @param ignoreOverride Whether to ignore ability changing effects; default `false`
|
||||||
* @returns `true` if the ability is present and active
|
* @returns `true` if the ability is present and active
|
||||||
*/
|
*/
|
||||||
public hasAbility(ability: Abilities, canApply = true, ignoreOverride = false): boolean {
|
public hasAbility(ability: AbilityId, canApply = true, ignoreOverride = false): boolean {
|
||||||
if (this.getAbility(ignoreOverride).id === ability && (!canApply || this.canApplyAbility())) {
|
if (this.getAbility(ignoreOverride).id === ability && (!canApply || this.canApplyAbility())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2291,11 +2291,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
* @returns the pokemon's current tera {@linkcode PokemonType}
|
* @returns the pokemon's current tera {@linkcode PokemonType}
|
||||||
*/
|
*/
|
||||||
getTeraType(): PokemonType {
|
getTeraType(): PokemonType {
|
||||||
if (this.hasSpecies(Species.TERAPAGOS)) {
|
if (this.hasSpecies(SpeciesId.TERAPAGOS)) {
|
||||||
return PokemonType.STELLAR;
|
return PokemonType.STELLAR;
|
||||||
}
|
}
|
||||||
if (this.hasSpecies(Species.OGERPON)) {
|
if (this.hasSpecies(SpeciesId.OGERPON)) {
|
||||||
const ogerponForm = this.species.speciesId === Species.OGERPON ? this.formIndex : this.fusionFormIndex;
|
const ogerponForm = this.species.speciesId === SpeciesId.OGERPON ? this.formIndex : this.fusionFormIndex;
|
||||||
switch (ogerponForm) {
|
switch (ogerponForm) {
|
||||||
case 0:
|
case 0:
|
||||||
case 4:
|
case 4:
|
||||||
@ -2311,7 +2311,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
return PokemonType.ROCK;
|
return PokemonType.ROCK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.hasSpecies(Species.SHEDINJA)) {
|
if (this.hasSpecies(SpeciesId.SHEDINJA)) {
|
||||||
return PokemonType.BUG;
|
return PokemonType.BUG;
|
||||||
}
|
}
|
||||||
return this.teraType;
|
return this.teraType;
|
||||||
@ -2321,7 +2321,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
return (
|
return (
|
||||||
!!this.getTag(GroundedTag) ||
|
!!this.getTag(GroundedTag) ||
|
||||||
(!this.isOfType(PokemonType.FLYING, true, true) &&
|
(!this.isOfType(PokemonType.FLYING, true, true) &&
|
||||||
!this.hasAbility(Abilities.LEVITATE) &&
|
!this.hasAbility(AbilityId.LEVITATE) &&
|
||||||
!this.getTag(BattlerTagType.FLOATING) &&
|
!this.getTag(BattlerTagType.FLOATING) &&
|
||||||
!this.getTag(SemiInvulnerableTag))
|
!this.getTag(SemiInvulnerableTag))
|
||||||
);
|
);
|
||||||
@ -2382,8 +2382,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
// then bypass the check for ion deluge and electrify
|
// then bypass the check for ion deluge and electrify
|
||||||
if (
|
if (
|
||||||
this.isTerastallized &&
|
this.isTerastallized &&
|
||||||
(move.id === Moves.TERA_BLAST ||
|
(move.id === MoveId.TERA_BLAST ||
|
||||||
(move.id === Moves.TERA_STARSTORM && moveTypeHolder.value === PokemonType.STELLAR))
|
(move.id === MoveId.TERA_STARSTORM && moveTypeHolder.value === PokemonType.STELLAR))
|
||||||
) {
|
) {
|
||||||
return moveTypeHolder.value as PokemonType;
|
return moveTypeHolder.value as PokemonType;
|
||||||
}
|
}
|
||||||
@ -2780,7 +2780,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
* @param ret the output array to be pushed into.
|
* @param ret the output array to be pushed into.
|
||||||
*/
|
*/
|
||||||
private getUniqueMoves(levelMoves: LevelMoves, ret: LevelMoves): void {
|
private getUniqueMoves(levelMoves: LevelMoves, ret: LevelMoves): void {
|
||||||
const uniqueMoves: Moves[] = [];
|
const uniqueMoves: MoveId[] = [];
|
||||||
for (const lm of levelMoves) {
|
for (const lm of levelMoves) {
|
||||||
if (!uniqueMoves.find(m => m === lm[1])) {
|
if (!uniqueMoves.find(m => m === lm[1])) {
|
||||||
uniqueMoves.push(lm[1]);
|
uniqueMoves.push(lm[1]);
|
||||||
@ -2794,12 +2794,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
*
|
*
|
||||||
* @returns list of egg moves
|
* @returns list of egg moves
|
||||||
*/
|
*/
|
||||||
getEggMoves(): Moves[] | undefined {
|
getEggMoves(): MoveId[] | undefined {
|
||||||
return speciesEggMoves[this.getSpeciesForm().getRootSpeciesId()];
|
return speciesEggMoves[this.getSpeciesForm().getRootSpeciesId()];
|
||||||
}
|
}
|
||||||
|
|
||||||
setMove(moveIndex: number, moveId: Moves): void {
|
setMove(moveIndex: number, moveId: MoveId): void {
|
||||||
if (moveId === Moves.NONE) {
|
if (moveId === MoveId.NONE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const move = new PokemonMove(moveId);
|
const move = new PokemonMove(moveId);
|
||||||
@ -2822,7 +2822,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
*/
|
*/
|
||||||
trySetShiny(thresholdOverride?: number): boolean {
|
trySetShiny(thresholdOverride?: number): boolean {
|
||||||
// Shiny Pokemon should not spawn in the end biome in endless
|
// Shiny Pokemon should not spawn in the end biome in endless
|
||||||
if (globalScene.gameMode.isEndless && globalScene.arena.biomeType === Biome.END) {
|
if (globalScene.gameMode.isEndless && globalScene.arena.biomeType === BiomeId.END) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2987,7 +2987,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
!species.mythical &&
|
!species.mythical &&
|
||||||
!species.isTrainerForbidden() &&
|
!species.isTrainerForbidden() &&
|
||||||
species.speciesId !== this.species.speciesId &&
|
species.speciesId !== this.species.speciesId &&
|
||||||
species.speciesId !== Species.DITTO
|
species.speciesId !== SpeciesId.DITTO
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3050,7 +3050,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
/** Generates a semi-random moveset for a Pokemon */
|
/** Generates a semi-random moveset for a Pokemon */
|
||||||
public generateAndPopulateMoveset(): void {
|
public generateAndPopulateMoveset(): void {
|
||||||
this.moveset = [];
|
this.moveset = [];
|
||||||
let movePool: [Moves, number][] = [];
|
let movePool: [MoveId, number][] = [];
|
||||||
const allLevelMoves = this.getLevelMoves(1, true, true);
|
const allLevelMoves = this.getLevelMoves(1, true, true);
|
||||||
if (!allLevelMoves) {
|
if (!allLevelMoves) {
|
||||||
console.warn("Error encountered trying to generate moveset for:", this.species.name);
|
console.warn("Error encountered trying to generate moveset for:", this.species.name);
|
||||||
@ -3079,7 +3079,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (this.hasTrainer()) {
|
if (this.hasTrainer()) {
|
||||||
const tms = Object.keys(tmSpecies);
|
const tms = Object.keys(tmSpecies);
|
||||||
for (const tm of tms) {
|
for (const tm of tms) {
|
||||||
const moveId = Number.parseInt(tm) as Moves;
|
const moveId = Number.parseInt(tm) as MoveId;
|
||||||
let compatible = false;
|
let compatible = false;
|
||||||
for (const p of tmSpecies[tm]) {
|
for (const p of tmSpecies[tm]) {
|
||||||
if (Array.isArray(p)) {
|
if (Array.isArray(p)) {
|
||||||
@ -3202,7 +3202,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (this.isBoss()) {
|
if (this.isBoss()) {
|
||||||
weightMultiplier += 0.4;
|
weightMultiplier += 0.4;
|
||||||
}
|
}
|
||||||
const baseWeights: [Moves, number][] = movePool.map(m => [m[0], Math.ceil(Math.pow(m[1], weightMultiplier) * 100)]);
|
const baseWeights: [MoveId, number][] = movePool.map(m => [
|
||||||
|
m[0],
|
||||||
|
Math.ceil(Math.pow(m[1], weightMultiplier) * 100),
|
||||||
|
]);
|
||||||
|
|
||||||
// All Pokemon force a STAB move first
|
// All Pokemon force a STAB move first
|
||||||
const stabMovePool = baseWeights.filter(
|
const stabMovePool = baseWeights.filter(
|
||||||
@ -3656,7 +3659,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (
|
if (
|
||||||
source.isTerastallized &&
|
source.isTerastallized &&
|
||||||
source.getTeraType() === PokemonType.STELLAR &&
|
source.getTeraType() === PokemonType.STELLAR &&
|
||||||
(!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))
|
(!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(SpeciesId.TERAPAGOS))
|
||||||
) {
|
) {
|
||||||
stabMultiplier.value += matchesSourceType ? 0.5 : 0.2;
|
stabMultiplier.value += matchesSourceType ? 0.5 : 0.2;
|
||||||
}
|
}
|
||||||
@ -3724,7 +3727,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (cancelled.value || isTypeImmune) {
|
if (cancelled.value || isTypeImmune) {
|
||||||
return {
|
return {
|
||||||
cancelled: cancelled.value,
|
cancelled: cancelled.value,
|
||||||
result: move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT,
|
result: move.id === MoveId.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT,
|
||||||
damage: 0,
|
damage: 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -4131,7 +4134,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
return !cancelled.value;
|
return !cancelled.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
addTag(tagType: BattlerTagType, turnCount = 0, sourceMove?: Moves, sourceId?: number): boolean {
|
addTag(tagType: BattlerTagType, turnCount = 0, sourceMove?: MoveId, sourceId?: number): boolean {
|
||||||
const existingTag = this.getTag(tagType);
|
const existingTag = this.getTag(tagType);
|
||||||
if (existingTag) {
|
if (existingTag) {
|
||||||
existingTag.onOverlap(this);
|
existingTag.onOverlap(this);
|
||||||
@ -4281,7 +4284,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (
|
if (
|
||||||
!tag.isBatonPassable ||
|
!tag.isBatonPassable ||
|
||||||
(tag.tagType === BattlerTagType.TELEKINESIS &&
|
(tag.tagType === BattlerTagType.TELEKINESIS &&
|
||||||
this.species.speciesId === Species.GENGAR &&
|
this.species.speciesId === SpeciesId.GENGAR &&
|
||||||
this.getFormKey() === "mega")
|
this.getFormKey() === "mega")
|
||||||
) {
|
) {
|
||||||
continue;
|
continue;
|
||||||
@ -4300,19 +4303,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
/**
|
/**
|
||||||
* Gets whether the given move is currently disabled for this Pokemon.
|
* Gets whether the given move is currently disabled for this Pokemon.
|
||||||
*
|
*
|
||||||
* @param moveId - The {@linkcode Moves} ID of the move to check
|
* @param moveId - The {@linkcode MoveId} ID of the move to check
|
||||||
* @returns `true` if the move is disabled for this Pokemon, otherwise `false`
|
* @returns `true` if the move is disabled for this Pokemon, otherwise `false`
|
||||||
*
|
*
|
||||||
* @see {@linkcode MoveRestrictionBattlerTag}
|
* @see {@linkcode MoveRestrictionBattlerTag}
|
||||||
*/
|
*/
|
||||||
public isMoveRestricted(moveId: Moves, pokemon?: Pokemon): boolean {
|
public isMoveRestricted(moveId: MoveId, pokemon?: Pokemon): boolean {
|
||||||
return this.getRestrictingTag(moveId, pokemon) !== null;
|
return this.getRestrictingTag(moveId, pokemon) !== null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets whether the given move is currently disabled for the user based on the player's target selection
|
* Gets whether the given move is currently disabled for the user based on the player's target selection
|
||||||
*
|
*
|
||||||
* @param moveId - The {@linkcode Moves} ID of the move to check
|
* @param moveId - The {@linkcode MoveId} ID of the move to check
|
||||||
* @param user - The move user
|
* @param user - The move user
|
||||||
* @param target - The target of the move
|
* @param target - The target of the move
|
||||||
*
|
*
|
||||||
@ -4320,7 +4323,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
*
|
*
|
||||||
* @see {@linkcode MoveRestrictionBattlerTag}
|
* @see {@linkcode MoveRestrictionBattlerTag}
|
||||||
*/
|
*/
|
||||||
isMoveTargetRestricted(moveId: Moves, user: Pokemon, target: Pokemon): boolean {
|
isMoveTargetRestricted(moveId: MoveId, user: Pokemon, target: Pokemon): boolean {
|
||||||
for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) {
|
for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) {
|
||||||
if ((tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) {
|
if ((tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) {
|
||||||
return (tag as MoveRestrictionBattlerTag) !== null;
|
return (tag as MoveRestrictionBattlerTag) !== null;
|
||||||
@ -4332,12 +4335,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
/**
|
/**
|
||||||
* 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 moveId - {@linkcode Moves} ID of the move to check
|
* @param moveId - {@linkcode MoveId} ID of the move to check
|
||||||
* @param user - {@linkcode Pokemon} the move user, optional and used when the target is a factor in the move's restricted status
|
* @param user - {@linkcode Pokemon} the move user, optional and used when the target is a factor in the move's restricted status
|
||||||
* @param target - {@linkcode Pokemon} the target of the move, optional and used when the target is a factor in the move's restricted status
|
* @param target - {@linkcode Pokemon} the target of the move, optional and used when the target is a factor in the move's restricted status
|
||||||
* @returns The first tag on this Pokemon that restricts the move, or `null` if the move is not restricted.
|
* @returns The first tag on this Pokemon that restricts the move, or `null` if the move is not restricted.
|
||||||
*/
|
*/
|
||||||
getRestrictingTag(moveId: Moves, user?: Pokemon, target?: Pokemon): MoveRestrictionBattlerTag | null {
|
getRestrictingTag(moveId: MoveId, 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, user)) {
|
if ((tag as MoveRestrictionBattlerTag).isMoveRestricted(moveId, user)) {
|
||||||
return tag as MoveRestrictionBattlerTag;
|
return tag as MoveRestrictionBattlerTag;
|
||||||
@ -4899,7 +4902,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (
|
if (
|
||||||
this.hasAbilityWithAttr(CommanderAbAttr) &&
|
this.hasAbilityWithAttr(CommanderAbAttr) &&
|
||||||
globalScene.currentBattle.double &&
|
globalScene.currentBattle.double &&
|
||||||
this.getAlly()?.species.speciesId === Species.DONDOZO
|
this.getAlly()?.species.speciesId === SpeciesId.DONDOZO
|
||||||
) {
|
) {
|
||||||
this.setVisible(false);
|
this.setVisible(false);
|
||||||
}
|
}
|
||||||
@ -5509,7 +5512,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
|
|
||||||
export class PlayerPokemon extends Pokemon {
|
export class PlayerPokemon extends Pokemon {
|
||||||
protected battleInfo: PlayerBattleInfo;
|
protected battleInfo: PlayerBattleInfo;
|
||||||
public compatibleTms: Moves[];
|
public compatibleTms: MoveId[];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
species: PokemonSpecies,
|
species: PokemonSpecies,
|
||||||
@ -5580,7 +5583,7 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
|
|
||||||
const tms = Object.keys(tmSpecies);
|
const tms = Object.keys(tmSpecies);
|
||||||
for (const tm of tms) {
|
for (const tm of tms) {
|
||||||
const moveId = Number.parseInt(tm) as Moves;
|
const moveId = Number.parseInt(tm) as MoveId;
|
||||||
let compatible = false;
|
let compatible = false;
|
||||||
for (const p of tmSpecies[tm]) {
|
for (const p of tmSpecies[tm]) {
|
||||||
if (Array.isArray(p)) {
|
if (Array.isArray(p)) {
|
||||||
@ -5677,7 +5680,7 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
}
|
}
|
||||||
// Add to candy progress for this mon's starter species and its fused species (if it has one)
|
// Add to candy progress for this mon's starter species and its fused species (if it has one)
|
||||||
starterData.forEach((sd: StarterDataEntry, i: number) => {
|
starterData.forEach((sd: StarterDataEntry, i: number) => {
|
||||||
const speciesId = !i ? starterSpeciesId : (fusionStarterSpeciesId as Species);
|
const speciesId = !i ? starterSpeciesId : (fusionStarterSpeciesId as SpeciesId);
|
||||||
sd.friendship = (sd.friendship || 0) + starterAmount.value;
|
sd.friendship = (sd.friendship || 0) + starterAmount.value;
|
||||||
if (sd.friendship >= getStarterValueFriendshipCap(speciesStarterCosts[speciesId])) {
|
if (sd.friendship >= getStarterValueFriendshipCap(speciesStarterCosts[speciesId])) {
|
||||||
globalScene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1);
|
globalScene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1);
|
||||||
@ -5812,7 +5815,7 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
this.updateInfo(true).then(() => resolve());
|
this.updateInfo(true).then(() => resolve());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
if (preEvolution.speciesId === Species.GIMMIGHOUL) {
|
if (preEvolution.speciesId === SpeciesId.GIMMIGHOUL) {
|
||||||
const evotracker = this.getHeldItems().filter(m => m instanceof EvoTrackerModifier)[0] ?? null;
|
const evotracker = this.getHeldItems().filter(m => m instanceof EvoTrackerModifier)[0] ?? null;
|
||||||
if (evotracker) {
|
if (evotracker) {
|
||||||
globalScene.removeModifier(evotracker);
|
globalScene.removeModifier(evotracker);
|
||||||
@ -5832,7 +5835,7 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
const isFusion = evolution instanceof FusionSpeciesFormEvolution;
|
const isFusion = evolution instanceof FusionSpeciesFormEvolution;
|
||||||
|
|
||||||
const evoSpecies = !isFusion ? this.species : this.fusionSpecies;
|
const evoSpecies = !isFusion ? this.species : this.fusionSpecies;
|
||||||
if (evoSpecies?.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) {
|
if (evoSpecies?.speciesId === SpeciesId.NINCADA && evolution.speciesId === SpeciesId.NINJASK) {
|
||||||
const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1];
|
const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1];
|
||||||
|
|
||||||
if (newEvolution.condition?.predicate(this)) {
|
if (newEvolution.condition?.predicate(this)) {
|
||||||
@ -6108,7 +6111,7 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
|
|
||||||
this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0);
|
this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0);
|
||||||
|
|
||||||
let prevolution: Species;
|
let prevolution: SpeciesId;
|
||||||
let speciesId = species.speciesId;
|
let speciesId = species.speciesId;
|
||||||
while ((prevolution = pokemonPrevolutions[speciesId])) {
|
while ((prevolution = pokemonPrevolutions[speciesId])) {
|
||||||
const evolution = pokemonEvolutions[prevolution].find(
|
const evolution = pokemonEvolutions[prevolution].find(
|
||||||
@ -6164,30 +6167,30 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
|
|
||||||
generateAndPopulateMoveset(formIndex?: number): void {
|
generateAndPopulateMoveset(formIndex?: number): void {
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case this.species.speciesId === Species.SMEARGLE:
|
case this.species.speciesId === SpeciesId.SMEARGLE:
|
||||||
this.moveset = [
|
this.moveset = [
|
||||||
new PokemonMove(Moves.SKETCH),
|
new PokemonMove(MoveId.SKETCH),
|
||||||
new PokemonMove(Moves.SKETCH),
|
new PokemonMove(MoveId.SKETCH),
|
||||||
new PokemonMove(Moves.SKETCH),
|
new PokemonMove(MoveId.SKETCH),
|
||||||
new PokemonMove(Moves.SKETCH),
|
new PokemonMove(MoveId.SKETCH),
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case this.species.speciesId === Species.ETERNATUS:
|
case this.species.speciesId === SpeciesId.ETERNATUS:
|
||||||
this.moveset = (formIndex !== undefined ? formIndex : this.formIndex)
|
this.moveset = (formIndex !== undefined ? formIndex : this.formIndex)
|
||||||
? [
|
? [
|
||||||
new PokemonMove(Moves.DYNAMAX_CANNON),
|
new PokemonMove(MoveId.DYNAMAX_CANNON),
|
||||||
new PokemonMove(Moves.CROSS_POISON),
|
new PokemonMove(MoveId.CROSS_POISON),
|
||||||
new PokemonMove(Moves.FLAMETHROWER),
|
new PokemonMove(MoveId.FLAMETHROWER),
|
||||||
new PokemonMove(Moves.RECOVER, 0, -4),
|
new PokemonMove(MoveId.RECOVER, 0, -4),
|
||||||
]
|
]
|
||||||
: [
|
: [
|
||||||
new PokemonMove(Moves.ETERNABEAM),
|
new PokemonMove(MoveId.ETERNABEAM),
|
||||||
new PokemonMove(Moves.SLUDGE_BOMB),
|
new PokemonMove(MoveId.SLUDGE_BOMB),
|
||||||
new PokemonMove(Moves.FLAMETHROWER),
|
new PokemonMove(MoveId.FLAMETHROWER),
|
||||||
new PokemonMove(Moves.COSMIC_POWER),
|
new PokemonMove(MoveId.COSMIC_POWER),
|
||||||
];
|
];
|
||||||
if (globalScene.gameMode.hasChallenge(Challenges.INVERSE_BATTLE)) {
|
if (globalScene.gameMode.hasChallenge(Challenges.INVERSE_BATTLE)) {
|
||||||
this.moveset[2] = new PokemonMove(Moves.THUNDERBOLT);
|
this.moveset[2] = new PokemonMove(MoveId.THUNDERBOLT);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -6273,7 +6276,7 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
moveTargets.some(p => {
|
moveTargets.some(p => {
|
||||||
const doesNotFail =
|
const doesNotFail =
|
||||||
move.applyConditions(this, p, move) ||
|
move.applyConditions(this, p, move) ||
|
||||||
[Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id);
|
[MoveId.SUCKER_PUNCH, MoveId.UPPER_HAND, MoveId.THUNDERCLAP].includes(move.id);
|
||||||
return (
|
return (
|
||||||
doesNotFail &&
|
doesNotFail &&
|
||||||
p.getAttackDamage({
|
p.getAttackDamage({
|
||||||
@ -6332,7 +6335,7 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
*/
|
*/
|
||||||
if (
|
if (
|
||||||
(move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) &&
|
(move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) &&
|
||||||
![Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id)
|
![MoveId.SUCKER_PUNCH, MoveId.UPPER_HAND, MoveId.THUNDERCLAP].includes(move.id)
|
||||||
) {
|
) {
|
||||||
targetScore = -20;
|
targetScore = -20;
|
||||||
} else if (move instanceof AttackMove) {
|
} else if (move instanceof AttackMove) {
|
||||||
@ -6417,17 +6420,17 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
move: Moves.STRUGGLE,
|
move: MoveId.STRUGGLE,
|
||||||
targets: this.getNextTargets(Moves.STRUGGLE),
|
targets: this.getNextTargets(MoveId.STRUGGLE),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the Pokemon the given move would target if used by this Pokemon
|
* Determines the Pokemon the given move would target if used by this Pokemon
|
||||||
* @param moveId {@linkcode Moves} The move to be used
|
* @param moveId {@linkcode MoveId} The move to be used
|
||||||
* @returns The indexes of the Pokemon the given move would target
|
* @returns The indexes of the Pokemon the given move would target
|
||||||
*/
|
*/
|
||||||
getNextTargets(moveId: Moves): BattlerIndex[] {
|
getNextTargets(moveId: MoveId): BattlerIndex[] {
|
||||||
const moveTargets = getMoveTargets(this, moveId);
|
const moveTargets = getMoveTargets(this, moveId);
|
||||||
const targets = globalScene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1);
|
const targets = globalScene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1);
|
||||||
// If the move is multi-target, return all targets' indexes
|
// If the move is multi-target, return all targets' indexes
|
||||||
@ -6702,7 +6705,6 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show or hide the type effectiveness multiplier window
|
* Show or hide the type effectiveness multiplier window
|
||||||
* Passing undefined will hide the window
|
* Passing undefined will hide the window
|
||||||
@ -6735,7 +6737,7 @@ interface IllusionData {
|
|||||||
fusionVariant: Variant;
|
fusionVariant: Variant;
|
||||||
};
|
};
|
||||||
/** The species of the illusion */
|
/** The species of the illusion */
|
||||||
species: Species;
|
species: SpeciesId;
|
||||||
/** The formIndex of the illusion */
|
/** The formIndex of the illusion */
|
||||||
formIndex: number;
|
formIndex: number;
|
||||||
/** The gender of the illusion */
|
/** The gender of the illusion */
|
||||||
@ -6753,7 +6755,7 @@ interface IllusionData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface TurnMove {
|
export interface TurnMove {
|
||||||
move: Moves;
|
move: MoveId;
|
||||||
targets: BattlerIndex[];
|
targets: BattlerIndex[];
|
||||||
result?: MoveResult;
|
result?: MoveResult;
|
||||||
virtual?: boolean;
|
virtual?: boolean;
|
||||||
@ -6762,7 +6764,7 @@ export interface TurnMove {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface AttackMoveResult {
|
export interface AttackMoveResult {
|
||||||
move: Moves;
|
move: MoveId;
|
||||||
result: DamageResult;
|
result: DamageResult;
|
||||||
damage: number;
|
damage: number;
|
||||||
critical: boolean;
|
critical: boolean;
|
||||||
@ -6785,8 +6787,8 @@ export class PokemonSummonData {
|
|||||||
// TODO: Move these into a separate class & add rage fist hit count
|
// TODO: Move these into a separate class & add rage fist hit count
|
||||||
public speciesForm: PokemonSpeciesForm | null = null;
|
public speciesForm: PokemonSpeciesForm | null = null;
|
||||||
public fusionSpeciesForm: PokemonSpeciesForm | null = null;
|
public fusionSpeciesForm: PokemonSpeciesForm | null = null;
|
||||||
public ability: Abilities | undefined;
|
public ability: AbilityId | undefined;
|
||||||
public passiveAbility: Abilities | undefined;
|
public passiveAbility: AbilityId | undefined;
|
||||||
public gender: Gender | undefined;
|
public gender: Gender | undefined;
|
||||||
public fusionGender: Gender | undefined;
|
public fusionGender: Gender | undefined;
|
||||||
public stats: number[] = [0, 0, 0, 0, 0, 0];
|
public stats: number[] = [0, 0, 0, 0, 0, 0];
|
||||||
@ -6800,7 +6802,7 @@ export class PokemonSummonData {
|
|||||||
public illusion: IllusionData | null = null;
|
public illusion: IllusionData | null = null;
|
||||||
public illusionBroken = false;
|
public illusionBroken = false;
|
||||||
|
|
||||||
/** Array containing all berries eaten in the last turn; used by {@linkcode Abilities.CUD_CHEW} */
|
/** Array containing all berries eaten in the last turn; used by {@linkcode AbilityId.CUD_CHEW} */
|
||||||
public berriesEatenLast: BerryType[] = [];
|
public berriesEatenLast: BerryType[] = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -6849,7 +6851,7 @@ export class PokemonTempSummonData {
|
|||||||
* Reset on switch and new wave, but not stored in `SummonData` to avoid being written to the save file.
|
* Reset on switch and new wave, but not stored in `SummonData` to avoid being written to the save file.
|
||||||
|
|
||||||
* Used to evaluate "first turn only" conditions such as
|
* Used to evaluate "first turn only" conditions such as
|
||||||
* {@linkcode Moves.FAKE_OUT | Fake Out} and {@linkcode Moves.FIRST_IMPRESSION | First Impression}).
|
* {@linkcode MoveId.FAKE_OUT | Fake Out} and {@linkcode MoveId.FIRST_IMPRESSION | First Impression}).
|
||||||
*/
|
*/
|
||||||
waveTurnCount = 1;
|
waveTurnCount = 1;
|
||||||
}
|
}
|
||||||
@ -6859,11 +6861,11 @@ export class PokemonTempSummonData {
|
|||||||
* Resets at the start of a new battle (but not on switch).
|
* Resets at the start of a new battle (but not on switch).
|
||||||
*/
|
*/
|
||||||
export class PokemonBattleData {
|
export class PokemonBattleData {
|
||||||
/** Counter tracking direct hits this Pokemon has received during this battle; used for {@linkcode Moves.RAGE_FIST} */
|
/** Counter tracking direct hits this Pokemon has received during this battle; used for {@linkcode MoveId.RAGE_FIST} */
|
||||||
public hitCount = 0;
|
public hitCount = 0;
|
||||||
/** Whether this Pokemon has eaten a berry this battle; used for {@linkcode Moves.BELCH} */
|
/** Whether this Pokemon has eaten a berry this battle; used for {@linkcode MoveId.BELCH} */
|
||||||
public hasEatenBerry = false;
|
public hasEatenBerry = false;
|
||||||
/** Array containing all berries eaten and not yet recovered during this current battle; used by {@linkcode Abilities.HARVEST} */
|
/** Array containing all berries eaten and not yet recovered during this current battle; used by {@linkcode AbilityId.HARVEST} */
|
||||||
public berriesEaten: BerryType[] = [];
|
public berriesEaten: BerryType[] = [];
|
||||||
|
|
||||||
constructor(source?: PokemonBattleData | Partial<PokemonBattleData>) {
|
constructor(source?: PokemonBattleData | Partial<PokemonBattleData>) {
|
||||||
@ -6886,7 +6888,7 @@ export class PokemonWaveData {
|
|||||||
* A set of all the abilities this {@linkcode Pokemon} has used in this wave.
|
* A set of all the abilities this {@linkcode Pokemon} has used in this wave.
|
||||||
* Used to track once per battle conditions, as well as (hopefully) by the updated AI for move effectiveness.
|
* Used to track once per battle conditions, as well as (hopefully) by the updated AI for move effectiveness.
|
||||||
*/
|
*/
|
||||||
public abilitiesApplied: Set<Abilities> = new Set<Abilities>();
|
public abilitiesApplied: Set<AbilityId> = new Set<AbilityId>();
|
||||||
/** Whether the pokemon's ability has been revealed or not */
|
/** Whether the pokemon's ability has been revealed or not */
|
||||||
public abilityRevealed = false;
|
public abilityRevealed = false;
|
||||||
}
|
}
|
||||||
@ -6913,7 +6915,7 @@ export class PokemonTurnData {
|
|||||||
public statStagesIncreased = false;
|
public statStagesIncreased = false;
|
||||||
public statStagesDecreased = false;
|
public statStagesDecreased = false;
|
||||||
public moveEffectiveness: TypeDamageMultiplier | null = null;
|
public moveEffectiveness: TypeDamageMultiplier | null = null;
|
||||||
public combiningPledge?: Moves;
|
public combiningPledge?: MoveId;
|
||||||
public switchedInThisTurn = false;
|
public switchedInThisTurn = false;
|
||||||
public failedRunAway = false;
|
public failedRunAway = false;
|
||||||
public joinedRound = false;
|
public joinedRound = false;
|
||||||
@ -6924,7 +6926,7 @@ export class PokemonTurnData {
|
|||||||
public extraTurns = 0;
|
public extraTurns = 0;
|
||||||
/**
|
/**
|
||||||
* All berries eaten by this pokemon in this turn.
|
* All berries eaten by this pokemon in this turn.
|
||||||
* Saved into {@linkcode PokemonSummonData | SummonData} by {@linkcode Abilities.CUD_CHEW} on turn end.
|
* Saved into {@linkcode PokemonSummonData | SummonData} by {@linkcode AbilityId.CUD_CHEW} on turn end.
|
||||||
* @see {@linkcode PokemonSummonData.berriesEatenLast}
|
* @see {@linkcode PokemonSummonData.berriesEatenLast}
|
||||||
*/
|
*/
|
||||||
public berriesEaten: BerryType[] = [];
|
public berriesEaten: BerryType[] = [];
|
||||||
@ -6993,7 +6995,7 @@ export interface DamageCalculationResult {
|
|||||||
* @see {@linkcode getName} - returns name of {@linkcode Move}.
|
* @see {@linkcode getName} - returns name of {@linkcode Move}.
|
||||||
**/
|
**/
|
||||||
export class PokemonMove {
|
export class PokemonMove {
|
||||||
public moveId: Moves;
|
public moveId: MoveId;
|
||||||
public ppUsed: number;
|
public ppUsed: number;
|
||||||
public ppUp: number;
|
public ppUp: number;
|
||||||
public virtual: boolean;
|
public virtual: boolean;
|
||||||
@ -7004,7 +7006,7 @@ export class PokemonMove {
|
|||||||
*/
|
*/
|
||||||
public maxPpOverride?: number;
|
public maxPpOverride?: number;
|
||||||
|
|
||||||
constructor(moveId: Moves, ppUsed = 0, ppUp = 0, virtual = false, maxPpOverride?: number) {
|
constructor(moveId: MoveId, ppUsed = 0, ppUp = 0, virtual = false, maxPpOverride?: number) {
|
||||||
this.moveId = moveId;
|
this.moveId = moveId;
|
||||||
this.ppUsed = ppUsed;
|
this.ppUsed = ppUsed;
|
||||||
this.ppUp = ppUp;
|
this.ppUp = ppUp;
|
||||||
|
@ -17,7 +17,7 @@ import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag";
|
|||||||
import { getIsInitialized, initI18n } from "#app/plugins/i18n";
|
import { getIsInitialized, initI18n } from "#app/plugins/i18n";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { PartyMemberStrength } from "#enums/party-member-strength";
|
import { PartyMemberStrength } from "#enums/party-member-strength";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import { signatureSpecies } from "#app/data/balance/signature-species";
|
import { signatureSpecies } from "#app/data/balance/signature-species";
|
||||||
|
|
||||||
@ -358,7 +358,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create an empty species pool (which will be set to one of the species pools based on the index)
|
// Create an empty species pool (which will be set to one of the species pools based on the index)
|
||||||
let newSpeciesPool: Species[] = [];
|
let newSpeciesPool: SpeciesId[] = [];
|
||||||
let useNewSpeciesPool = false;
|
let useNewSpeciesPool = false;
|
||||||
|
|
||||||
// If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer)
|
// If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer)
|
||||||
@ -399,9 +399,9 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
|||||||
if (!(index % 2)) {
|
if (!(index % 2)) {
|
||||||
// Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza
|
// Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza
|
||||||
if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.TATE]) {
|
if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.TATE]) {
|
||||||
newSpeciesPool = [Species.SOLROCK];
|
newSpeciesPool = [SpeciesId.SOLROCK];
|
||||||
} else if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.LIZA]) {
|
} else if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.LIZA]) {
|
||||||
newSpeciesPool = [Species.LUNATONE];
|
newSpeciesPool = [SpeciesId.LUNATONE];
|
||||||
} else {
|
} else {
|
||||||
newSpeciesPool = speciesPoolFiltered;
|
newSpeciesPool = speciesPoolFiltered;
|
||||||
}
|
}
|
||||||
@ -409,9 +409,9 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
|||||||
// If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle)
|
// If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle)
|
||||||
// Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza
|
// Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza
|
||||||
if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.TATE]) {
|
if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.TATE]) {
|
||||||
newSpeciesPool = [Species.SOLROCK];
|
newSpeciesPool = [SpeciesId.SOLROCK];
|
||||||
} else if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.LIZA]) {
|
} else if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.LIZA]) {
|
||||||
newSpeciesPool = [Species.LUNATONE];
|
newSpeciesPool = [SpeciesId.LUNATONE];
|
||||||
} else {
|
} else {
|
||||||
newSpeciesPool = speciesPoolPartnerFiltered;
|
newSpeciesPool = speciesPoolPartnerFiltered;
|
||||||
}
|
}
|
||||||
@ -542,10 +542,10 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the enemy trainer already has the Pokemon species in their party
|
* Checks if the enemy trainer already has the Pokemon species in their party
|
||||||
* @param baseSpecies - The base {@linkcode Species} of the current Pokemon
|
* @param baseSpecies - The base {@linkcode SpeciesId} of the current Pokemon
|
||||||
* @returns `true` if the species is already present in the party
|
* @returns `true` if the species is already present in the party
|
||||||
*/
|
*/
|
||||||
checkDuplicateSpecies(baseSpecies: Species): boolean {
|
checkDuplicateSpecies(baseSpecies: SpeciesId): boolean {
|
||||||
const staticSpecies = (signatureSpecies[TrainerType[this.config.trainerType]] ?? []).flat(1).map(s => {
|
const staticSpecies = (signatureSpecies[TrainerType[this.config.trainerType]] ?? []).flat(1).map(s => {
|
||||||
let root = s;
|
let root = s;
|
||||||
while (pokemonPrevolutions.hasOwnProperty(root)) {
|
while (pokemonPrevolutions.hasOwnProperty(root)) {
|
||||||
|
@ -8,8 +8,8 @@ import { allSpecies } from "./data/pokemon-species";
|
|||||||
import type { Arena } from "./field/arena";
|
import type { Arena } from "./field/arena";
|
||||||
import Overrides from "#app/overrides";
|
import Overrides from "#app/overrides";
|
||||||
import { isNullOrUndefined, randSeedInt, randSeedItem } from "#app/utils/common";
|
import { isNullOrUndefined, randSeedInt, randSeedItem } from "#app/utils/common";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { Challenges } from "./enums/challenges";
|
import { Challenges } from "./enums/challenges";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { getDailyStartingBiome } from "./data/daily-run";
|
import { getDailyStartingBiome } from "./data/daily-run";
|
||||||
@ -128,7 +128,7 @@ export class GameMode implements GameModeConfig {
|
|||||||
* - random biome for Daily mode
|
* - random biome for Daily mode
|
||||||
* - Town
|
* - Town
|
||||||
*/
|
*/
|
||||||
getStartingBiome(): Biome {
|
getStartingBiome(): BiomeId {
|
||||||
if (!isNullOrUndefined(Overrides.STARTING_BIOME_OVERRIDE)) {
|
if (!isNullOrUndefined(Overrides.STARTING_BIOME_OVERRIDE)) {
|
||||||
return Overrides.STARTING_BIOME_OVERRIDE;
|
return Overrides.STARTING_BIOME_OVERRIDE;
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ export class GameMode implements GameModeConfig {
|
|||||||
case GameModes.DAILY:
|
case GameModes.DAILY:
|
||||||
return getDailyStartingBiome();
|
return getDailyStartingBiome();
|
||||||
default:
|
default:
|
||||||
return Biome.TOWN;
|
return BiomeId.TOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,14 +202,14 @@ export class GameMode implements GameModeConfig {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
isTrainerBoss(waveIndex: number, biomeType: Biome, offsetGym: boolean): boolean {
|
isTrainerBoss(waveIndex: number, biomeType: BiomeId, offsetGym: boolean): boolean {
|
||||||
switch (this.modeId) {
|
switch (this.modeId) {
|
||||||
case GameModes.DAILY:
|
case GameModes.DAILY:
|
||||||
return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10);
|
return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10);
|
||||||
default:
|
default:
|
||||||
return (
|
return (
|
||||||
waveIndex % 30 === (offsetGym ? 0 : 20) &&
|
waveIndex % 30 === (offsetGym ? 0 : 20) &&
|
||||||
(biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex))
|
(biomeType !== BiomeId.END || this.isClassic || this.isWaveFinal(waveIndex))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -220,8 +220,8 @@ export class GameMode implements GameModeConfig {
|
|||||||
s =>
|
s =>
|
||||||
(s.subLegendary || s.legendary || s.mythical) &&
|
(s.subLegendary || s.legendary || s.mythical) &&
|
||||||
s.baseTotal >= 600 &&
|
s.baseTotal >= 600 &&
|
||||||
s.speciesId !== Species.ETERNATUS &&
|
s.speciesId !== SpeciesId.ETERNATUS &&
|
||||||
s.speciesId !== Species.ARCEUS,
|
s.speciesId !== SpeciesId.ARCEUS,
|
||||||
);
|
);
|
||||||
return randSeedItem(allFinalBossSpecies);
|
return randSeedItem(allFinalBossSpecies);
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ import { initChallenges } from "#app/data/challenge";
|
|||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { initStatsKeys } from "#app/ui/game-stats-ui-handler";
|
import { initStatsKeys } from "#app/ui/game-stats-ui-handler";
|
||||||
import { initVouchers } from "#app/system/voucher";
|
import { initVouchers } from "#app/system/voucher";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters";
|
import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters";
|
||||||
import { timedEventManager } from "./global-event-manager";
|
import { timedEventManager } from "./global-event-manager";
|
||||||
|
|
||||||
@ -177,8 +177,8 @@ export class LoadingScene extends SceneBase {
|
|||||||
|
|
||||||
this.loadImage("default_bg", "arenas");
|
this.loadImage("default_bg", "arenas");
|
||||||
// Load arena images
|
// Load arena images
|
||||||
getEnumValues(Biome).map(bt => {
|
getEnumValues(BiomeId).map(bt => {
|
||||||
const btKey = Biome[bt].toLowerCase();
|
const btKey = BiomeId[bt].toLowerCase();
|
||||||
const isBaseAnimated = btKey === "end";
|
const isBaseAnimated = btKey === "end";
|
||||||
const baseAKey = `${btKey}_a`;
|
const baseAKey = `${btKey}_a`;
|
||||||
const baseBKey = `${btKey}_b`;
|
const baseBKey = `${btKey}_b`;
|
||||||
|
@ -116,13 +116,13 @@ import {
|
|||||||
padInt,
|
padInt,
|
||||||
randSeedInt,
|
randSeedInt,
|
||||||
} from "#app/utils/common";
|
} from "#app/utils/common";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { Nature } from "#enums/nature";
|
import { Nature } from "#enums/nature";
|
||||||
import { PokeballType } from "#enums/pokeball";
|
import { PokeballType } from "#enums/pokeball";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { SpeciesFormKey } from "#enums/species-form-key";
|
import { SpeciesFormKey } from "#enums/species-form-key";
|
||||||
import type { PermanentStat, TempBattleStat } from "#enums/stat";
|
import type { PermanentStat, TempBattleStat } from "#enums/stat";
|
||||||
import { getStatKey, Stat, TEMP_BATTLE_STATS } from "#enums/stat";
|
import { getStatKey, Stat, TEMP_BATTLE_STATS } from "#enums/stat";
|
||||||
@ -430,7 +430,7 @@ export class TerastallizeModifierType extends PokemonModifierType {
|
|||||||
(pokemon: PlayerPokemon) => {
|
(pokemon: PlayerPokemon) => {
|
||||||
if (
|
if (
|
||||||
[pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId].filter(
|
[pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId].filter(
|
||||||
s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA,
|
s => s === SpeciesId.TERAPAGOS || s === SpeciesId.OGERPON || s === SpeciesId.SHEDINJA,
|
||||||
).length > 0
|
).length > 0
|
||||||
) {
|
) {
|
||||||
return PartyUiHandler.NoEffectMessage;
|
return PartyUiHandler.NoEffectMessage;
|
||||||
@ -1165,9 +1165,9 @@ export class PokemonMultiHitModifierType extends PokemonHeldItemModifierType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class TmModifierType extends PokemonModifierType {
|
export class TmModifierType extends PokemonModifierType {
|
||||||
public moveId: Moves;
|
public moveId: MoveId;
|
||||||
|
|
||||||
constructor(moveId: Moves) {
|
constructor(moveId: MoveId) {
|
||||||
super(
|
super(
|
||||||
"",
|
"",
|
||||||
`tm_${PokemonType[allMoves[moveId].type].toLowerCase()}`,
|
`tm_${PokemonType[allMoves[moveId].type].toLowerCase()}`,
|
||||||
@ -1439,37 +1439,37 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
LIGHT_BALL: {
|
LIGHT_BALL: {
|
||||||
stats: [Stat.ATK, Stat.SPATK],
|
stats: [Stat.ATK, Stat.SPATK],
|
||||||
multiplier: 2,
|
multiplier: 2,
|
||||||
species: [Species.PIKACHU],
|
species: [SpeciesId.PIKACHU],
|
||||||
rare: true,
|
rare: true,
|
||||||
},
|
},
|
||||||
THICK_CLUB: {
|
THICK_CLUB: {
|
||||||
stats: [Stat.ATK],
|
stats: [Stat.ATK],
|
||||||
multiplier: 2,
|
multiplier: 2,
|
||||||
species: [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK],
|
species: [SpeciesId.CUBONE, SpeciesId.MAROWAK, SpeciesId.ALOLA_MAROWAK],
|
||||||
rare: true,
|
rare: true,
|
||||||
},
|
},
|
||||||
METAL_POWDER: {
|
METAL_POWDER: {
|
||||||
stats: [Stat.DEF],
|
stats: [Stat.DEF],
|
||||||
multiplier: 2,
|
multiplier: 2,
|
||||||
species: [Species.DITTO],
|
species: [SpeciesId.DITTO],
|
||||||
rare: true,
|
rare: true,
|
||||||
},
|
},
|
||||||
QUICK_POWDER: {
|
QUICK_POWDER: {
|
||||||
stats: [Stat.SPD],
|
stats: [Stat.SPD],
|
||||||
multiplier: 2,
|
multiplier: 2,
|
||||||
species: [Species.DITTO],
|
species: [SpeciesId.DITTO],
|
||||||
rare: true,
|
rare: true,
|
||||||
},
|
},
|
||||||
DEEP_SEA_SCALE: {
|
DEEP_SEA_SCALE: {
|
||||||
stats: [Stat.SPDEF],
|
stats: [Stat.SPDEF],
|
||||||
multiplier: 2,
|
multiplier: 2,
|
||||||
species: [Species.CLAMPERL],
|
species: [SpeciesId.CLAMPERL],
|
||||||
rare: false,
|
rare: false,
|
||||||
},
|
},
|
||||||
DEEP_SEA_TOOTH: {
|
DEEP_SEA_TOOTH: {
|
||||||
stats: [Stat.SPATK],
|
stats: [Stat.SPATK],
|
||||||
multiplier: 2,
|
multiplier: 2,
|
||||||
species: [Species.CLAMPERL],
|
species: [SpeciesId.CLAMPERL],
|
||||||
rare: false,
|
rare: false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -1498,7 +1498,7 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
const speciesId = p.getSpeciesForm(true).speciesId;
|
const speciesId = p.getSpeciesForm(true).speciesId;
|
||||||
const fusionSpeciesId = p.isFusion() ? p.getFusionSpeciesForm(true).speciesId : null;
|
const fusionSpeciesId = p.isFusion() ? p.getFusionSpeciesForm(true).speciesId : null;
|
||||||
// TODO: Use commented boolean when Fling is implemented
|
// TODO: Use commented boolean when Fling is implemented
|
||||||
const hasFling = false; /* p.getMoveset(true).some(m => m.moveId === Moves.FLING) */
|
const hasFling = false; /* p.getMoveset(true).some(m => m.moveId === MoveId.FLING) */
|
||||||
|
|
||||||
for (const i in values) {
|
for (const i in values) {
|
||||||
const checkedSpecies = values[i].species;
|
const checkedSpecies = values[i].species;
|
||||||
@ -1517,7 +1517,7 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
if (checkedSpecies.includes(speciesId) || (!!fusionSpeciesId && checkedSpecies.includes(fusionSpeciesId))) {
|
if (checkedSpecies.includes(speciesId) || (!!fusionSpeciesId && checkedSpecies.includes(fusionSpeciesId))) {
|
||||||
// Add weight if party member has a matching species or, if applicable, a matching fusion species
|
// Add weight if party member has a matching species or, if applicable, a matching fusion species
|
||||||
weights[i]++;
|
weights[i]++;
|
||||||
} else if (checkedSpecies.includes(Species.PIKACHU) && hasFling) {
|
} else if (checkedSpecies.includes(SpeciesId.PIKACHU) && hasFling) {
|
||||||
// Add weight to Light Ball if party member has Fling
|
// Add weight to Light Ball if party member has Fling
|
||||||
weights[i]++;
|
weights[i]++;
|
||||||
}
|
}
|
||||||
@ -1553,8 +1553,8 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
class TmModifierTypeGenerator extends ModifierTypeGenerator {
|
class TmModifierTypeGenerator extends ModifierTypeGenerator {
|
||||||
constructor(tier: ModifierTier) {
|
constructor(tier: ModifierTier) {
|
||||||
super((party: Pokemon[], pregenArgs?: any[]) => {
|
super((party: Pokemon[], pregenArgs?: any[]) => {
|
||||||
if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in Moves) {
|
if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in MoveId) {
|
||||||
return new TmModifierType(pregenArgs[0] as Moves);
|
return new TmModifierType(pregenArgs[0] as MoveId);
|
||||||
}
|
}
|
||||||
const partyMemberCompatibleTms = party.map(p => {
|
const partyMemberCompatibleTms = party.map(p => {
|
||||||
const previousLevelMoves = p.getLearnableLevelMoves();
|
const previousLevelMoves = p.getLearnableLevelMoves();
|
||||||
@ -1588,7 +1588,9 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
.filter(
|
.filter(
|
||||||
p =>
|
p =>
|
||||||
pokemonEvolutions.hasOwnProperty(p.species.speciesId) &&
|
pokemonEvolutions.hasOwnProperty(p.species.speciesId) &&
|
||||||
(!p.pauseEvolutions || p.species.speciesId === Species.SLOWPOKE || p.species.speciesId === Species.EEVEE),
|
(!p.pauseEvolutions ||
|
||||||
|
p.species.speciesId === SpeciesId.SLOWPOKE ||
|
||||||
|
p.species.speciesId === SpeciesId.EEVEE),
|
||||||
)
|
)
|
||||||
.flatMap(p => {
|
.flatMap(p => {
|
||||||
const evolutions = pokemonEvolutions[p.species.speciesId];
|
const evolutions = pokemonEvolutions[p.species.speciesId];
|
||||||
@ -1606,8 +1608,8 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
p.fusionSpecies &&
|
p.fusionSpecies &&
|
||||||
pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId) &&
|
pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId) &&
|
||||||
(!p.pauseEvolutions ||
|
(!p.pauseEvolutions ||
|
||||||
p.fusionSpecies.speciesId === Species.SLOWPOKE ||
|
p.fusionSpecies.speciesId === SpeciesId.SLOWPOKE ||
|
||||||
p.fusionSpecies.speciesId === Species.EEVEE),
|
p.fusionSpecies.speciesId === SpeciesId.EEVEE),
|
||||||
)
|
)
|
||||||
.flatMap(p => {
|
.flatMap(p => {
|
||||||
const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId];
|
const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId];
|
||||||
@ -1671,7 +1673,7 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (p.species.speciesId === Species.NECROZMA) {
|
if (p.species.speciesId === SpeciesId.NECROZMA) {
|
||||||
// technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break...
|
// technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break...
|
||||||
let foundULTRA_Z = false,
|
let foundULTRA_Z = false,
|
||||||
foundN_LUNA = false,
|
foundN_LUNA = false,
|
||||||
@ -1904,7 +1906,7 @@ export type GeneratorModifierOverride = {
|
|||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
name: keyof Pick<typeof modifierTypes, "TM_COMMON" | "TM_GREAT" | "TM_ULTRA">;
|
name: keyof Pick<typeof modifierTypes, "TM_COMMON" | "TM_GREAT" | "TM_ULTRA">;
|
||||||
type?: Moves;
|
type?: MoveId;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1932,7 +1934,7 @@ export const modifierTypes = {
|
|||||||
new PokemonHeldItemModifierType(
|
new PokemonHeldItemModifierType(
|
||||||
"modifierType:ModifierType.EVOLUTION_TRACKER_GIMMIGHOUL",
|
"modifierType:ModifierType.EVOLUTION_TRACKER_GIMMIGHOUL",
|
||||||
"relic_gold",
|
"relic_gold",
|
||||||
(type, args) => new EvoTrackerModifier(type, (args[0] as Pokemon).id, Species.GIMMIGHOUL, 10),
|
(type, args) => new EvoTrackerModifier(type, (args[0] as Pokemon).id, SpeciesId.GIMMIGHOUL, 10),
|
||||||
),
|
),
|
||||||
|
|
||||||
MEGA_BRACELET: () =>
|
MEGA_BRACELET: () =>
|
||||||
@ -2046,7 +2048,9 @@ export const modifierTypes = {
|
|||||||
}
|
}
|
||||||
const teraTypes: PokemonType[] = [];
|
const teraTypes: PokemonType[] = [];
|
||||||
for (const p of party) {
|
for (const p of party) {
|
||||||
if (!(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))) {
|
if (
|
||||||
|
!(p.hasSpecies(SpeciesId.TERAPAGOS) || p.hasSpecies(SpeciesId.OGERPON) || p.hasSpecies(SpeciesId.SHEDINJA))
|
||||||
|
) {
|
||||||
teraTypes.push(p.teraType);
|
teraTypes.push(p.teraType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2125,9 +2129,9 @@ export const modifierTypes = {
|
|||||||
"leek",
|
"leek",
|
||||||
(type, args) =>
|
(type, args) =>
|
||||||
new SpeciesCritBoosterModifier(type, (args[0] as Pokemon).id, 2, [
|
new SpeciesCritBoosterModifier(type, (args[0] as Pokemon).id, 2, [
|
||||||
Species.FARFETCHD,
|
SpeciesId.FARFETCHD,
|
||||||
Species.GALAR_FARFETCHD,
|
SpeciesId.GALAR_FARFETCHD,
|
||||||
Species.SIRFETCHD,
|
SpeciesId.SIRFETCHD,
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -2674,7 +2678,8 @@ const modifierPool: ModifierPool = {
|
|||||||
new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3),
|
new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3),
|
||||||
new WeightedModifierType(modifierTypes.TERA_SHARD, (party: Pokemon[]) =>
|
new WeightedModifierType(modifierTypes.TERA_SHARD, (party: Pokemon[]) =>
|
||||||
party.filter(
|
party.filter(
|
||||||
p => !(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA)),
|
p =>
|
||||||
|
!(p.hasSpecies(SpeciesId.TERAPAGOS) || p.hasSpecies(SpeciesId.OGERPON) || p.hasSpecies(SpeciesId.SHEDINJA)),
|
||||||
).length > 0
|
).length > 0
|
||||||
? 1
|
? 1
|
||||||
: 0,
|
: 0,
|
||||||
@ -2744,7 +2749,7 @@ const modifierPool: ModifierPool = {
|
|||||||
new WeightedModifierType(
|
new WeightedModifierType(
|
||||||
modifierTypes.LEEK,
|
modifierTypes.LEEK,
|
||||||
(party: Pokemon[]) => {
|
(party: Pokemon[]) => {
|
||||||
const checkedSpecies = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD];
|
const checkedSpecies = [SpeciesId.FARFETCHD, SpeciesId.GALAR_FARFETCHD, SpeciesId.SIRFETCHD];
|
||||||
// If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear
|
// If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear
|
||||||
return party.some(
|
return party.some(
|
||||||
p =>
|
p =>
|
||||||
@ -2771,25 +2776,25 @@ const modifierPool: ModifierPool = {
|
|||||||
const canSetStatus = p.canSetStatus(StatusEffect.TOXIC, true, true, null, true);
|
const canSetStatus = p.canSetStatus(StatusEffect.TOXIC, true, true, null, true);
|
||||||
|
|
||||||
// Moves that take advantage of obtaining the actual status effect
|
// Moves that take advantage of obtaining the actual status effect
|
||||||
const hasStatusMoves = [Moves.FACADE, Moves.PSYCHO_SHIFT].some(m => moveset.includes(m));
|
const hasStatusMoves = [MoveId.FACADE, MoveId.PSYCHO_SHIFT].some(m => moveset.includes(m));
|
||||||
// Moves that take advantage of being able to give the target a status orb
|
// Moves that take advantage of being able to give the target a status orb
|
||||||
// TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented
|
// TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented
|
||||||
const hasItemMoves = [
|
const hasItemMoves = [
|
||||||
/* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */
|
/* MoveId.TRICK, MoveId.FLING, MoveId.SWITCHEROO */
|
||||||
].some(m => moveset.includes(m));
|
].some(m => moveset.includes(m));
|
||||||
|
|
||||||
if (canSetStatus) {
|
if (canSetStatus) {
|
||||||
// Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb
|
// Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb
|
||||||
const hasGeneralAbility = [
|
const hasGeneralAbility = [
|
||||||
Abilities.QUICK_FEET,
|
AbilityId.QUICK_FEET,
|
||||||
Abilities.GUTS,
|
AbilityId.GUTS,
|
||||||
Abilities.MARVEL_SCALE,
|
AbilityId.MARVEL_SCALE,
|
||||||
Abilities.MAGIC_GUARD,
|
AbilityId.MAGIC_GUARD,
|
||||||
].some(a => p.hasAbility(a, false, true));
|
].some(a => p.hasAbility(a, false, true));
|
||||||
const hasSpecificAbility = [Abilities.TOXIC_BOOST, Abilities.POISON_HEAL].some(a =>
|
const hasSpecificAbility = [AbilityId.TOXIC_BOOST, AbilityId.POISON_HEAL].some(a =>
|
||||||
p.hasAbility(a, false, true),
|
p.hasAbility(a, false, true),
|
||||||
);
|
);
|
||||||
const hasOppositeAbility = [Abilities.FLARE_BOOST].some(a => p.hasAbility(a, false, true));
|
const hasOppositeAbility = [AbilityId.FLARE_BOOST].some(a => p.hasAbility(a, false, true));
|
||||||
|
|
||||||
return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves;
|
return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves;
|
||||||
}
|
}
|
||||||
@ -2817,23 +2822,23 @@ const modifierPool: ModifierPool = {
|
|||||||
const canSetStatus = p.canSetStatus(StatusEffect.BURN, true, true, null, true);
|
const canSetStatus = p.canSetStatus(StatusEffect.BURN, true, true, null, true);
|
||||||
|
|
||||||
// Moves that take advantage of obtaining the actual status effect
|
// Moves that take advantage of obtaining the actual status effect
|
||||||
const hasStatusMoves = [Moves.FACADE, Moves.PSYCHO_SHIFT].some(m => moveset.includes(m));
|
const hasStatusMoves = [MoveId.FACADE, MoveId.PSYCHO_SHIFT].some(m => moveset.includes(m));
|
||||||
// Moves that take advantage of being able to give the target a status orb
|
// Moves that take advantage of being able to give the target a status orb
|
||||||
// TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented
|
// TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented
|
||||||
const hasItemMoves = [
|
const hasItemMoves = [
|
||||||
/* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */
|
/* MoveId.TRICK, MoveId.FLING, MoveId.SWITCHEROO */
|
||||||
].some(m => moveset.includes(m));
|
].some(m => moveset.includes(m));
|
||||||
|
|
||||||
if (canSetStatus) {
|
if (canSetStatus) {
|
||||||
// Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb
|
// Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb
|
||||||
const hasGeneralAbility = [
|
const hasGeneralAbility = [
|
||||||
Abilities.QUICK_FEET,
|
AbilityId.QUICK_FEET,
|
||||||
Abilities.GUTS,
|
AbilityId.GUTS,
|
||||||
Abilities.MARVEL_SCALE,
|
AbilityId.MARVEL_SCALE,
|
||||||
Abilities.MAGIC_GUARD,
|
AbilityId.MAGIC_GUARD,
|
||||||
].some(a => p.hasAbility(a, false, true));
|
].some(a => p.hasAbility(a, false, true));
|
||||||
const hasSpecificAbility = [Abilities.FLARE_BOOST].some(a => p.hasAbility(a, false, true));
|
const hasSpecificAbility = [AbilityId.FLARE_BOOST].some(a => p.hasAbility(a, false, true));
|
||||||
const hasOppositeAbility = [Abilities.TOXIC_BOOST, Abilities.POISON_HEAL].some(a =>
|
const hasOppositeAbility = [AbilityId.TOXIC_BOOST, AbilityId.POISON_HEAL].some(a =>
|
||||||
p.hasAbility(a, false, true),
|
p.hasAbility(a, false, true),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2865,31 +2870,31 @@ const modifierPool: ModifierPool = {
|
|||||||
const moveset = p.getMoveset(true).map(m => m.moveId);
|
const moveset = p.getMoveset(true).map(m => m.moveId);
|
||||||
|
|
||||||
const hasAbility = [
|
const hasAbility = [
|
||||||
Abilities.DROUGHT,
|
AbilityId.DROUGHT,
|
||||||
Abilities.ORICHALCUM_PULSE,
|
AbilityId.ORICHALCUM_PULSE,
|
||||||
Abilities.DRIZZLE,
|
AbilityId.DRIZZLE,
|
||||||
Abilities.SAND_STREAM,
|
AbilityId.SAND_STREAM,
|
||||||
Abilities.SAND_SPIT,
|
AbilityId.SAND_SPIT,
|
||||||
Abilities.SNOW_WARNING,
|
AbilityId.SNOW_WARNING,
|
||||||
Abilities.ELECTRIC_SURGE,
|
AbilityId.ELECTRIC_SURGE,
|
||||||
Abilities.HADRON_ENGINE,
|
AbilityId.HADRON_ENGINE,
|
||||||
Abilities.PSYCHIC_SURGE,
|
AbilityId.PSYCHIC_SURGE,
|
||||||
Abilities.GRASSY_SURGE,
|
AbilityId.GRASSY_SURGE,
|
||||||
Abilities.SEED_SOWER,
|
AbilityId.SEED_SOWER,
|
||||||
Abilities.MISTY_SURGE,
|
AbilityId.MISTY_SURGE,
|
||||||
].some(a => p.hasAbility(a, false, true));
|
].some(a => p.hasAbility(a, false, true));
|
||||||
|
|
||||||
const hasMoves = [
|
const hasMoves = [
|
||||||
Moves.SUNNY_DAY,
|
MoveId.SUNNY_DAY,
|
||||||
Moves.RAIN_DANCE,
|
MoveId.RAIN_DANCE,
|
||||||
Moves.SANDSTORM,
|
MoveId.SANDSTORM,
|
||||||
Moves.SNOWSCAPE,
|
MoveId.SNOWSCAPE,
|
||||||
Moves.HAIL,
|
MoveId.HAIL,
|
||||||
Moves.CHILLY_RECEPTION,
|
MoveId.CHILLY_RECEPTION,
|
||||||
Moves.ELECTRIC_TERRAIN,
|
MoveId.ELECTRIC_TERRAIN,
|
||||||
Moves.PSYCHIC_TERRAIN,
|
MoveId.PSYCHIC_TERRAIN,
|
||||||
Moves.GRASSY_TERRAIN,
|
MoveId.GRASSY_TERRAIN,
|
||||||
Moves.MISTY_TERRAIN,
|
MoveId.MISTY_TERRAIN,
|
||||||
].some(m => moveset.includes(m));
|
].some(m => moveset.includes(m));
|
||||||
|
|
||||||
return hasAbility || hasMoves;
|
return hasAbility || hasMoves;
|
||||||
|
@ -18,10 +18,10 @@ import { addTextObject, TextStyle } from "#app/ui/text";
|
|||||||
import { BooleanHolder, hslToHex, isNullOrUndefined, NumberHolder, toDmgValue } from "#app/utils/common";
|
import { BooleanHolder, hslToHex, isNullOrUndefined, NumberHolder, toDmgValue } from "#app/utils/common";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import type { Nature } from "#enums/nature";
|
import type { Nature } from "#enums/nature";
|
||||||
import type { PokeballType } from "#enums/pokeball";
|
import type { PokeballType } from "#enums/pokeball";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { type PermanentStat, type TempBattleStat, BATTLE_STATS, Stat, TEMP_BATTLE_STATS } from "#enums/stat";
|
import { type PermanentStat, type TempBattleStat, BATTLE_STATS, Stat, TEMP_BATTLE_STATS } from "#enums/stat";
|
||||||
import { StatusEffect } from "#enums/status-effect";
|
import { StatusEffect } from "#enums/status-effect";
|
||||||
import type { PokemonType } from "#enums/pokemon-type";
|
import type { PokemonType } from "#enums/pokemon-type";
|
||||||
@ -873,11 +873,11 @@ export class BaseStatModifier extends PokemonHeldItemModifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class EvoTrackerModifier extends PokemonHeldItemModifier {
|
export class EvoTrackerModifier extends PokemonHeldItemModifier {
|
||||||
protected species: Species;
|
protected species: SpeciesId;
|
||||||
protected required: number;
|
protected required: number;
|
||||||
public isTransferable = false;
|
public isTransferable = false;
|
||||||
|
|
||||||
constructor(type: ModifierType, pokemonId: number, species: Species, required: number, stackCount?: number) {
|
constructor(type: ModifierType, pokemonId: number, species: SpeciesId, required: number, stackCount?: number) {
|
||||||
super(type, pokemonId, stackCount);
|
super(type, pokemonId, stackCount);
|
||||||
this.species = species;
|
this.species = species;
|
||||||
this.required = required;
|
this.required = required;
|
||||||
@ -1268,20 +1268,20 @@ export class EvolutionStatBoosterModifier extends StatBoosterModifier {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Modifier used for held items that Applies {@linkcode Stat} boost(s) using a
|
* Modifier used for held items that Applies {@linkcode Stat} boost(s) using a
|
||||||
* multiplier if the holder is of a specific {@linkcode Species}.
|
* multiplier if the holder is of a specific {@linkcode SpeciesId}.
|
||||||
* @extends StatBoosterModifier
|
* @extends StatBoosterModifier
|
||||||
* @see {@linkcode apply}
|
* @see {@linkcode apply}
|
||||||
*/
|
*/
|
||||||
export class SpeciesStatBoosterModifier extends StatBoosterModifier {
|
export class SpeciesStatBoosterModifier extends StatBoosterModifier {
|
||||||
/** The species that the held item's stat boost(s) apply to */
|
/** The species that the held item's stat boost(s) apply to */
|
||||||
private species: Species[];
|
private species: SpeciesId[];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
type: ModifierType,
|
type: ModifierType,
|
||||||
pokemonId: number,
|
pokemonId: number,
|
||||||
stats: Stat[],
|
stats: Stat[],
|
||||||
multiplier: number,
|
multiplier: number,
|
||||||
species: Species[],
|
species: SpeciesId[],
|
||||||
stackCount?: number,
|
stackCount?: number,
|
||||||
) {
|
) {
|
||||||
super(type, pokemonId, stats, multiplier, stackCount);
|
super(type, pokemonId, stats, multiplier, stackCount);
|
||||||
@ -1316,7 +1316,7 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the incoming stat is listed in {@linkcode stats} and if the holder's {@linkcode Species}
|
* Checks if the incoming stat is listed in {@linkcode stats} and if the holder's {@linkcode SpeciesId}
|
||||||
* (or its fused species) is listed in {@linkcode species}.
|
* (or its fused species) is listed in {@linkcode species}.
|
||||||
* @param pokemon {@linkcode Pokemon} that holds the item
|
* @param pokemon {@linkcode Pokemon} that holds the item
|
||||||
* @param stat {@linkcode Stat} being checked at the time
|
* @param stat {@linkcode Stat} being checked at the time
|
||||||
@ -1333,11 +1333,11 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if either parameter is included in the corresponding lists
|
* Checks if either parameter is included in the corresponding lists
|
||||||
* @param speciesId {@linkcode Species} being checked
|
* @param speciesId {@linkcode SpeciesId} being checked
|
||||||
* @param stat {@linkcode Stat} being checked
|
* @param stat {@linkcode Stat} being checked
|
||||||
* @returns `true` if both parameters are in {@linkcode species} and {@linkcode stats} respectively, false otherwise
|
* @returns `true` if both parameters are in {@linkcode species} and {@linkcode stats} respectively, false otherwise
|
||||||
*/
|
*/
|
||||||
contains(speciesId: Species, stat: Stat): boolean {
|
contains(speciesId: SpeciesId, stat: Stat): boolean {
|
||||||
return this.species.includes(speciesId) && this.stats.includes(stat);
|
return this.species.includes(speciesId) && this.stats.includes(stat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1391,15 +1391,21 @@ export class CritBoosterModifier extends PokemonHeldItemModifier {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Modifier used for held items that apply critical-hit stage boost(s)
|
* Modifier used for held items that apply critical-hit stage boost(s)
|
||||||
* if the holder is of a specific {@linkcode Species}.
|
* if the holder is of a specific {@linkcode SpeciesId}.
|
||||||
* @extends CritBoosterModifier
|
* @extends CritBoosterModifier
|
||||||
* @see {@linkcode shouldApply}
|
* @see {@linkcode shouldApply}
|
||||||
*/
|
*/
|
||||||
export class SpeciesCritBoosterModifier extends CritBoosterModifier {
|
export class SpeciesCritBoosterModifier extends CritBoosterModifier {
|
||||||
/** The species that the held item's critical-hit stage boost applies to */
|
/** The species that the held item's critical-hit stage boost applies to */
|
||||||
private species: Species[];
|
private species: SpeciesId[];
|
||||||
|
|
||||||
constructor(type: ModifierType, pokemonId: number, stageIncrement: number, species: Species[], stackCount?: number) {
|
constructor(
|
||||||
|
type: ModifierType,
|
||||||
|
pokemonId: number,
|
||||||
|
stageIncrement: number,
|
||||||
|
species: SpeciesId[],
|
||||||
|
stackCount?: number,
|
||||||
|
) {
|
||||||
super(type, pokemonId, stageIncrement, stackCount);
|
super(type, pokemonId, stageIncrement, stackCount);
|
||||||
|
|
||||||
this.species = species;
|
this.species = species;
|
||||||
@ -1424,7 +1430,7 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the holder's {@linkcode Species} (or its fused species) is listed
|
* Checks if the holder's {@linkcode SpeciesId} (or its fused species) is listed
|
||||||
* in {@linkcode species}.
|
* in {@linkcode species}.
|
||||||
* @param pokemon {@linkcode Pokemon} that holds the held item
|
* @param pokemon {@linkcode Pokemon} that holds the held item
|
||||||
* @param critStage {@linkcode NumberHolder} that holds the resulting critical-hit level
|
* @param critStage {@linkcode NumberHolder} that holds the resulting critical-hit level
|
||||||
@ -1621,7 +1627,7 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for Pokemon held items like King's Rock
|
* Class for Pokemon held items like King's Rock
|
||||||
* Because King's Rock can be stacked in PokeRogue, unlike mainline, it does not receive a boost from Abilities.SERENE_GRACE
|
* Because King's Rock can be stacked in PokeRogue, unlike mainline, it does not receive a boost from AbilityId.SERENE_GRACE
|
||||||
*/
|
*/
|
||||||
export class FlinchChanceModifier extends PokemonHeldItemModifier {
|
export class FlinchChanceModifier extends PokemonHeldItemModifier {
|
||||||
private chance: number;
|
private chance: number;
|
||||||
@ -2112,7 +2118,7 @@ export class TerrastalizeModifier extends ConsumablePokemonModifier {
|
|||||||
return (
|
return (
|
||||||
super.shouldApply(playerPokemon) &&
|
super.shouldApply(playerPokemon) &&
|
||||||
[playerPokemon?.species.speciesId, playerPokemon?.fusionSpecies?.speciesId].filter(
|
[playerPokemon?.species.speciesId, playerPokemon?.fusionSpecies?.speciesId].filter(
|
||||||
s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA,
|
s => s === SpeciesId.TERAPAGOS || s === SpeciesId.OGERPON || s === SpeciesId.SHEDINJA,
|
||||||
).length === 0
|
).length === 0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -2774,14 +2780,14 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier {
|
|||||||
/**
|
/**
|
||||||
* For each stack, converts 25 percent of attack damage into an additional strike.
|
* For each stack, converts 25 percent of attack damage into an additional strike.
|
||||||
* @param pokemon The {@linkcode Pokemon} using the move
|
* @param pokemon The {@linkcode Pokemon} using the move
|
||||||
* @param moveId The {@linkcode Moves | identifier} for the move being used
|
* @param moveId The {@linkcode MoveId | identifier} for the move being used
|
||||||
* @param count {@linkcode NumberHolder} holding the move's hit count for this turn
|
* @param count {@linkcode NumberHolder} holding the move's hit count for this turn
|
||||||
* @param damageMultiplier {@linkcode NumberHolder} holding a damage multiplier applied to a strike of this move
|
* @param damageMultiplier {@linkcode NumberHolder} holding a damage multiplier applied to a strike of this move
|
||||||
* @returns always `true`
|
* @returns always `true`
|
||||||
*/
|
*/
|
||||||
override apply(
|
override apply(
|
||||||
pokemon: Pokemon,
|
pokemon: Pokemon,
|
||||||
moveId: Moves,
|
moveId: MoveId,
|
||||||
count: NumberHolder | null = null,
|
count: NumberHolder | null = null,
|
||||||
damageMultiplier: NumberHolder | null = null,
|
damageMultiplier: NumberHolder | null = null,
|
||||||
): boolean {
|
): boolean {
|
||||||
@ -2924,7 +2930,7 @@ export class MoneyRewardModifier extends ConsumableModifier {
|
|||||||
globalScene.addMoney(moneyAmount.value);
|
globalScene.addMoney(moneyAmount.value);
|
||||||
|
|
||||||
globalScene.getPlayerParty().map(p => {
|
globalScene.getPlayerParty().map(p => {
|
||||||
if (p.species?.speciesId === Species.GIMMIGHOUL || p.fusionSpecies?.speciesId === Species.GIMMIGHOUL) {
|
if (p.species?.speciesId === SpeciesId.GIMMIGHOUL || p.fusionSpecies?.speciesId === SpeciesId.GIMMIGHOUL) {
|
||||||
p.evoCounter
|
p.evoCounter
|
||||||
? (p.evoCounter += Math.min(Math.floor(this.moneyMultiplier), 3))
|
? (p.evoCounter += Math.min(Math.floor(this.moneyMultiplier), 3))
|
||||||
: (p.evoCounter = Math.min(Math.floor(this.moneyMultiplier), 3));
|
: (p.evoCounter = Math.min(Math.floor(this.moneyMultiplier), 3));
|
||||||
|
@ -5,17 +5,17 @@ import { FormChangeItem } from "#app/data/pokemon-forms";
|
|||||||
import { type ModifierOverride } from "#app/modifier/modifier-type";
|
import { type ModifierOverride } from "#app/modifier/modifier-type";
|
||||||
import { Variant } from "#app/sprites/variant";
|
import { Variant } from "#app/sprites/variant";
|
||||||
import { Unlockables } from "#app/system/unlockables";
|
import { Unlockables } from "#app/system/unlockables";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { BattleType } from "#enums/battle-type";
|
import { BattleType } from "#enums/battle-type";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { EggTier } from "#enums/egg-type";
|
import { EggTier } from "#enums/egg-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import { PokeballType } from "#enums/pokeball";
|
import { PokeballType } from "#enums/pokeball";
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { StatusEffect } from "#enums/status-effect";
|
import { StatusEffect } from "#enums/status-effect";
|
||||||
import { TimeOfDay } from "#enums/time-of-day";
|
import { TimeOfDay } from "#enums/time-of-day";
|
||||||
@ -38,8 +38,8 @@ import { WeatherType } from "#enums/weather-type";
|
|||||||
* @example
|
* @example
|
||||||
* ```
|
* ```
|
||||||
* const overrides = {
|
* const overrides = {
|
||||||
* ABILITY_OVERRIDE: Abilities.PROTEAN,
|
* ABILITY_OVERRIDE: AbilityId.PROTEAN,
|
||||||
* PASSIVE_ABILITY_OVERRIDE: Abilities.PIXILATE,
|
* PASSIVE_ABILITY_OVERRIDE: AbilityId.PIXILATE,
|
||||||
* }
|
* }
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@ -73,7 +73,7 @@ class DefaultOverrides {
|
|||||||
*/
|
*/
|
||||||
readonly BATTLE_STYLE_OVERRIDE: BattleStyle | null = null;
|
readonly BATTLE_STYLE_OVERRIDE: BattleStyle | null = null;
|
||||||
readonly STARTING_WAVE_OVERRIDE: number = 0;
|
readonly STARTING_WAVE_OVERRIDE: number = 0;
|
||||||
readonly STARTING_BIOME_OVERRIDE: Biome | null = null;
|
readonly STARTING_BIOME_OVERRIDE: BiomeId | null = null;
|
||||||
readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null;
|
readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null;
|
||||||
/** Multiplies XP gained by this value including 0. Set to null to ignore the override. */
|
/** Multiplies XP gained by this value including 0. Set to null to ignore the override. */
|
||||||
readonly XP_MULTIPLIER_OVERRIDE: number | null = null;
|
readonly XP_MULTIPLIER_OVERRIDE: number | null = null;
|
||||||
@ -124,11 +124,11 @@ class DefaultOverrides {
|
|||||||
* @example
|
* @example
|
||||||
* ```
|
* ```
|
||||||
* const STARTER_FORM_OVERRIDES = {
|
* const STARTER_FORM_OVERRIDES = {
|
||||||
* [Species.DARMANITAN]: 1
|
* [SpeciesId.DARMANITAN]: 1
|
||||||
* }
|
* }
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
readonly STARTER_FORM_OVERRIDES: Partial<Record<Species, number>> = {};
|
readonly STARTER_FORM_OVERRIDES: Partial<Record<SpeciesId, number>> = {};
|
||||||
|
|
||||||
/** default 5 or 20 for Daily */
|
/** default 5 or 20 for Daily */
|
||||||
readonly STARTING_LEVEL_OVERRIDE: number = 0;
|
readonly STARTING_LEVEL_OVERRIDE: number = 0;
|
||||||
@ -136,9 +136,9 @@ class DefaultOverrides {
|
|||||||
* SPECIES OVERRIDE
|
* SPECIES OVERRIDE
|
||||||
* will only apply to the first starter in your party or each enemy pokemon
|
* will only apply to the first starter in your party or each enemy pokemon
|
||||||
* default is 0 to not override
|
* default is 0 to not override
|
||||||
* @example SPECIES_OVERRIDE = Species.Bulbasaur;
|
* @example SPECIES_OVERRIDE = SpeciesId.Bulbasaur;
|
||||||
*/
|
*/
|
||||||
readonly STARTER_SPECIES_OVERRIDE: Species | number = 0;
|
readonly STARTER_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
||||||
/**
|
/**
|
||||||
* This will force your starter to be a random fusion
|
* This will force your starter to be a random fusion
|
||||||
*/
|
*/
|
||||||
@ -146,20 +146,20 @@ class DefaultOverrides {
|
|||||||
/**
|
/**
|
||||||
* This will override the species of the fusion
|
* This will override the species of the fusion
|
||||||
*/
|
*/
|
||||||
readonly STARTER_FUSION_SPECIES_OVERRIDE: Species | number = 0;
|
readonly STARTER_FUSION_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
||||||
readonly ABILITY_OVERRIDE: Abilities = Abilities.NONE;
|
readonly ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
||||||
readonly PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE;
|
readonly PASSIVE_ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
||||||
readonly HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null;
|
readonly HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null;
|
||||||
readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
|
readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
|
||||||
readonly GENDER_OVERRIDE: Gender | null = null;
|
readonly GENDER_OVERRIDE: Gender | null = null;
|
||||||
readonly MOVESET_OVERRIDE: Moves | Array<Moves> = [];
|
readonly MOVESET_OVERRIDE: MoveId | Array<MoveId> = [];
|
||||||
readonly SHINY_OVERRIDE: boolean | null = null;
|
readonly SHINY_OVERRIDE: boolean | null = null;
|
||||||
readonly VARIANT_OVERRIDE: Variant | null = null;
|
readonly VARIANT_OVERRIDE: Variant | null = null;
|
||||||
|
|
||||||
// --------------------------
|
// --------------------------
|
||||||
// OPPONENT / ENEMY OVERRIDES
|
// OPPONENT / ENEMY OVERRIDES
|
||||||
// --------------------------
|
// --------------------------
|
||||||
readonly OPP_SPECIES_OVERRIDE: Species | number = 0;
|
readonly OPP_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
||||||
/**
|
/**
|
||||||
* This will make all opponents fused Pokemon
|
* This will make all opponents fused Pokemon
|
||||||
*/
|
*/
|
||||||
@ -167,18 +167,18 @@ class DefaultOverrides {
|
|||||||
/**
|
/**
|
||||||
* This will override the species of the fusion only when the opponent is already a fusion
|
* This will override the species of the fusion only when the opponent is already a fusion
|
||||||
*/
|
*/
|
||||||
readonly OPP_FUSION_SPECIES_OVERRIDE: Species | number = 0;
|
readonly OPP_FUSION_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
||||||
readonly OPP_LEVEL_OVERRIDE: number = 0;
|
readonly OPP_LEVEL_OVERRIDE: number = 0;
|
||||||
readonly OPP_ABILITY_OVERRIDE: Abilities = Abilities.NONE;
|
readonly OPP_ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
||||||
readonly OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE;
|
readonly OPP_PASSIVE_ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
||||||
readonly OPP_HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null;
|
readonly OPP_HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null;
|
||||||
readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
|
readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
|
||||||
readonly OPP_GENDER_OVERRIDE: Gender | null = null;
|
readonly OPP_GENDER_OVERRIDE: Gender | null = null;
|
||||||
readonly OPP_MOVESET_OVERRIDE: Moves | Array<Moves> = [];
|
readonly OPP_MOVESET_OVERRIDE: MoveId | Array<MoveId> = [];
|
||||||
readonly OPP_SHINY_OVERRIDE: boolean | null = null;
|
readonly OPP_SHINY_OVERRIDE: boolean | null = null;
|
||||||
readonly OPP_VARIANT_OVERRIDE: Variant | null = null;
|
readonly OPP_VARIANT_OVERRIDE: Variant | null = null;
|
||||||
readonly OPP_IVS_OVERRIDE: number | number[] = [];
|
readonly OPP_IVS_OVERRIDE: number | number[] = [];
|
||||||
readonly OPP_FORM_OVERRIDES: Partial<Record<Species, number>> = {};
|
readonly OPP_FORM_OVERRIDES: Partial<Record<SpeciesId, number>> = {};
|
||||||
/**
|
/**
|
||||||
* Override to give the enemy Pokemon a given amount of health segments
|
* Override to give the enemy Pokemon a given amount of health segments
|
||||||
*
|
*
|
||||||
|
@ -71,7 +71,7 @@ export class BerryPhase extends FieldPhase {
|
|||||||
}
|
}
|
||||||
globalScene.updateModifiers(pokemon.isPlayer());
|
globalScene.updateModifiers(pokemon.isPlayer());
|
||||||
|
|
||||||
// Abilities.CHEEK_POUCH only works once per round of nom noms
|
// AbilityId.CHEEK_POUCH only works once per round of nom noms
|
||||||
applyAbAttrs(HealFromBerryUseAbAttr, pokemon, new BooleanHolder(false));
|
applyAbAttrs(HealFromBerryUseAbAttr, pokemon, new BooleanHolder(false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,10 @@ import { TrappedTag } from "#app/data/battler-tags";
|
|||||||
import type { MoveTargetSet } from "#app/data/moves/move";
|
import type { MoveTargetSet } from "#app/data/moves/move";
|
||||||
import { getMoveTargets } from "#app/data/moves/move";
|
import { getMoveTargets } from "#app/data/moves/move";
|
||||||
import { speciesStarterCosts } from "#app/data/balance/starters";
|
import { speciesStarterCosts } from "#app/data/balance/starters";
|
||||||
import { Abilities } from "#app/enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { BattlerTagType } from "#app/enums/battler-tag-type";
|
import { BattlerTagType } from "#app/enums/battler-tag-type";
|
||||||
import { Biome } from "#app/enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { Moves } from "#app/enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { PokeballType } from "#enums/pokeball";
|
import { PokeballType } from "#enums/pokeball";
|
||||||
import type { PlayerPokemon, TurnMove } from "#app/field/pokemon";
|
import type { PlayerPokemon, TurnMove } from "#app/field/pokemon";
|
||||||
import { FieldPosition } from "#app/field/pokemon";
|
import { FieldPosition } from "#app/field/pokemon";
|
||||||
@ -44,7 +44,7 @@ export class CommandPhase extends FieldPhase {
|
|||||||
const cursorResetEvent =
|
const cursorResetEvent =
|
||||||
globalScene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER ||
|
globalScene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER ||
|
||||||
globalScene.currentBattle.battleType === BattleType.TRAINER ||
|
globalScene.currentBattle.battleType === BattleType.TRAINER ||
|
||||||
globalScene.arena.biomeType === Biome.END;
|
globalScene.arena.biomeType === BiomeId.END;
|
||||||
|
|
||||||
if (commandUiHandler) {
|
if (commandUiHandler) {
|
||||||
if (
|
if (
|
||||||
@ -80,7 +80,7 @@ export class CommandPhase extends FieldPhase {
|
|||||||
) {
|
) {
|
||||||
globalScene.currentBattle.turnCommands[this.fieldIndex] = {
|
globalScene.currentBattle.turnCommands[this.fieldIndex] = {
|
||||||
command: Command.FIGHT,
|
command: Command.FIGHT,
|
||||||
move: { move: Moves.NONE, targets: [] },
|
move: { move: MoveId.NONE, targets: [] },
|
||||||
skip: true,
|
skip: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -157,15 +157,15 @@ export class CommandPhase extends FieldPhase {
|
|||||||
playerPokemon.trySelectMove(cursor, args[0] as boolean) ||
|
playerPokemon.trySelectMove(cursor, args[0] as boolean) ||
|
||||||
(useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length)
|
(useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length)
|
||||||
) {
|
) {
|
||||||
let moveId: Moves;
|
let moveId: MoveId;
|
||||||
if (useStruggle) {
|
if (useStruggle) {
|
||||||
moveId = Moves.STRUGGLE;
|
moveId = MoveId.STRUGGLE;
|
||||||
} else if (turnMove !== undefined) {
|
} else if (turnMove !== undefined) {
|
||||||
moveId = turnMove.move;
|
moveId = turnMove.move;
|
||||||
} else if (cursor > -1) {
|
} else if (cursor > -1) {
|
||||||
moveId = playerPokemon.getMoveset()[cursor].moveId;
|
moveId = playerPokemon.getMoveset()[cursor].moveId;
|
||||||
} else {
|
} else {
|
||||||
moveId = Moves.NONE;
|
moveId = MoveId.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
const turnCommand: TurnCommand = {
|
const turnCommand: TurnCommand = {
|
||||||
@ -241,7 +241,7 @@ export class CommandPhase extends FieldPhase {
|
|||||||
.some(p => !globalScene.gameData.dexData[p.species.speciesId].caughtAttr) &&
|
.some(p => !globalScene.gameData.dexData[p.species.speciesId].caughtAttr) &&
|
||||||
globalScene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1;
|
globalScene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1;
|
||||||
if (
|
if (
|
||||||
globalScene.arena.biomeType === Biome.END &&
|
globalScene.arena.biomeType === BiomeId.END &&
|
||||||
(!globalScene.gameMode.isClassic || globalScene.gameMode.isFreshStartChallenge() || notInDex)
|
(!globalScene.gameMode.isClassic || globalScene.gameMode.isFreshStartChallenge() || notInDex)
|
||||||
) {
|
) {
|
||||||
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
||||||
@ -308,7 +308,7 @@ export class CommandPhase extends FieldPhase {
|
|||||||
if (
|
if (
|
||||||
targetPokemon?.isBoss() &&
|
targetPokemon?.isBoss() &&
|
||||||
targetPokemon?.bossSegmentIndex >= 1 &&
|
targetPokemon?.bossSegmentIndex >= 1 &&
|
||||||
!targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) &&
|
!targetPokemon?.hasAbility(AbilityId.WONDER_GUARD, false, true) &&
|
||||||
cursor < PokeballType.MASTER_BALL
|
cursor < PokeballType.MASTER_BALL
|
||||||
) {
|
) {
|
||||||
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
||||||
@ -344,7 +344,7 @@ export class CommandPhase extends FieldPhase {
|
|||||||
const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed;
|
const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed;
|
||||||
if (
|
if (
|
||||||
!isSwitch &&
|
!isSwitch &&
|
||||||
(arena.biomeType === Biome.END ||
|
(arena.biomeType === BiomeId.END ||
|
||||||
(!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed))
|
(!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed))
|
||||||
) {
|
) {
|
||||||
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
||||||
|
@ -37,10 +37,10 @@ import { handleTutorial, Tutorial } from "#app/tutorial";
|
|||||||
import { UiMode } from "#enums/ui-mode";
|
import { UiMode } from "#enums/ui-mode";
|
||||||
import { randSeedInt, randSeedItem } from "#app/utils/common";
|
import { randSeedInt, randSeedItem } from "#app/utils/common";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { Biome } from "#enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
|
import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier";
|
import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters";
|
import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters";
|
||||||
@ -120,7 +120,7 @@ export class EncounterPhase extends BattlePhase {
|
|||||||
if (
|
if (
|
||||||
globalScene.findModifier(m => m instanceof BoostBugSpawnModifier) &&
|
globalScene.findModifier(m => m instanceof BoostBugSpawnModifier) &&
|
||||||
!globalScene.gameMode.isBoss(battle.waveIndex) &&
|
!globalScene.gameMode.isBoss(battle.waveIndex) &&
|
||||||
globalScene.arena.biomeType !== Biome.END &&
|
globalScene.arena.biomeType !== BiomeId.END &&
|
||||||
randSeedInt(10) === 0
|
randSeedInt(10) === 0
|
||||||
) {
|
) {
|
||||||
enemySpecies = getGoldenBugNetSpecies(level);
|
enemySpecies = getGoldenBugNetSpecies(level);
|
||||||
@ -158,7 +158,7 @@ export class EncounterPhase extends BattlePhase {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enemyPokemon.species.speciesId === Species.ETERNATUS) {
|
if (enemyPokemon.species.speciesId === SpeciesId.ETERNATUS) {
|
||||||
if (
|
if (
|
||||||
globalScene.gameMode.isClassic &&
|
globalScene.gameMode.isClassic &&
|
||||||
(battle.battleSpec === BattleSpec.FINAL_BOSS || globalScene.gameMode.isWaveFinal(battle.waveIndex))
|
(battle.battleSpec === BattleSpec.FINAL_BOSS || globalScene.gameMode.isWaveFinal(battle.waveIndex))
|
||||||
@ -556,7 +556,7 @@ export class EncounterPhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
/** This sets Eternatus' held item to be untransferrable, preventing it from being stolen */
|
/** This sets Eternatus' held item to be untransferrable, preventing it from being stolen */
|
||||||
if (
|
if (
|
||||||
enemyPokemon.species.speciesId === Species.ETERNATUS &&
|
enemyPokemon.species.speciesId === SpeciesId.ETERNATUS &&
|
||||||
(globalScene.gameMode.isBattleClassicFinalBoss(globalScene.currentBattle.waveIndex) ||
|
(globalScene.gameMode.isBattleClassicFinalBoss(globalScene.currentBattle.waveIndex) ||
|
||||||
globalScene.gameMode.isEndlessMajorBoss(globalScene.currentBattle.waveIndex))
|
globalScene.gameMode.isEndlessMajorBoss(globalScene.currentBattle.waveIndex))
|
||||||
) {
|
) {
|
||||||
|
@ -2,7 +2,7 @@ import { globalScene } from "#app/global-scene";
|
|||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { Command } from "#app/ui/command-ui-handler";
|
import { Command } from "#app/ui/command-ui-handler";
|
||||||
import { FieldPhase } from "./field-phase";
|
import { FieldPhase } from "./field-phase";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,7 +38,7 @@ export class EnemyCommandPhase extends FieldPhase {
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
battle.double &&
|
battle.double &&
|
||||||
enemyPokemon.hasAbility(Abilities.COMMANDER) &&
|
enemyPokemon.hasAbility(AbilityId.COMMANDER) &&
|
||||||
enemyPokemon.getAlly()?.getTag(BattlerTagType.COMMANDED)
|
enemyPokemon.getAlly()?.getTag(BattlerTagType.COMMANDED)
|
||||||
) {
|
) {
|
||||||
this.skipTurn = true;
|
this.skipTurn = true;
|
||||||
|
@ -3,7 +3,7 @@ import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
|
|||||||
import type Move from "#app/data/moves/move";
|
import type Move from "#app/data/moves/move";
|
||||||
import { allMoves } from "#app/data/data-lists";
|
import { allMoves } from "#app/data/data-lists";
|
||||||
import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms";
|
import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
import Overrides from "#app/overrides";
|
import Overrides from "#app/overrides";
|
||||||
import EvolutionSceneHandler from "#app/ui/evolution-scene-handler";
|
import EvolutionSceneHandler from "#app/ui/evolution-scene-handler";
|
||||||
@ -24,14 +24,14 @@ export enum LearnMoveType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
|
export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
|
||||||
private moveId: Moves;
|
private moveId: MoveId;
|
||||||
private messageMode: UiMode;
|
private messageMode: UiMode;
|
||||||
private learnMoveType: LearnMoveType;
|
private learnMoveType: LearnMoveType;
|
||||||
private cost: number;
|
private cost: number;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
partyMemberIndex: number,
|
partyMemberIndex: number,
|
||||||
moveId: Moves,
|
moveId: MoveId,
|
||||||
learnMoveType: LearnMoveType = LearnMoveType.LEARN_MOVE,
|
learnMoveType: LearnMoveType = LearnMoveType.LEARN_MOVE,
|
||||||
cost = -1,
|
cost = -1,
|
||||||
) {
|
) {
|
||||||
@ -49,7 +49,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
|
|||||||
const currentMoveset = pokemon.getMoveset();
|
const currentMoveset = pokemon.getMoveset();
|
||||||
|
|
||||||
// The game first checks if the Pokemon already has the move and ends the phase if it does.
|
// The game first checks if the Pokemon already has the move and ends the phase if it does.
|
||||||
const hasMoveAlready = currentMoveset.some(m => m.moveId === move.id) && this.moveId !== Moves.SKETCH;
|
const hasMoveAlready = currentMoveset.some(m => m.moveId === move.id) && this.moveId !== MoveId.SKETCH;
|
||||||
if (hasMoveAlready) {
|
if (hasMoveAlready) {
|
||||||
return this.end();
|
return this.end();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
|
import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { Phase } from "#app/phase";
|
import { Phase } from "#app/phase";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -8,7 +8,7 @@ import { Phase } from "#app/phase";
|
|||||||
* isn't already loaded (e.g. for Metronome)
|
* isn't already loaded (e.g. for Metronome)
|
||||||
*/
|
*/
|
||||||
export class LoadMoveAnimPhase extends Phase {
|
export class LoadMoveAnimPhase extends Phase {
|
||||||
constructor(protected moveId: Moves) {
|
constructor(protected moveId: MoveId) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ import { MoveTarget } from "#enums/MoveTarget";
|
|||||||
import { MoveCategory } from "#enums/MoveCategory";
|
import { MoveCategory } from "#enums/MoveCategory";
|
||||||
import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms";
|
import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms";
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { DamageResult, PokemonMove, type TurnMove } from "#app/field/pokemon";
|
import { type DamageResult, PokemonMove, type TurnMove } from "#app/field/pokemon";
|
||||||
import type Pokemon from "#app/field/pokemon";
|
import type Pokemon from "#app/field/pokemon";
|
||||||
import { HitResult, MoveResult } from "#app/field/pokemon";
|
import { HitResult, MoveResult } from "#app/field/pokemon";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
@ -65,14 +65,14 @@ import { PokemonPhase } from "#app/phases/pokemon-phase";
|
|||||||
import { BooleanHolder, isNullOrUndefined, NumberHolder } from "#app/utils/common";
|
import { BooleanHolder, isNullOrUndefined, NumberHolder } from "#app/utils/common";
|
||||||
import type { nil } from "#app/utils/common";
|
import type { nil } from "#app/utils/common";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import type { Phase } from "#app/phase";
|
import type { Phase } from "#app/phase";
|
||||||
import { ShowAbilityPhase } from "./show-ability-phase";
|
import { ShowAbilityPhase } from "./show-ability-phase";
|
||||||
import { MovePhase } from "./move-phase";
|
import { MovePhase } from "./move-phase";
|
||||||
import { MoveEndPhase } from "./move-end-phase";
|
import { MoveEndPhase } from "./move-end-phase";
|
||||||
import { HideAbilityPhase } from "#app/phases/hide-ability-phase";
|
import { HideAbilityPhase } from "#app/phases/hide-ability-phase";
|
||||||
import { TypeDamageMultiplier } from "#app/data/type";
|
import type { TypeDamageMultiplier } from "#app/data/type";
|
||||||
import { HitCheckResult } from "#enums/hit-check-result";
|
import { HitCheckResult } from "#enums/hit-check-result";
|
||||||
import type Move from "#app/data/moves/move";
|
import type Move from "#app/data/moves/move";
|
||||||
import { isFieldTargeted } from "#app/data/moves/move-utils";
|
import { isFieldTargeted } from "#app/data/moves/move-utils";
|
||||||
@ -220,7 +220,7 @@ export class MoveEffectPhase extends PokemonPhase {
|
|||||||
break;
|
break;
|
||||||
case HitCheckResult.NO_EFFECT:
|
case HitCheckResult.NO_EFFECT:
|
||||||
globalScene.queueMessage(
|
globalScene.queueMessage(
|
||||||
i18next.t(this.move.id === Moves.SHEER_COLD ? "battle:hitResultImmune" : "battle:hitResultNoEffect", {
|
i18next.t(this.move.id === MoveId.SHEER_COLD ? "battle:hitResultImmune" : "battle:hitResultNoEffect", {
|
||||||
pokemonName: getPokemonNameWithAffix(target),
|
pokemonName: getPokemonNameWithAffix(target),
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
@ -351,7 +351,7 @@ export class MoveEffectPhase extends PokemonPhase {
|
|||||||
) {
|
) {
|
||||||
const firstTarget = this.getFirstTarget();
|
const firstTarget = this.getFirstTarget();
|
||||||
new MoveAnim(
|
new MoveAnim(
|
||||||
move.id as Moves,
|
move.id as MoveId,
|
||||||
user,
|
user,
|
||||||
firstTarget?.getBattlerIndex() ?? BattlerIndex.ATTACKER,
|
firstTarget?.getBattlerIndex() ?? BattlerIndex.ATTACKER,
|
||||||
// Some moves used in mystery encounters should be played even on an empty field
|
// Some moves used in mystery encounters should be played even on an empty field
|
||||||
@ -609,12 +609,12 @@ export class MoveEffectPhase extends PokemonPhase {
|
|||||||
* @returns `true` if the move should bypass accuracy and semi-invulnerability
|
* @returns `true` if the move should bypass accuracy and semi-invulnerability
|
||||||
*
|
*
|
||||||
* Accuracy and semi-invulnerability can be bypassed by:
|
* Accuracy and semi-invulnerability can be bypassed by:
|
||||||
* - An ability like {@linkcode Abilities.NO_GUARD | No Guard}
|
* - An ability like {@linkcode AbilityId.NO_GUARD | No Guard}
|
||||||
* - A poison type using {@linkcode Moves.TOXIC | Toxic}
|
* - A poison type using {@linkcode MoveId.TOXIC | Toxic}
|
||||||
* - A move like {@linkcode Moves.LOCK_ON | Lock-On} or {@linkcode Moves.MIND_READER | Mind Reader}.
|
* - A move like {@linkcode MoveId.LOCK_ON | Lock-On} or {@linkcode MoveId.MIND_READER | Mind Reader}.
|
||||||
* - A field-targeted move like spikes
|
* - A field-targeted move like spikes
|
||||||
*
|
*
|
||||||
* Does *not* check against effects {@linkcode Moves.GLAIVE_RUSH | Glaive Rush} status (which
|
* Does *not* check against effects {@linkcode MoveId.GLAIVE_RUSH | Glaive Rush} status (which
|
||||||
* should not bypass semi-invulnerability), or interactions like Earthquake hitting against Dig,
|
* should not bypass semi-invulnerability), or interactions like Earthquake hitting against Dig,
|
||||||
* (which should not bypass the accuracy check).
|
* (which should not bypass the accuracy check).
|
||||||
*
|
*
|
||||||
@ -809,7 +809,7 @@ export class MoveEffectPhase extends PokemonPhase {
|
|||||||
*/
|
*/
|
||||||
applyMoveAttrs(StatChangeBeforeDmgCalcAttr, user, target, this.move);
|
applyMoveAttrs(StatChangeBeforeDmgCalcAttr, user, target, this.move);
|
||||||
|
|
||||||
const { result: result, damage: dmg } = target.getAttackDamage({
|
const { result, damage: dmg } = target.getAttackDamage({
|
||||||
source: user,
|
source: user,
|
||||||
move: this.move,
|
move: this.move,
|
||||||
ignoreAbility: false,
|
ignoreAbility: false,
|
||||||
|
@ -44,10 +44,10 @@ import { MoveChargePhase } from "#app/phases/move-charge-phase";
|
|||||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
||||||
import { MoveEndPhase } from "#app/phases/move-end-phase";
|
import { MoveEndPhase } from "#app/phases/move-end-phase";
|
||||||
import { NumberHolder } from "#app/utils/common";
|
import { NumberHolder } from "#app/utils/common";
|
||||||
import { Abilities } from "#enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { StatusEffect } from "#enums/status-effect";
|
import { StatusEffect } from "#enums/status-effect";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows whether the current move has been forced to the end of the turn
|
* Shows whether the current move has been forced to the end of the turn
|
||||||
* Needed for speed order, see {@linkcode Moves.QUASH}
|
* Needed for speed order, see {@linkcode MoveId.QUASH}
|
||||||
* */
|
* */
|
||||||
public isForcedLast(): boolean {
|
public isForcedLast(): boolean {
|
||||||
return this.forcedLast;
|
return this.forcedLast;
|
||||||
@ -147,7 +147,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
public start(): void {
|
public start(): void {
|
||||||
super.start();
|
super.start();
|
||||||
|
|
||||||
console.log(Moves[this.move.moveId]);
|
console.log(MoveId[this.move.moveId]);
|
||||||
|
|
||||||
// Check if move is unusable (e.g. because it's out of PP due to a mid-turn Spite).
|
// Check if move is unusable (e.g. because it's out of PP due to a mid-turn Spite).
|
||||||
if (!this.canMove(true)) {
|
if (!this.canMove(true)) {
|
||||||
@ -201,14 +201,14 @@ export class MovePhase extends BattlePhase {
|
|||||||
this.end();
|
this.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check for cancellation edge cases - no targets remaining, or {@linkcode Moves.NONE} is in the queue */
|
/** Check for cancellation edge cases - no targets remaining, or {@linkcode MoveId.NONE} is in the queue */
|
||||||
protected resolveFinalPreMoveCancellationChecks(): void {
|
protected resolveFinalPreMoveCancellationChecks(): void {
|
||||||
const targets = this.getActiveTargetPokemon();
|
const targets = this.getActiveTargetPokemon();
|
||||||
const moveQueue = this.pokemon.getMoveQueue();
|
const moveQueue = this.pokemon.getMoveQueue();
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(targets.length === 0 && !this.move.getMove().hasAttr(AddArenaTrapTagAttr)) ||
|
(targets.length === 0 && !this.move.getMove().hasAttr(AddArenaTrapTagAttr)) ||
|
||||||
(moveQueue.length && moveQueue[0].move === Moves.NONE)
|
(moveQueue.length && moveQueue[0].move === MoveId.NONE)
|
||||||
) {
|
) {
|
||||||
this.showMoveText();
|
this.showMoveText();
|
||||||
this.showFailedText();
|
this.showFailedText();
|
||||||
@ -294,7 +294,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
protected lapsePreMoveAndMoveTags(): void {
|
protected lapsePreMoveAndMoveTags(): void {
|
||||||
this.pokemon.lapseTags(BattlerTagLapseType.PRE_MOVE);
|
this.pokemon.lapseTags(BattlerTagLapseType.PRE_MOVE);
|
||||||
|
|
||||||
// TODO: does this intentionally happen before the no targets/Moves.NONE on queue cancellation case is checked?
|
// TODO: does this intentionally happen before the no targets/MoveId.NONE on queue cancellation case is checked?
|
||||||
if (!this.followUp && this.canMove() && !this.cancelled) {
|
if (!this.followUp && this.canMove() && !this.cancelled) {
|
||||||
this.pokemon.lapseTags(BattlerTagLapseType.MOVE);
|
this.pokemon.lapseTags(BattlerTagLapseType.MOVE);
|
||||||
}
|
}
|
||||||
@ -410,7 +410,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, move, this.reflected, this.move.virtual),
|
new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, move, this.reflected, this.move.virtual),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if ([Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE].includes(this.move.moveId)) {
|
if ([MoveId.ROAR, MoveId.WHIRLWIND, MoveId.TRICK_OR_TREAT, MoveId.FORESTS_CURSE].includes(this.move.moveId)) {
|
||||||
applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove());
|
applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -486,7 +486,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies PP increasing abilities (currently only {@link Abilities.PRESSURE Pressure}) if they exist on the target pokemon.
|
* Applies PP increasing abilities (currently only {@link AbilityId.PRESSURE Pressure}) if they exist on the target pokemon.
|
||||||
* Note that targets must include only active pokemon.
|
* Note that targets must include only active pokemon.
|
||||||
*
|
*
|
||||||
* TODO: This hardcodes the PP increase at 1 per opponent, rather than deferring to the ability.
|
* TODO: This hardcodes the PP increase at 1 per opponent, rather than deferring to the ability.
|
||||||
@ -526,7 +526,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
if (
|
if (
|
||||||
redirectTag &&
|
redirectTag &&
|
||||||
(!redirectTag.powder ||
|
(!redirectTag.powder ||
|
||||||
(!this.pokemon.isOfType(PokemonType.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))
|
(!this.pokemon.isOfType(PokemonType.GRASS) && !this.pokemon.hasAbility(AbilityId.OVERCOAT)))
|
||||||
) {
|
) {
|
||||||
redirectTarget.value = p.getBattlerIndex();
|
redirectTarget.value = p.getBattlerIndex();
|
||||||
redirectedByAbility = false;
|
redirectedByAbility = false;
|
||||||
@ -594,8 +594,8 @@ export class MovePhase extends BattlePhase {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the case where the move was cancelled or failed:
|
* Handles the case where the move was cancelled or failed:
|
||||||
* - Uses PP if the move failed (not cancelled) and should use PP (failed moves are not affected by {@link Abilities.PRESSURE Pressure})
|
* - Uses PP if the move failed (not cancelled) and should use PP (failed moves are not affected by {@link AbilityId.PRESSURE Pressure})
|
||||||
* - Records a cancelled OR failed move in move history, so abilities like {@link Abilities.TRUANT Truant} don't trigger on the
|
* - Records a cancelled OR failed move in move history, so abilities like {@link AbilityId.TRUANT Truant} don't trigger on the
|
||||||
* next turn and soft-lock.
|
* next turn and soft-lock.
|
||||||
* - Lapses `MOVE_EFFECT` tags:
|
* - Lapses `MOVE_EFFECT` tags:
|
||||||
* - Semi-invulnerable battler tags (Fly/Dive/etc.) are intended to lapse on move effects, but also need
|
* - Semi-invulnerable battler tags (Fly/Dive/etc.) are intended to lapse on move effects, but also need
|
||||||
@ -603,7 +603,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
*
|
*
|
||||||
* TODO: ...this seems weird.
|
* TODO: ...this seems weird.
|
||||||
* - Lapses `AFTER_MOVE` tags:
|
* - Lapses `AFTER_MOVE` tags:
|
||||||
* - This handles the effects of {@link Moves.SUBSTITUTE Substitute}
|
* - This handles the effects of {@link MoveId.SUBSTITUTE Substitute}
|
||||||
* - Removes the second turn of charge moves
|
* - Removes the second turn of charge moves
|
||||||
*/
|
*/
|
||||||
protected handlePreMoveFailures(): void {
|
protected handlePreMoveFailures(): void {
|
||||||
@ -623,7 +623,7 @@ export class MovePhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.pokemon.pushMoveHistory({
|
this.pokemon.pushMoveHistory({
|
||||||
move: Moves.NONE,
|
move: MoveId.NONE,
|
||||||
result: MoveResult.FAIL,
|
result: MoveResult.FAIL,
|
||||||
targets: this.targets,
|
targets: this.targets,
|
||||||
});
|
});
|
||||||
@ -636,11 +636,11 @@ export class MovePhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the move's usage text to the player, unless it's a charge turn (ie: {@link Moves.SOLAR_BEAM Solar Beam}),
|
* Displays the move's usage text to the player, unless it's a charge turn (ie: {@link MoveId.SOLAR_BEAM Solar Beam}),
|
||||||
* the pokemon is on a recharge turn (ie: {@link Moves.HYPER_BEAM Hyper Beam}), or a 2-turn move was interrupted (ie: {@link Moves.FLY Fly}).
|
* the pokemon is on a recharge turn (ie: {@link MoveId.HYPER_BEAM Hyper Beam}), or a 2-turn move was interrupted (ie: {@link MoveId.FLY Fly}).
|
||||||
*/
|
*/
|
||||||
public showMoveText(): void {
|
public showMoveText(): void {
|
||||||
if (this.move.moveId === Moves.NONE) {
|
if (this.move.moveId === MoveId.NONE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import type Pokemon from "#app/field/pokemon";
|
|||||||
import { BattlePhase } from "#app/phases/battle-phase";
|
import { BattlePhase } from "#app/phases/battle-phase";
|
||||||
import { isNullOrUndefined } from "#app/utils/common";
|
import { isNullOrUndefined } from "#app/utils/common";
|
||||||
import { PokemonAnimType } from "#enums/pokemon-anim-type";
|
import { PokemonAnimType } from "#enums/pokemon-anim-type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
export class PokemonAnimPhase extends BattlePhase {
|
export class PokemonAnimPhase extends BattlePhase {
|
||||||
/** The type of animation to play in this phase */
|
/** The type of animation to play in this phase */
|
||||||
@ -247,7 +247,7 @@ export class PokemonAnimPhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
const dondozo = this.pokemon.getAlly();
|
const dondozo = this.pokemon.getAlly();
|
||||||
|
|
||||||
if (dondozo?.species?.speciesId !== Species.DONDOZO) {
|
if (dondozo?.species?.speciesId !== SpeciesId.DONDOZO) {
|
||||||
return this.end();
|
return this.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import type { BattlerIndex } from "#app/battle";
|
import type { BattlerIndex } from "#app/battle";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat";
|
import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
@ -54,7 +54,7 @@ export class PokemonTransformPhase extends PokemonPhase {
|
|||||||
return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5));
|
return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5));
|
||||||
}
|
}
|
||||||
console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`);
|
console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`);
|
||||||
return new PokemonMove(Moves.NONE);
|
return new PokemonMove(MoveId.NONE);
|
||||||
});
|
});
|
||||||
user.summonData.types = target.getTypes();
|
user.summonData.types = target.getTypes();
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { biomeLinks, getBiomeName } from "#app/data/balance/biomes";
|
import { biomeLinks, getBiomeName } from "#app/data/balance/biomes";
|
||||||
import { Biome } from "#app/enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier";
|
import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier";
|
||||||
import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
||||||
import { UiMode } from "#enums/ui-mode";
|
import { UiMode } from "#enums/ui-mode";
|
||||||
@ -18,7 +18,7 @@ export class SelectBiomePhase extends BattlePhase {
|
|||||||
const currentBiome = globalScene.arena.biomeType;
|
const currentBiome = globalScene.arena.biomeType;
|
||||||
const nextWaveIndex = globalScene.currentBattle.waveIndex + 1;
|
const nextWaveIndex = globalScene.currentBattle.waveIndex + 1;
|
||||||
|
|
||||||
const setNextBiome = (nextBiome: Biome) => {
|
const setNextBiome = (nextBiome: BiomeId) => {
|
||||||
if (nextWaveIndex % 10 === 1) {
|
if (nextWaveIndex % 10 === 1) {
|
||||||
globalScene.applyModifiers(MoneyInterestModifier, true);
|
globalScene.applyModifiers(MoneyInterestModifier, true);
|
||||||
globalScene.unshiftPhase(new PartyHealPhase(false));
|
globalScene.unshiftPhase(new PartyHealPhase(false));
|
||||||
@ -32,11 +32,11 @@ export class SelectBiomePhase extends BattlePhase {
|
|||||||
(globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(nextWaveIndex)) ||
|
(globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(nextWaveIndex)) ||
|
||||||
(globalScene.gameMode.hasShortBiomes && !(nextWaveIndex % 50))
|
(globalScene.gameMode.hasShortBiomes && !(nextWaveIndex % 50))
|
||||||
) {
|
) {
|
||||||
setNextBiome(Biome.END);
|
setNextBiome(BiomeId.END);
|
||||||
} else if (globalScene.gameMode.hasRandomBiomes) {
|
} else if (globalScene.gameMode.hasRandomBiomes) {
|
||||||
setNextBiome(this.generateNextBiome(nextWaveIndex));
|
setNextBiome(this.generateNextBiome(nextWaveIndex));
|
||||||
} else if (Array.isArray(biomeLinks[currentBiome])) {
|
} else if (Array.isArray(biomeLinks[currentBiome])) {
|
||||||
const biomes: Biome[] = (biomeLinks[currentBiome] as (Biome | [Biome, number])[])
|
const biomes: BiomeId[] = (biomeLinks[currentBiome] as (BiomeId | [BiomeId, number])[])
|
||||||
.filter(b => !Array.isArray(b) || !randSeedInt(b[1]))
|
.filter(b => !Array.isArray(b) || !randSeedInt(b[1]))
|
||||||
.map(b => (!Array.isArray(b) ? b : b[0]));
|
.map(b => (!Array.isArray(b) ? b : b[0]));
|
||||||
|
|
||||||
@ -60,15 +60,15 @@ export class SelectBiomePhase extends BattlePhase {
|
|||||||
setNextBiome(biomes[randSeedInt(biomes.length)]);
|
setNextBiome(biomes[randSeedInt(biomes.length)]);
|
||||||
}
|
}
|
||||||
} else if (biomeLinks.hasOwnProperty(currentBiome)) {
|
} else if (biomeLinks.hasOwnProperty(currentBiome)) {
|
||||||
setNextBiome(biomeLinks[currentBiome] as Biome);
|
setNextBiome(biomeLinks[currentBiome] as BiomeId);
|
||||||
} else {
|
} else {
|
||||||
setNextBiome(this.generateNextBiome(nextWaveIndex));
|
setNextBiome(this.generateNextBiome(nextWaveIndex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
generateNextBiome(waveIndex: number): Biome {
|
generateNextBiome(waveIndex: number): BiomeId {
|
||||||
if (!(waveIndex % 50)) {
|
if (!(waveIndex % 50)) {
|
||||||
return Biome.END;
|
return BiomeId.END;
|
||||||
}
|
}
|
||||||
return globalScene.generateRandomBiome(waveIndex);
|
return globalScene.generateRandomBiome(waveIndex);
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ import { TitlePhase } from "#app/phases/title-phase";
|
|||||||
import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler";
|
import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler";
|
||||||
import type { Starter } from "#app/ui/starter-select-ui-handler";
|
import type { Starter } from "#app/ui/starter-select-ui-handler";
|
||||||
import { UiMode } from "#enums/ui-mode";
|
import { UiMode } from "#enums/ui-mode";
|
||||||
import type { Species } from "#enums/species";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
|
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
|
||||||
import { isNullOrUndefined } from "#app/utils/common";
|
import { isNullOrUndefined } from "#app/utils/common";
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ export class SelectStarterPhase extends Phase {
|
|||||||
const loadPokemonAssets: Promise<void>[] = [];
|
const loadPokemonAssets: Promise<void>[] = [];
|
||||||
starters.forEach((starter: Starter, i: number) => {
|
starters.forEach((starter: Starter, i: number) => {
|
||||||
if (!i && Overrides.STARTER_SPECIES_OVERRIDE) {
|
if (!i && Overrides.STARTER_SPECIES_OVERRIDE) {
|
||||||
starter.species = getPokemonSpecies(Overrides.STARTER_SPECIES_OVERRIDE as Species);
|
starter.species = getPokemonSpecies(Overrides.STARTER_SPECIES_OVERRIDE as SpeciesId);
|
||||||
}
|
}
|
||||||
const starterProps = globalScene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr);
|
const starterProps = globalScene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr);
|
||||||
let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0));
|
let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0));
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import type { Biome } from "#app/enums/biome";
|
import type { BiomeId } from "#enums/biome-id";
|
||||||
import { getBiomeKey } from "#app/field/arena";
|
import { getBiomeKey } from "#app/field/arena";
|
||||||
import { BattlePhase } from "./battle-phase";
|
import { BattlePhase } from "./battle-phase";
|
||||||
|
|
||||||
export class SwitchBiomePhase extends BattlePhase {
|
export class SwitchBiomePhase extends BattlePhase {
|
||||||
private nextBiome: Biome;
|
private nextBiome: BiomeId;
|
||||||
|
|
||||||
constructor(nextBiome: Biome) {
|
constructor(nextBiome: BiomeId) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.nextBiome = nextBiome;
|
this.nextBiome = nextBiome;
|
||||||
|
@ -9,7 +9,7 @@ import { ModifierRewardPhase } from "./modifier-reward-phase";
|
|||||||
import { MoneyRewardPhase } from "./money-reward-phase";
|
import { MoneyRewardPhase } from "./money-reward-phase";
|
||||||
import { TrainerSlot } from "#enums/trainer-slot";
|
import { TrainerSlot } from "#enums/trainer-slot";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { Biome } from "#app/enums/biome";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
import { achvs } from "#app/system/achv";
|
import { achvs } from "#app/system/achv";
|
||||||
import { timedEventManager } from "#app/global-event-manager";
|
import { timedEventManager } from "#app/global-event-manager";
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ export class TrainerVictoryPhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
// Breeders in Space achievement
|
// Breeders in Space achievement
|
||||||
if (
|
if (
|
||||||
globalScene.arena.biomeType === Biome.SPACE &&
|
globalScene.arena.biomeType === BiomeId.SPACE &&
|
||||||
(trainerType === TrainerType.BREEDER || trainerType === TrainerType.EXPERT_POKEMON_BREEDER)
|
(trainerType === TrainerType.BREEDER || trainerType === TrainerType.EXPERT_POKEMON_BREEDER)
|
||||||
) {
|
) {
|
||||||
globalScene.validateAchv(achvs.BREEDERS_IN_SPACE);
|
globalScene.validateAchv(achvs.BREEDERS_IN_SPACE);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { applyAbAttrs, BypassSpeedChanceAbAttr, PreventBypassSpeedChanceAbAttr } from "#app/data/abilities/ability";
|
import { applyAbAttrs, BypassSpeedChanceAbAttr, PreventBypassSpeedChanceAbAttr } from "#app/data/abilities/ability";
|
||||||
import { MoveHeaderAttr } from "#app/data/moves/move";
|
import { MoveHeaderAttr } from "#app/data/moves/move";
|
||||||
import { allMoves } from "#app/data/data-lists";
|
import { allMoves } from "#app/data/data-lists";
|
||||||
import { Abilities } from "#app/enums/abilities";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { Stat } from "#app/enums/stat";
|
import { Stat } from "#app/enums/stat";
|
||||||
import type Pokemon from "#app/field/pokemon";
|
import type Pokemon from "#app/field/pokemon";
|
||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
@ -228,7 +228,7 @@ export class TurnStartPhase extends FieldPhase {
|
|||||||
? playerActivePokemon[0]
|
? playerActivePokemon[0]
|
||||||
: playerActivePokemon[1];
|
: playerActivePokemon[1];
|
||||||
// check if either active pokemon has the ability "Run Away"
|
// check if either active pokemon has the ability "Run Away"
|
||||||
const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY));
|
const hasRunAway = playerActivePokemon.find(p => p.hasAbility(AbilityId.RUN_AWAY));
|
||||||
runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon;
|
runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
|
import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asynchronously load the animations and assets for the provided moves.
|
* Asynchronously load the animations and assets for the provided moves.
|
||||||
* @param moveIds - An array of move IDs to load assets for.
|
* @param moveIds - An array of move IDs to load assets for.
|
||||||
*/
|
*/
|
||||||
export async function loadMoveAnimations(moveIds: Moves[]): Promise<void> {
|
export async function loadMoveAnimations(moveIds: MoveId[]): Promise<void> {
|
||||||
await Promise.allSettled(moveIds.map(m => initMoveAnim(m)));
|
await Promise.allSettled(moveIds.map(m => initMoveAnim(m)));
|
||||||
await loadMoveAnimAssets(moveIds);
|
await loadMoveAnimAssets(moveIds);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import { Arena } from "../field/arena";
|
import { Arena } from "../field/arena";
|
||||||
import type { ArenaTag } from "../data/arena-tag";
|
import type { ArenaTag } from "../data/arena-tag";
|
||||||
import { loadArenaTag } from "../data/arena-tag";
|
import { loadArenaTag } from "../data/arena-tag";
|
||||||
import type { Biome } from "#enums/biome";
|
import type { BiomeId } from "#enums/biome-id";
|
||||||
import { Weather } from "../data/weather";
|
import { Weather } from "../data/weather";
|
||||||
import { Terrain } from "#app/data/terrain";
|
import { Terrain } from "#app/data/terrain";
|
||||||
|
|
||||||
export default class ArenaData {
|
export default class ArenaData {
|
||||||
public biome: Biome;
|
public biome: BiomeId;
|
||||||
public weather: Weather | null;
|
public weather: Weather | null;
|
||||||
public terrain: Terrain | null;
|
public terrain: Terrain | null;
|
||||||
public tags: ArenaTag[];
|
public tags: ArenaTag[];
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import type { EggTier } from "#enums/egg-type";
|
import type { EggTier } from "#enums/egg-type";
|
||||||
import type { Species } from "#enums/species";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
import type { VariantTier } from "#enums/variant-tier";
|
import type { VariantTier } from "#enums/variant-tier";
|
||||||
import { EGG_SEED, Egg } from "../data/egg";
|
import { EGG_SEED, Egg } from "../data/egg";
|
||||||
import type { EggSourceType } from "#app/enums/egg-source-types";
|
import type { EggSourceType } from "#app/enums/egg-source-types";
|
||||||
@ -12,7 +12,7 @@ export default class EggData {
|
|||||||
public timestamp: number;
|
public timestamp: number;
|
||||||
public variantTier: VariantTier;
|
public variantTier: VariantTier;
|
||||||
public isShiny: boolean;
|
public isShiny: boolean;
|
||||||
public species: Species;
|
public species: SpeciesId;
|
||||||
public eggMoveIndex: number;
|
public eggMoveIndex: number;
|
||||||
public overrideHiddenAbility: boolean;
|
public overrideHiddenAbility: boolean;
|
||||||
|
|
||||||
|
@ -43,9 +43,9 @@ import { StatusEffect } from "#enums/status-effect";
|
|||||||
import ChallengeData from "#app/system/challenge-data";
|
import ChallengeData from "#app/system/challenge-data";
|
||||||
import { Device } from "#enums/devices";
|
import { Device } from "#enums/devices";
|
||||||
import { GameDataType } from "#enums/game-data-type";
|
import { GameDataType } from "#enums/game-data-type";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { applyChallenges, ChallengeType } from "#app/data/challenge";
|
import { applyChallenges, ChallengeType } from "#app/data/challenge";
|
||||||
import { WeatherType } from "#enums/weather-type";
|
import { WeatherType } from "#enums/weather-type";
|
||||||
import { TerrainType } from "#app/data/terrain";
|
import { TerrainType } from "#app/data/terrain";
|
||||||
@ -63,34 +63,34 @@ import { ArenaTrapTag } from "#app/data/arena-tag";
|
|||||||
import { pokemonFormChanges } from "#app/data/pokemon-forms";
|
import { pokemonFormChanges } from "#app/data/pokemon-forms";
|
||||||
import type { PokemonType } from "#enums/pokemon-type";
|
import type { PokemonType } from "#enums/pokemon-type";
|
||||||
|
|
||||||
export const defaultStarterSpecies: Species[] = [
|
export const defaultStarterSpecies: SpeciesId[] = [
|
||||||
Species.BULBASAUR,
|
SpeciesId.BULBASAUR,
|
||||||
Species.CHARMANDER,
|
SpeciesId.CHARMANDER,
|
||||||
Species.SQUIRTLE,
|
SpeciesId.SQUIRTLE,
|
||||||
Species.CHIKORITA,
|
SpeciesId.CHIKORITA,
|
||||||
Species.CYNDAQUIL,
|
SpeciesId.CYNDAQUIL,
|
||||||
Species.TOTODILE,
|
SpeciesId.TOTODILE,
|
||||||
Species.TREECKO,
|
SpeciesId.TREECKO,
|
||||||
Species.TORCHIC,
|
SpeciesId.TORCHIC,
|
||||||
Species.MUDKIP,
|
SpeciesId.MUDKIP,
|
||||||
Species.TURTWIG,
|
SpeciesId.TURTWIG,
|
||||||
Species.CHIMCHAR,
|
SpeciesId.CHIMCHAR,
|
||||||
Species.PIPLUP,
|
SpeciesId.PIPLUP,
|
||||||
Species.SNIVY,
|
SpeciesId.SNIVY,
|
||||||
Species.TEPIG,
|
SpeciesId.TEPIG,
|
||||||
Species.OSHAWOTT,
|
SpeciesId.OSHAWOTT,
|
||||||
Species.CHESPIN,
|
SpeciesId.CHESPIN,
|
||||||
Species.FENNEKIN,
|
SpeciesId.FENNEKIN,
|
||||||
Species.FROAKIE,
|
SpeciesId.FROAKIE,
|
||||||
Species.ROWLET,
|
SpeciesId.ROWLET,
|
||||||
Species.LITTEN,
|
SpeciesId.LITTEN,
|
||||||
Species.POPPLIO,
|
SpeciesId.POPPLIO,
|
||||||
Species.GROOKEY,
|
SpeciesId.GROOKEY,
|
||||||
Species.SCORBUNNY,
|
SpeciesId.SCORBUNNY,
|
||||||
Species.SOBBLE,
|
SpeciesId.SOBBLE,
|
||||||
Species.SPRIGATITO,
|
SpeciesId.SPRIGATITO,
|
||||||
Species.FUECOCO,
|
SpeciesId.FUECOCO,
|
||||||
Species.QUAXLY,
|
SpeciesId.QUAXLY,
|
||||||
];
|
];
|
||||||
|
|
||||||
const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary
|
const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary
|
||||||
@ -205,7 +205,7 @@ export interface DexEntry {
|
|||||||
ivs: number[];
|
ivs: number[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export type StarterMoveset = [Moves] | [Moves, Moves] | [Moves, Moves, Moves] | [Moves, Moves, Moves, Moves];
|
export type StarterMoveset = [MoveId] | [MoveId, MoveId] | [MoveId, MoveId, MoveId] | [MoveId, MoveId, MoveId, MoveId];
|
||||||
|
|
||||||
export interface StarterFormMoveData {
|
export interface StarterFormMoveData {
|
||||||
[key: number]: StarterMoveset;
|
[key: number]: StarterMoveset;
|
||||||
@ -555,7 +555,7 @@ export class GameData {
|
|||||||
|
|
||||||
this.migrateStarterAbilities(systemData, this.starterData);
|
this.migrateStarterAbilities(systemData, this.starterData);
|
||||||
|
|
||||||
const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as Species);
|
const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as SpeciesId);
|
||||||
for (const s of starterIds) {
|
for (const s of starterIds) {
|
||||||
this.starterData[s].candyCount += systemData.dexData[s].caughtCount;
|
this.starterData[s].candyCount += systemData.dexData[s].caughtCount;
|
||||||
this.starterData[s].candyCount += systemData.dexData[s].hatchedCount * 2;
|
this.starterData[s].candyCount += systemData.dexData[s].hatchedCount * 2;
|
||||||
@ -1720,7 +1720,7 @@ export class GameData {
|
|||||||
private initStarterData(): void {
|
private initStarterData(): void {
|
||||||
const starterData: StarterData = {};
|
const starterData: StarterData = {};
|
||||||
|
|
||||||
const starterSpeciesIds = Object.keys(speciesStarterCosts).map(k => Number.parseInt(k) as Species);
|
const starterSpeciesIds = Object.keys(speciesStarterCosts).map(k => Number.parseInt(k) as SpeciesId);
|
||||||
|
|
||||||
for (const speciesId of starterSpeciesIds) {
|
for (const speciesId of starterSpeciesIds) {
|
||||||
starterData[speciesId] = {
|
starterData[speciesId] = {
|
||||||
@ -1815,16 +1815,16 @@ export class GameData {
|
|||||||
const formKey = pokemon.getFormKey();
|
const formKey = pokemon.getFormKey();
|
||||||
if (formIndex > 0) {
|
if (formIndex > 0) {
|
||||||
// In case a Pikachu with formIndex > 0 was unlocked, base form Pichu is also unlocked
|
// In case a Pikachu with formIndex > 0 was unlocked, base form Pichu is also unlocked
|
||||||
if (pokemon.species.speciesId === Species.PIKACHU && species.speciesId === Species.PICHU) {
|
if (pokemon.species.speciesId === SpeciesId.PIKACHU && species.speciesId === SpeciesId.PICHU) {
|
||||||
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0);
|
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0);
|
||||||
}
|
}
|
||||||
if (pokemon.species.speciesId === Species.URSHIFU) {
|
if (pokemon.species.speciesId === SpeciesId.URSHIFU) {
|
||||||
if (formIndex === 2) {
|
if (formIndex === 2) {
|
||||||
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0);
|
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0);
|
||||||
} else if (formIndex === 3) {
|
} else if (formIndex === 3) {
|
||||||
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(1);
|
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(1);
|
||||||
}
|
}
|
||||||
} else if (pokemon.species.speciesId === Species.ZYGARDE) {
|
} else if (pokemon.species.speciesId === SpeciesId.ZYGARDE) {
|
||||||
if (formIndex === 4) {
|
if (formIndex === 4) {
|
||||||
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(2);
|
dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(2);
|
||||||
} else if (formIndex === 5) {
|
} else if (formIndex === 5) {
|
||||||
@ -1929,7 +1929,7 @@ export class GameData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
incrementRibbonCount(species: PokemonSpecies, forStarter = false): number {
|
incrementRibbonCount(species: PokemonSpecies, forStarter = false): number {
|
||||||
const speciesIdToIncrement: Species = species.getRootSpeciesId(forStarter);
|
const speciesIdToIncrement: SpeciesId = species.getRootSpeciesId(forStarter);
|
||||||
|
|
||||||
if (!this.starterData[speciesIdToIncrement].classicWinCount) {
|
if (!this.starterData[speciesIdToIncrement].classicWinCount) {
|
||||||
this.starterData[speciesIdToIncrement].classicWinCount = 0;
|
this.starterData[speciesIdToIncrement].classicWinCount = 0;
|
||||||
@ -2040,7 +2040,7 @@ export class GameData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//recursively unlock nature for species and prevolutions
|
//recursively unlock nature for species and prevolutions
|
||||||
const _unlockSpeciesNature = (speciesId: Species) => {
|
const _unlockSpeciesNature = (speciesId: SpeciesId) => {
|
||||||
this.dexData[speciesId].natureAttr |= 1 << (nature + 1);
|
this.dexData[speciesId].natureAttr |= 1 << (nature + 1);
|
||||||
if (pokemonPrevolutions.hasOwnProperty(speciesId)) {
|
if (pokemonPrevolutions.hasOwnProperty(speciesId)) {
|
||||||
_unlockSpeciesNature(pokemonPrevolutions[speciesId]);
|
_unlockSpeciesNature(pokemonPrevolutions[speciesId]);
|
||||||
@ -2049,7 +2049,7 @@ export class GameData {
|
|||||||
_unlockSpeciesNature(species.speciesId);
|
_unlockSpeciesNature(species.speciesId);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSpeciesDexIvs(speciesId: Species, ivs: number[]): void {
|
updateSpeciesDexIvs(speciesId: SpeciesId, ivs: number[]): void {
|
||||||
let dexEntry: DexEntry;
|
let dexEntry: DexEntry;
|
||||||
do {
|
do {
|
||||||
dexEntry = globalScene.gameData.dexData[speciesId];
|
dexEntry = globalScene.gameData.dexData[speciesId];
|
||||||
@ -2180,7 +2180,7 @@ export class GameData {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
getSpeciesStarterValue(speciesId: Species): number {
|
getSpeciesStarterValue(speciesId: SpeciesId): number {
|
||||||
const baseValue = speciesStarterCosts[speciesId];
|
const baseValue = speciesStarterCosts[speciesId];
|
||||||
let value = baseValue;
|
let value = baseValue;
|
||||||
|
|
||||||
@ -2231,7 +2231,7 @@ export class GameData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
migrateStarterAbilities(systemData: SystemSaveData, initialStarterData?: StarterData): void {
|
migrateStarterAbilities(systemData: SystemSaveData, initialStarterData?: StarterData): void {
|
||||||
const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as Species);
|
const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as SpeciesId);
|
||||||
const starterData = initialStarterData || systemData.starterData;
|
const starterData = initialStarterData || systemData.starterData;
|
||||||
const dexData = systemData.dexData;
|
const dexData = systemData.dexData;
|
||||||
for (const s of starterIds) {
|
for (const s of starterIds) {
|
||||||
|
@ -8,16 +8,16 @@ import { Status } from "../data/status-effect";
|
|||||||
import Pokemon, { EnemyPokemon, PokemonBattleData, PokemonMove, PokemonSummonData } from "../field/pokemon";
|
import Pokemon, { EnemyPokemon, PokemonBattleData, PokemonMove, PokemonSummonData } from "../field/pokemon";
|
||||||
import { TrainerSlot } from "#enums/trainer-slot";
|
import { TrainerSlot } from "#enums/trainer-slot";
|
||||||
import type { Variant } from "#app/sprites/variant";
|
import type { Variant } from "#app/sprites/variant";
|
||||||
import type { Biome } from "#enums/biome";
|
import type { BiomeId } from "#enums/biome-id";
|
||||||
import type { Moves } from "#enums/moves";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import type { Species } from "#enums/species";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
import { CustomPokemonData } from "#app/data/custom-pokemon-data";
|
import { CustomPokemonData } from "#app/data/custom-pokemon-data";
|
||||||
import type { PokemonType } from "#enums/pokemon-type";
|
import type { PokemonType } from "#enums/pokemon-type";
|
||||||
|
|
||||||
export default class PokemonData {
|
export default class PokemonData {
|
||||||
public id: number;
|
public id: number;
|
||||||
public player: boolean;
|
public player: boolean;
|
||||||
public species: Species;
|
public species: SpeciesId;
|
||||||
public nickname: string;
|
public nickname: string;
|
||||||
public formIndex: number;
|
public formIndex: number;
|
||||||
public abilityIndex: number;
|
public abilityIndex: number;
|
||||||
@ -37,19 +37,19 @@ export default class PokemonData {
|
|||||||
public status: Status | null;
|
public status: Status | null;
|
||||||
public friendship: number;
|
public friendship: number;
|
||||||
public metLevel: number;
|
public metLevel: number;
|
||||||
public metBiome: Biome | -1; // -1 for starters
|
public metBiome: BiomeId | -1; // -1 for starters
|
||||||
public metSpecies: Species;
|
public metSpecies: SpeciesId;
|
||||||
public metWave: number; // 0 for unknown (previous saves), -1 for starters
|
public metWave: number; // 0 for unknown (previous saves), -1 for starters
|
||||||
public luck: number;
|
public luck: number;
|
||||||
public pauseEvolutions: boolean;
|
public pauseEvolutions: boolean;
|
||||||
public pokerus: boolean;
|
public pokerus: boolean;
|
||||||
public usedTMs: Moves[];
|
public usedTMs: MoveId[];
|
||||||
public evoCounter: number;
|
public evoCounter: number;
|
||||||
public teraType: PokemonType;
|
public teraType: PokemonType;
|
||||||
public isTerastallized: boolean;
|
public isTerastallized: boolean;
|
||||||
public stellarTypesBoosted: PokemonType[];
|
public stellarTypesBoosted: PokemonType[];
|
||||||
|
|
||||||
public fusionSpecies: Species;
|
public fusionSpecies: SpeciesId;
|
||||||
public fusionFormIndex: number;
|
public fusionFormIndex: number;
|
||||||
public fusionAbilityIndex: number;
|
public fusionAbilityIndex: number;
|
||||||
public fusionShiny: boolean;
|
public fusionShiny: boolean;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { SystemSaveMigrator } from "#app/@types/SystemSaveMigrator";
|
import type { SystemSaveMigrator } from "#app/@types/SystemSaveMigrator";
|
||||||
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
import { DexAttr, type SystemSaveData } from "#app/system/game-data";
|
import { DexAttr, type SystemSaveData } from "#app/system/game-data";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If a starter is caught, but the only forms registered as caught are not starterSelectable,
|
* If a starter is caught, but the only forms registered as caught are not starterSelectable,
|
||||||
@ -17,7 +17,7 @@ const migratePichuForms: SystemSaveMigrator = {
|
|||||||
const caughtAttr = data.dexData[sd]?.caughtAttr;
|
const caughtAttr = data.dexData[sd]?.caughtAttr;
|
||||||
const species = getPokemonSpecies(sd);
|
const species = getPokemonSpecies(sd);
|
||||||
// An extra check because you never know
|
// An extra check because you never know
|
||||||
if (species.speciesId === Species.PICHU && caughtAttr) {
|
if (species.speciesId === SpeciesId.PICHU && caughtAttr) {
|
||||||
// Ensuring that only existing forms are unlocked
|
// Ensuring that only existing forms are unlocked
|
||||||
data.dexData[sd].caughtAttr &= species.getFullUnlocksData();
|
data.dexData[sd].caughtAttr &= species.getFullUnlocksData();
|
||||||
// If no forms are unlocked now, since Pichu is caught, we unlock form 0
|
// If no forms are unlocked now, since Pichu is caught, we unlock form 0
|
||||||
|
@ -2,7 +2,7 @@ import type { SessionSaveMigrator } from "#app/@types/SessionSaveMigrator";
|
|||||||
import { PokemonMove } from "#app/field/pokemon";
|
import { PokemonMove } from "#app/field/pokemon";
|
||||||
import type { SessionSaveData } from "#app/system/game-data";
|
import type { SessionSaveData } from "#app/system/game-data";
|
||||||
import type PokemonData from "#app/system/pokemon-data";
|
import type PokemonData from "#app/system/pokemon-data";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Migrate all lingering rage fist data inside `CustomPokemonData`,
|
* Migrate all lingering rage fist data inside `CustomPokemonData`,
|
||||||
@ -15,7 +15,7 @@ const migratePartyData: SessionSaveMigrator = {
|
|||||||
// this stuff is copied straight from the constructor fwiw
|
// this stuff is copied straight from the constructor fwiw
|
||||||
const mapParty = (pkmnData: PokemonData) => {
|
const mapParty = (pkmnData: PokemonData) => {
|
||||||
// remove empty moves from moveset
|
// remove empty moves from moveset
|
||||||
pkmnData.moveset = (pkmnData.moveset ?? [new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL)])
|
pkmnData.moveset = (pkmnData.moveset ?? [new PokemonMove(MoveId.TACKLE), new PokemonMove(MoveId.GROWL)])
|
||||||
.filter(m => !!m)
|
.filter(m => !!m)
|
||||||
.map(m => PokemonMove.loadMove(m));
|
.map(m => PokemonMove.loadMove(m));
|
||||||
// only edit summondata moveset if exists
|
// only edit summondata moveset if exists
|
||||||
|
@ -3,7 +3,7 @@ import { TextStyle, addTextObject } from "#app/ui/text";
|
|||||||
import type { nil } from "#app/utils/common";
|
import type { nil } from "#app/utils/common";
|
||||||
import { isNullOrUndefined } from "#app/utils/common";
|
import { isNullOrUndefined } from "#app/utils/common";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import type { WeatherPoolEntry } from "#app/data/weather";
|
import type { WeatherPoolEntry } from "#app/data/weather";
|
||||||
import { WeatherType } from "#enums/weather-type";
|
import { WeatherType } from "#enums/weather-type";
|
||||||
import { CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER } from "./data/balance/starters";
|
import { CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER } from "./data/balance/starters";
|
||||||
@ -26,7 +26,7 @@ interface EventBanner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface EventEncounter {
|
interface EventEncounter {
|
||||||
species: Species;
|
species: SpeciesId;
|
||||||
blockEvolution?: boolean;
|
blockEvolution?: boolean;
|
||||||
formIndex?: number;
|
formIndex?: number;
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ interface TimedEvent extends EventBanner {
|
|||||||
delibirdyBuff?: string[];
|
delibirdyBuff?: string[];
|
||||||
weather?: WeatherPoolEntry[];
|
weather?: WeatherPoolEntry[];
|
||||||
mysteryEncounterTierChanges?: EventMysteryEncounterTier[];
|
mysteryEncounterTierChanges?: EventMysteryEncounterTier[];
|
||||||
luckBoostedSpecies?: Species[];
|
luckBoostedSpecies?: SpeciesId[];
|
||||||
boostFusions?: boolean; //MODIFIER REWORK PLEASE
|
boostFusions?: boolean; //MODIFIER REWORK PLEASE
|
||||||
classicWaveRewards?: EventWaveReward[]; // Rival battle rewards
|
classicWaveRewards?: EventWaveReward[]; // Rival battle rewards
|
||||||
trainerShinyChance?: number; // Odds over 65536 of trainer mon generating as shiny
|
trainerShinyChance?: number; // Odds over 65536 of trainer mon generating as shiny
|
||||||
@ -82,26 +82,26 @@ const timedEvents: TimedEvent[] = [
|
|||||||
scale: 0.21,
|
scale: 0.21,
|
||||||
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
||||||
eventEncounters: [
|
eventEncounters: [
|
||||||
{ species: Species.GIMMIGHOUL, blockEvolution: true },
|
{ species: SpeciesId.GIMMIGHOUL, blockEvolution: true },
|
||||||
{ species: Species.DELIBIRD },
|
{ species: SpeciesId.DELIBIRD },
|
||||||
{ species: Species.STANTLER },
|
{ species: SpeciesId.STANTLER },
|
||||||
{ species: Species.CYNDAQUIL },
|
{ species: SpeciesId.CYNDAQUIL },
|
||||||
{ species: Species.PIPLUP },
|
{ species: SpeciesId.PIPLUP },
|
||||||
{ species: Species.CHESPIN },
|
{ species: SpeciesId.CHESPIN },
|
||||||
{ species: Species.BALTOY },
|
{ species: SpeciesId.BALTOY },
|
||||||
{ species: Species.SNOVER },
|
{ species: SpeciesId.SNOVER },
|
||||||
{ species: Species.CHINGLING },
|
{ species: SpeciesId.CHINGLING },
|
||||||
{ species: Species.LITWICK },
|
{ species: SpeciesId.LITWICK },
|
||||||
{ species: Species.CUBCHOO },
|
{ species: SpeciesId.CUBCHOO },
|
||||||
{ species: Species.SWIRLIX },
|
{ species: SpeciesId.SWIRLIX },
|
||||||
{ species: Species.AMAURA },
|
{ species: SpeciesId.AMAURA },
|
||||||
{ species: Species.MUDBRAY },
|
{ species: SpeciesId.MUDBRAY },
|
||||||
{ species: Species.ROLYCOLY },
|
{ species: SpeciesId.ROLYCOLY },
|
||||||
{ species: Species.MILCERY },
|
{ species: SpeciesId.MILCERY },
|
||||||
{ species: Species.SMOLIV },
|
{ species: SpeciesId.SMOLIV },
|
||||||
{ species: Species.ALOLA_VULPIX },
|
{ species: SpeciesId.ALOLA_VULPIX },
|
||||||
{ species: Species.GALAR_DARUMAKA },
|
{ species: SpeciesId.GALAR_DARUMAKA },
|
||||||
{ species: Species.IRON_BUNDLE },
|
{ species: SpeciesId.IRON_BUNDLE },
|
||||||
],
|
],
|
||||||
delibirdyBuff: ["CATCHING_CHARM", "SHINY_CHARM", "ABILITY_CHARM", "EXP_CHARM", "SUPER_EXP_CHARM", "HEALING_CHARM"],
|
delibirdyBuff: ["CATCHING_CHARM", "SHINY_CHARM", "ABILITY_CHARM", "EXP_CHARM", "SUPER_EXP_CHARM", "HEALING_CHARM"],
|
||||||
weather: [{ weatherType: WeatherType.SNOW, weight: 1 }],
|
weather: [{ weatherType: WeatherType.SNOW, weight: 1 }],
|
||||||
@ -138,59 +138,59 @@ const timedEvents: TimedEvent[] = [
|
|||||||
scale: 0.21,
|
scale: 0.21,
|
||||||
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
||||||
eventEncounters: [
|
eventEncounters: [
|
||||||
{ species: Species.EKANS },
|
{ species: SpeciesId.EKANS },
|
||||||
{ species: Species.ONIX },
|
{ species: SpeciesId.ONIX },
|
||||||
{ species: Species.DRATINI },
|
{ species: SpeciesId.DRATINI },
|
||||||
{ species: Species.CLEFFA },
|
{ species: SpeciesId.CLEFFA },
|
||||||
{ species: Species.UMBREON },
|
{ species: SpeciesId.UMBREON },
|
||||||
{ species: Species.DUNSPARCE },
|
{ species: SpeciesId.DUNSPARCE },
|
||||||
{ species: Species.TEDDIURSA },
|
{ species: SpeciesId.TEDDIURSA },
|
||||||
{ species: Species.SEVIPER },
|
{ species: SpeciesId.SEVIPER },
|
||||||
{ species: Species.LUNATONE },
|
{ species: SpeciesId.LUNATONE },
|
||||||
{ species: Species.CHINGLING },
|
{ species: SpeciesId.CHINGLING },
|
||||||
{ species: Species.SNIVY },
|
{ species: SpeciesId.SNIVY },
|
||||||
{ species: Species.DARUMAKA },
|
{ species: SpeciesId.DARUMAKA },
|
||||||
{ species: Species.DRAMPA },
|
{ species: SpeciesId.DRAMPA },
|
||||||
{ species: Species.SILICOBRA },
|
{ species: SpeciesId.SILICOBRA },
|
||||||
{ species: Species.BLOODMOON_URSALUNA },
|
{ species: SpeciesId.BLOODMOON_URSALUNA },
|
||||||
],
|
],
|
||||||
luckBoostedSpecies: [
|
luckBoostedSpecies: [
|
||||||
Species.EKANS,
|
SpeciesId.EKANS,
|
||||||
Species.ARBOK,
|
SpeciesId.ARBOK,
|
||||||
Species.ONIX,
|
SpeciesId.ONIX,
|
||||||
Species.STEELIX,
|
SpeciesId.STEELIX,
|
||||||
Species.DRATINI,
|
SpeciesId.DRATINI,
|
||||||
Species.DRAGONAIR,
|
SpeciesId.DRAGONAIR,
|
||||||
Species.DRAGONITE,
|
SpeciesId.DRAGONITE,
|
||||||
Species.CLEFFA,
|
SpeciesId.CLEFFA,
|
||||||
Species.CLEFAIRY,
|
SpeciesId.CLEFAIRY,
|
||||||
Species.CLEFABLE,
|
SpeciesId.CLEFABLE,
|
||||||
Species.UMBREON,
|
SpeciesId.UMBREON,
|
||||||
Species.DUNSPARCE,
|
SpeciesId.DUNSPARCE,
|
||||||
Species.DUDUNSPARCE,
|
SpeciesId.DUDUNSPARCE,
|
||||||
Species.TEDDIURSA,
|
SpeciesId.TEDDIURSA,
|
||||||
Species.URSARING,
|
SpeciesId.URSARING,
|
||||||
Species.URSALUNA,
|
SpeciesId.URSALUNA,
|
||||||
Species.SEVIPER,
|
SpeciesId.SEVIPER,
|
||||||
Species.LUNATONE,
|
SpeciesId.LUNATONE,
|
||||||
Species.RAYQUAZA,
|
SpeciesId.RAYQUAZA,
|
||||||
Species.CHINGLING,
|
SpeciesId.CHINGLING,
|
||||||
Species.CHIMECHO,
|
SpeciesId.CHIMECHO,
|
||||||
Species.CRESSELIA,
|
SpeciesId.CRESSELIA,
|
||||||
Species.DARKRAI,
|
SpeciesId.DARKRAI,
|
||||||
Species.SNIVY,
|
SpeciesId.SNIVY,
|
||||||
Species.SERVINE,
|
SpeciesId.SERVINE,
|
||||||
Species.SERPERIOR,
|
SpeciesId.SERPERIOR,
|
||||||
Species.DARUMAKA,
|
SpeciesId.DARUMAKA,
|
||||||
Species.DARMANITAN,
|
SpeciesId.DARMANITAN,
|
||||||
Species.ZYGARDE,
|
SpeciesId.ZYGARDE,
|
||||||
Species.DRAMPA,
|
SpeciesId.DRAMPA,
|
||||||
Species.LUNALA,
|
SpeciesId.LUNALA,
|
||||||
Species.BLACEPHALON,
|
SpeciesId.BLACEPHALON,
|
||||||
Species.SILICOBRA,
|
SpeciesId.SILICOBRA,
|
||||||
Species.SANDACONDA,
|
SpeciesId.SANDACONDA,
|
||||||
Species.ROARING_MOON,
|
SpeciesId.ROARING_MOON,
|
||||||
Species.BLOODMOON_URSALUNA,
|
SpeciesId.BLOODMOON_URSALUNA,
|
||||||
],
|
],
|
||||||
classicWaveRewards: [
|
classicWaveRewards: [
|
||||||
{ wave: 8, type: "SHINY_CHARM" },
|
{ wave: 8, type: "SHINY_CHARM" },
|
||||||
@ -210,28 +210,28 @@ const timedEvents: TimedEvent[] = [
|
|||||||
scale: 0.21,
|
scale: 0.21,
|
||||||
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
||||||
eventEncounters: [
|
eventEncounters: [
|
||||||
{ species: Species.NIDORAN_F },
|
{ species: SpeciesId.NIDORAN_F },
|
||||||
{ species: Species.NIDORAN_M },
|
{ species: SpeciesId.NIDORAN_M },
|
||||||
{ species: Species.IGGLYBUFF },
|
{ species: SpeciesId.IGGLYBUFF },
|
||||||
{ species: Species.SMOOCHUM },
|
{ species: SpeciesId.SMOOCHUM },
|
||||||
{ species: Species.VOLBEAT },
|
{ species: SpeciesId.VOLBEAT },
|
||||||
{ species: Species.ILLUMISE },
|
{ species: SpeciesId.ILLUMISE },
|
||||||
{ species: Species.ROSELIA },
|
{ species: SpeciesId.ROSELIA },
|
||||||
{ species: Species.LUVDISC },
|
{ species: SpeciesId.LUVDISC },
|
||||||
{ species: Species.WOOBAT },
|
{ species: SpeciesId.WOOBAT },
|
||||||
{ species: Species.FRILLISH },
|
{ species: SpeciesId.FRILLISH },
|
||||||
{ species: Species.ALOMOMOLA },
|
{ species: SpeciesId.ALOMOMOLA },
|
||||||
{ species: Species.FURFROU, formIndex: 1 }, // Heart Trim
|
{ species: SpeciesId.FURFROU, formIndex: 1 }, // Heart Trim
|
||||||
{ species: Species.ESPURR },
|
{ species: SpeciesId.ESPURR },
|
||||||
{ species: Species.SPRITZEE },
|
{ species: SpeciesId.SPRITZEE },
|
||||||
{ species: Species.SWIRLIX },
|
{ species: SpeciesId.SWIRLIX },
|
||||||
{ species: Species.APPLIN },
|
{ species: SpeciesId.APPLIN },
|
||||||
{ species: Species.MILCERY },
|
{ species: SpeciesId.MILCERY },
|
||||||
{ species: Species.INDEEDEE },
|
{ species: SpeciesId.INDEEDEE },
|
||||||
{ species: Species.TANDEMAUS },
|
{ species: SpeciesId.TANDEMAUS },
|
||||||
{ species: Species.ENAMORUS },
|
{ species: SpeciesId.ENAMORUS },
|
||||||
],
|
],
|
||||||
luckBoostedSpecies: [Species.LUVDISC],
|
luckBoostedSpecies: [SpeciesId.LUVDISC],
|
||||||
classicWaveRewards: [
|
classicWaveRewards: [
|
||||||
{ wave: 8, type: "SHINY_CHARM" },
|
{ wave: 8, type: "SHINY_CHARM" },
|
||||||
{ wave: 8, type: "ABILITY_CHARM" },
|
{ wave: 8, type: "ABILITY_CHARM" },
|
||||||
@ -249,39 +249,39 @@ const timedEvents: TimedEvent[] = [
|
|||||||
scale: 0.21,
|
scale: 0.21,
|
||||||
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"],
|
||||||
eventEncounters: [
|
eventEncounters: [
|
||||||
{ species: Species.PIKACHU, formIndex: 1, blockEvolution: true }, // Partner Form
|
{ species: SpeciesId.PIKACHU, formIndex: 1, blockEvolution: true }, // Partner Form
|
||||||
{ species: Species.EEVEE, formIndex: 1, blockEvolution: true }, // Partner Form
|
{ species: SpeciesId.EEVEE, formIndex: 1, blockEvolution: true }, // Partner Form
|
||||||
{ species: Species.CHIKORITA },
|
{ species: SpeciesId.CHIKORITA },
|
||||||
{ species: Species.TOTODILE },
|
{ species: SpeciesId.TOTODILE },
|
||||||
{ species: Species.TEPIG },
|
{ species: SpeciesId.TEPIG },
|
||||||
],
|
],
|
||||||
luckBoostedSpecies: [
|
luckBoostedSpecies: [
|
||||||
Species.PICHU,
|
SpeciesId.PICHU,
|
||||||
Species.PIKACHU,
|
SpeciesId.PIKACHU,
|
||||||
Species.RAICHU,
|
SpeciesId.RAICHU,
|
||||||
Species.ALOLA_RAICHU,
|
SpeciesId.ALOLA_RAICHU,
|
||||||
Species.PSYDUCK,
|
SpeciesId.PSYDUCK,
|
||||||
Species.GOLDUCK,
|
SpeciesId.GOLDUCK,
|
||||||
Species.EEVEE,
|
SpeciesId.EEVEE,
|
||||||
Species.FLAREON,
|
SpeciesId.FLAREON,
|
||||||
Species.JOLTEON,
|
SpeciesId.JOLTEON,
|
||||||
Species.VAPOREON,
|
SpeciesId.VAPOREON,
|
||||||
Species.ESPEON,
|
SpeciesId.ESPEON,
|
||||||
Species.UMBREON,
|
SpeciesId.UMBREON,
|
||||||
Species.LEAFEON,
|
SpeciesId.LEAFEON,
|
||||||
Species.GLACEON,
|
SpeciesId.GLACEON,
|
||||||
Species.SYLVEON,
|
SpeciesId.SYLVEON,
|
||||||
Species.CHIKORITA,
|
SpeciesId.CHIKORITA,
|
||||||
Species.BAYLEEF,
|
SpeciesId.BAYLEEF,
|
||||||
Species.MEGANIUM,
|
SpeciesId.MEGANIUM,
|
||||||
Species.TOTODILE,
|
SpeciesId.TOTODILE,
|
||||||
Species.CROCONAW,
|
SpeciesId.CROCONAW,
|
||||||
Species.FERALIGATR,
|
SpeciesId.FERALIGATR,
|
||||||
Species.TEPIG,
|
SpeciesId.TEPIG,
|
||||||
Species.PIGNITE,
|
SpeciesId.PIGNITE,
|
||||||
Species.EMBOAR,
|
SpeciesId.EMBOAR,
|
||||||
Species.ZYGARDE,
|
SpeciesId.ZYGARDE,
|
||||||
Species.ETERNAL_FLOETTE,
|
SpeciesId.ETERNAL_FLOETTE,
|
||||||
],
|
],
|
||||||
classicWaveRewards: [
|
classicWaveRewards: [
|
||||||
{ wave: 8, type: "SHINY_CHARM" },
|
{ wave: 8, type: "SHINY_CHARM" },
|
||||||
@ -321,28 +321,28 @@ const timedEvents: TimedEvent[] = [
|
|||||||
shinyMultiplier: 2,
|
shinyMultiplier: 2,
|
||||||
upgradeUnlockedVouchers: true,
|
upgradeUnlockedVouchers: true,
|
||||||
eventEncounters: [
|
eventEncounters: [
|
||||||
{ species: Species.HOPPIP },
|
{ species: SpeciesId.HOPPIP },
|
||||||
{ species: Species.CELEBI },
|
{ species: SpeciesId.CELEBI },
|
||||||
{ species: Species.VOLBEAT },
|
{ species: SpeciesId.VOLBEAT },
|
||||||
{ species: Species.ILLUMISE },
|
{ species: SpeciesId.ILLUMISE },
|
||||||
{ species: Species.SPOINK },
|
{ species: SpeciesId.SPOINK },
|
||||||
{ species: Species.LILEEP },
|
{ species: SpeciesId.LILEEP },
|
||||||
{ species: Species.SHINX },
|
{ species: SpeciesId.SHINX },
|
||||||
{ species: Species.PACHIRISU },
|
{ species: SpeciesId.PACHIRISU },
|
||||||
{ species: Species.CHERUBI },
|
{ species: SpeciesId.CHERUBI },
|
||||||
{ species: Species.MUNCHLAX },
|
{ species: SpeciesId.MUNCHLAX },
|
||||||
{ species: Species.TEPIG },
|
{ species: SpeciesId.TEPIG },
|
||||||
{ species: Species.PANSAGE },
|
{ species: SpeciesId.PANSAGE },
|
||||||
{ species: Species.PANSEAR },
|
{ species: SpeciesId.PANSEAR },
|
||||||
{ species: Species.PANPOUR },
|
{ species: SpeciesId.PANPOUR },
|
||||||
{ species: Species.DARUMAKA },
|
{ species: SpeciesId.DARUMAKA },
|
||||||
{ species: Species.ARCHEN },
|
{ species: SpeciesId.ARCHEN },
|
||||||
{ species: Species.DEERLING, formIndex: 0 }, // Spring Deerling
|
{ species: SpeciesId.DEERLING, formIndex: 0 }, // Spring Deerling
|
||||||
{ species: Species.CLAUNCHER },
|
{ species: SpeciesId.CLAUNCHER },
|
||||||
{ species: Species.WISHIWASHI },
|
{ species: SpeciesId.WISHIWASHI },
|
||||||
{ species: Species.DRAMPA },
|
{ species: SpeciesId.DRAMPA },
|
||||||
{ species: Species.JANGMO_O },
|
{ species: SpeciesId.JANGMO_O },
|
||||||
{ species: Species.APPLIN },
|
{ species: SpeciesId.APPLIN },
|
||||||
],
|
],
|
||||||
classicWaveRewards: [
|
classicWaveRewards: [
|
||||||
{ wave: 8, type: "SHINY_CHARM" },
|
{ wave: 8, type: "SHINY_CHARM" },
|
||||||
@ -510,8 +510,8 @@ export class TimedEventManager {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
getEventLuckBoostedSpecies(): Species[] {
|
getEventLuckBoostedSpecies(): SpeciesId[] {
|
||||||
const ret: Species[] = [];
|
const ret: SpeciesId[] = [];
|
||||||
timedEvents
|
timedEvents
|
||||||
.filter(te => this.isActive(te))
|
.filter(te => this.isActive(te))
|
||||||
.map(te => {
|
.map(te => {
|
||||||
|
@ -6,7 +6,7 @@ import type Move from "#app/data/moves/move";
|
|||||||
import type { BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene";
|
import type { BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene";
|
||||||
import { BattleSceneEventType } from "../events/battle-scene";
|
import { BattleSceneEventType } from "../events/battle-scene";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { UiTheme } from "#enums/ui-theme";
|
import { UiTheme } from "#enums/ui-theme";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ export default class BattleFlyout extends Phaser.GameObjects.Container {
|
|||||||
/** Updates all of the {@linkcode MoveInfo} objects in the moveInfo array */
|
/** Updates all of the {@linkcode MoveInfo} objects in the moveInfo array */
|
||||||
private onMoveUsed(event: Event) {
|
private onMoveUsed(event: Event) {
|
||||||
const moveUsedEvent = event as MoveUsedEvent;
|
const moveUsedEvent = event as MoveUsedEvent;
|
||||||
if (!moveUsedEvent || moveUsedEvent.pokemonId !== this.pokemon?.id || moveUsedEvent.move.id === Moves.STRUGGLE) {
|
if (!moveUsedEvent || moveUsedEvent.pokemonId !== this.pokemon?.id || moveUsedEvent.move.id === MoveId.STRUGGLE) {
|
||||||
// Ignore Struggle
|
// Ignore Struggle
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3,14 +3,14 @@ import { globalScene } from "#app/global-scene";
|
|||||||
import { TextStyle, addTextObject } from "./text";
|
import { TextStyle, addTextObject } from "./text";
|
||||||
import { argbFromRgba } from "@material/material-color-utilities";
|
import { argbFromRgba } from "@material/material-color-utilities";
|
||||||
import { rgbHexToRgba } from "#app/utils/common";
|
import { rgbHexToRgba } from "#app/utils/common";
|
||||||
import type { Species } from "#enums/species";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
export default class CandyBar extends Phaser.GameObjects.Container {
|
export default class CandyBar extends Phaser.GameObjects.Container {
|
||||||
private bg: Phaser.GameObjects.NineSlice;
|
private bg: Phaser.GameObjects.NineSlice;
|
||||||
private candyIcon: Phaser.GameObjects.Sprite;
|
private candyIcon: Phaser.GameObjects.Sprite;
|
||||||
private candyOverlayIcon: Phaser.GameObjects.Sprite;
|
private candyOverlayIcon: Phaser.GameObjects.Sprite;
|
||||||
private countText: Phaser.GameObjects.Text;
|
private countText: Phaser.GameObjects.Text;
|
||||||
private speciesId: Species;
|
private speciesId: SpeciesId;
|
||||||
|
|
||||||
private tween: Phaser.Tweens.Tween | null;
|
private tween: Phaser.Tweens.Tween | null;
|
||||||
private autoHideTimer: NodeJS.Timeout | null;
|
private autoHideTimer: NodeJS.Timeout | null;
|
||||||
@ -47,7 +47,7 @@ export default class CandyBar extends Phaser.GameObjects.Container {
|
|||||||
this.shown = false;
|
this.shown = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
showStarterSpeciesCandy(starterSpeciesId: Species, count: number): Promise<void> {
|
showStarterSpeciesCandy(starterSpeciesId: SpeciesId, count: number): Promise<void> {
|
||||||
return new Promise<void>(resolve => {
|
return new Promise<void>(resolve => {
|
||||||
if (this.shown) {
|
if (this.shown) {
|
||||||
if (this.speciesId === starterSpeciesId) {
|
if (this.speciesId === starterSpeciesId) {
|
||||||
|
@ -10,7 +10,7 @@ import { globalScene } from "#app/global-scene";
|
|||||||
import { TerastallizeAccessModifier } from "#app/modifier/modifier";
|
import { TerastallizeAccessModifier } from "#app/modifier/modifier";
|
||||||
import { PokemonType } from "#enums/pokemon-type";
|
import { PokemonType } from "#enums/pokemon-type";
|
||||||
import { getTypeRgb } from "#app/data/type";
|
import { getTypeRgb } from "#app/data/type";
|
||||||
import { Species } from "#enums/species";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
|
|
||||||
export enum Command {
|
export enum Command {
|
||||||
FIGHT = 0,
|
FIGHT = 0,
|
||||||
@ -198,7 +198,7 @@ export default class CommandUiHandler extends UiHandler {
|
|||||||
const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length;
|
const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length;
|
||||||
const activePokemon = globalScene.getField()[this.fieldIndex];
|
const activePokemon = globalScene.getField()[this.fieldIndex];
|
||||||
const isBlockedForm =
|
const isBlockedForm =
|
||||||
activePokemon.isMega() || activePokemon.isMax() || activePokemon.hasSpecies(Species.NECROZMA, "ultra");
|
activePokemon.isMega() || activePokemon.isMax() || activePokemon.hasSpecies(SpeciesId.NECROZMA, "ultra");
|
||||||
const currentTeras = globalScene.arena.playerTerasUsed;
|
const currentTeras = globalScene.arena.playerTerasUsed;
|
||||||
const plannedTera =
|
const plannedTera =
|
||||||
globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0;
|
globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user