Update final boss fight and restructure some files

pull/14/head
Flashfyre 2024-01-13 12:24:24 -05:00
parent 25972b68ea
commit 052564f902
52 changed files with 2018 additions and 1669 deletions

View File

@ -1,7 +1,7 @@
{ {
"name": "pokemon-rogue-battle", "name": "pokemon-rogue-battle",
"private": true, "private": true,
"version": "0.0.1", "version": "1.0.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"start": "vite", "start": "vite",

Binary file not shown.

Binary file not shown.

View File

@ -1,28 +1,23 @@
import BattleScene from "./battle-scene"; import BattleScene from "./battle-scene";
import { Biome, BiomePoolTier, BiomeTierPokemonPools, PokemonPools, BiomeTierTrainerPools, biomePokemonPools, biomeTrainerPools } from "./data/biome"; import { BiomePoolTier, BiomeTierPokemonPools, PokemonPools, BiomeTierTrainerPools, biomePokemonPools, biomeTrainerPools } from "./data/biomes";
import { Biome } from "./data/enums/biome";
import * as Utils from "./utils"; import * as Utils from "./utils";
import PokemonSpecies, { getPokemonSpecies } from "./data/pokemon-species"; import PokemonSpecies, { getPokemonSpecies } from "./data/pokemon-species";
import { Species } from "./data/species"; import { Species } from "./data/enums/species";
import { Weather, WeatherType, getWeatherClearMessage, getWeatherStartMessage } from "./data/weather"; import { Weather, WeatherType, getWeatherClearMessage, getWeatherStartMessage } from "./data/weather";
import { CommonAnimPhase } from "./battle-phases"; import { CommonAnimPhase } from "./battle-phases";
import { CommonAnim } from "./data/battle-anims"; import { CommonAnim } from "./data/battle-anims";
import { Type } from "./data/type"; import { Type } from "./data/type";
import Move, { Moves } from "./data/move"; import Move from "./data/move";
import { ArenaTag, ArenaTagType, getArenaTag } from "./data/arena-tag"; import { ArenaTag, ArenaTagType, getArenaTag } from "./data/arena-tag";
import { GameMode } from "./game-mode"; import { GameMode } from "./game-mode";
import { TrainerType } from "./data/trainer-type"; import { TrainerType } from "./data/enums/trainer-type";
import { BattlerIndex } from "./battle"; import { BattlerIndex } from "./battle";
import { Moves } from "./data/enums/moves";
import { TimeOfDay } from "./data/enums/time-of-day";
const WEATHER_OVERRIDE = WeatherType.NONE; const WEATHER_OVERRIDE = WeatherType.NONE;
export enum TimeOfDay {
ALL = -1,
DAWN,
DAY,
DUSK,
NIGHT
}
export class Arena { export class Arena {
public scene: BattleScene; public scene: BattleScene;
public biomeType: Biome; public biomeType: Biome;

View File

@ -1,7 +1,8 @@
import BattleScene, { bypassLogin, startingLevel, startingWave } from "./battle-scene"; import BattleScene, { bypassLogin, startingLevel, startingWave } from "./battle-scene";
import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./pokemon"; import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./pokemon";
import * as Utils from './utils'; import * as Utils from './utils';
import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveCategory, MoveEffectAttr, MoveFlags, Moves, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, OneHitKOAttr, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, DelayedAttackAttr, RechargeAttr } from "./data/move"; import { Moves } from "./data/enums/moves";
import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveCategory, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, OneHitKOAttr, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, DelayedAttackAttr, RechargeAttr } from "./data/move";
import { Mode } from './ui/ui'; import { Mode } from './ui/ui';
import { Command } from "./ui/command-ui-handler"; import { Command } from "./ui/command-ui-handler";
import { Stat } from "./data/pokemon-stat"; import { Stat } from "./data/pokemon-stat";
@ -15,10 +16,13 @@ import EvolutionSceneHandler from "./ui/evolution-scene-handler";
import { EvolutionPhase } from "./evolution-phase"; import { EvolutionPhase } from "./evolution-phase";
import { BattlePhase } from "./battle-phase"; import { BattlePhase } from "./battle-phase";
import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat"; import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat";
import { Biome, biomeDepths, biomeLinks } from "./data/biome"; import { biomeDepths, biomeLinks } from "./data/biomes";
import { FusePokemonModifierType, ModifierPoolType, ModifierTier, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, RememberMoveModifierType, TmModifierType, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import { Biome } from "./data/enums/biome";
import { ModifierTier } from "./modifier/modifier-tier";
import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, RememberMoveModifierType, TmModifierType, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type";
import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
import { BattlerTagLapseType, BattlerTagType, EncoreTag, HideSpriteTag as HiddenTag, TrappedTag } from "./data/battler-tag"; import { BattlerTagLapseType, EncoreTag, HideSpriteTag as HiddenTag, TrappedTag } from "./data/battler-tags";
import { BattlerTagType } from "./data/enums/battler-tag-type";
import { getPokemonMessage } from "./messages"; import { getPokemonMessage } from "./messages";
import { Starter } from "./ui/starter-select-ui-handler"; import { Starter } from "./ui/starter-select-ui-handler";
import { Gender } from "./data/gender"; import { Gender } from "./data/gender";
@ -29,17 +33,20 @@ import { Abilities, CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, PostAtt
import { Unlockables, getUnlockableName } from "./system/unlockables"; import { Unlockables, getUnlockableName } from "./system/unlockables";
import { getBiomeKey } from "./arena"; import { getBiomeKey } from "./arena";
import { BattleType, BattlerIndex, TurnCommand } from "./battle"; import { BattleType, BattlerIndex, TurnCommand } from "./battle";
import { BattleSpec } from "./enums/battle-spec";
import { GameMode } from "./game-mode"; import { GameMode } from "./game-mode";
import { Species } from "./data/species"; import { Species } from "./data/enums/species";
import { HealAchv, LevelAchv, MoneyAchv, achvs } from "./system/achv"; import { HealAchv, LevelAchv, MoneyAchv, achvs } from "./system/achv";
import { TrainerType, trainerConfigs } from "./data/trainer-type"; import { trainerConfigs } from "./data/trainer-config";
import { TrainerType } from "./data/enums/trainer-type";
import { EggHatchPhase } from "./egg-hatch-phase"; import { EggHatchPhase } from "./egg-hatch-phase";
import { Egg } from "./data/egg"; import { Egg } from "./data/egg";
import { vouchers } from "./system/voucher"; import { vouchers } from "./system/voucher";
import { loggedInUser, updateUserInfo } from "./account"; import { loggedInUser, updateUserInfo } from "./account";
import { GameDataType } from "./system/game-data"; import { GameDataType } from "./system/game-data";
import { addPokeballCaptureStars, addPokeballOpenParticles } from "./anims"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "./anims";
import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangeMoveUsedTrigger } from "./data/pokemon-forms"; import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangeMoveUsedTrigger } from "./data/pokemon-forms";
import { battleSpecDialogue } from "./data/dialogue";
export class LoginPhase extends BattlePhase { export class LoginPhase extends BattlePhase {
private showText: boolean; private showText: boolean;
@ -364,7 +371,7 @@ export class EncounterPhase extends BattlePhase {
super.start(); super.start();
this.scene.initSession(); this.scene.initSession();
const loadEnemyAssets = []; const loadEnemyAssets = [];
const battle = this.scene.currentBattle; const battle = this.scene.currentBattle;
@ -389,8 +396,9 @@ export class EncounterPhase extends BattlePhase {
this.scene.gameData.setPokemonSeen(enemyPokemon); this.scene.gameData.setPokemonSeen(enemyPokemon);
} }
if (this.scene.gameMode === GameMode.CLASSIC && (battle.waveIndex === 200 || !(battle.waveIndex % 250)) && enemyPokemon.species.speciesId === Species.ETERNATUS) { if (this.scene.gameMode === GameMode.CLASSIC && (battle.battleSpec === BattleSpec.FINAL_BOSS || !(battle.waveIndex % 250)) && enemyPokemon.species.speciesId === Species.ETERNATUS) {
enemyPokemon.formIndex = 1; if (battle.battleSpec !== BattleSpec.FINAL_BOSS)
enemyPokemon.formIndex = 1;
enemyPokemon.setBoss(); enemyPokemon.setBoss();
} }
@ -462,11 +470,28 @@ export class EncounterPhase extends BattlePhase {
targets: [ this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer ].flat(), targets: [ this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer ].flat(),
x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300,
duration: 2000, duration: 2000,
onComplete: () => this.doEncounterCommon() onComplete: () => {
if (!this.tryOverrideForBattleSpec())
this.doEncounterCommon();
}
}); });
} }
doEncounterCommon() { getEncounterMessage(): string {
const enemyField = this.scene.getEnemyField();
if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS)
return `${enemyField[0].name} appeared.`;
if (this.scene.currentBattle.battleType === BattleType.TRAINER)
return `${this.scene.currentBattle.trainer.getName()}\nwould like to battle!`;
return enemyField.length === 1
? `A wild ${enemyField[0].name} appeared!`
: `A wild ${enemyField[0].name}\nand ${enemyField[1].name} appeared!`;
}
doEncounterCommon(showEncounterMessage: boolean = true) {
const enemyField = this.scene.getEnemyField(); const enemyField = this.scene.getEnemyField();
if (this.scene.currentBattle.battleType === BattleType.WILD) { if (this.scene.currentBattle.battleType === BattleType.WILD) {
@ -477,10 +502,10 @@ export class EncounterPhase extends BattlePhase {
if (enemyPokemon.isShiny()) if (enemyPokemon.isShiny())
this.scene.validateAchv(achvs.SEE_SHINY); this.scene.validateAchv(achvs.SEE_SHINY);
}); });
let text = enemyField.length === 1 if (showEncounterMessage)
? `A wild ${enemyField[0].name} appeared!` this.scene.ui.showText(this.getEncounterMessage(), null, () => this.end(), 1500);
: `A wild ${enemyField[0].name}\nand ${enemyField[1].name} appeared!`; else
this.scene.ui.showText(text, null, () => this.end(), 1500); this.end();
} else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) {
const trainer = this.scene.currentBattle.trainer; const trainer = this.scene.currentBattle.trainer;
trainer.untint(100, 'Sine.easeOut'); trainer.untint(100, 'Sine.easeOut');
@ -491,8 +516,7 @@ export class EncounterPhase extends BattlePhase {
this.scene.playBgm(undefined); this.scene.playBgm(undefined);
this.scene.pbTray.showPbTray(this.scene.getParty()); this.scene.pbTray.showPbTray(this.scene.getParty());
this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty());
const text = `${this.scene.currentBattle.trainer.getName()}\nwould like to battle!`; const doTrainerSummon = () => {
this.scene.ui.showText(text, null, () => {
this.scene.tweens.add({ this.scene.tweens.add({
targets: this.scene.currentBattle.trainer, targets: this.scene.currentBattle.trainer,
x: '+=16', x: '+=16',
@ -506,7 +530,11 @@ export class EncounterPhase extends BattlePhase {
if (this.scene.currentBattle.double && availablePartyMembers > 1) if (this.scene.currentBattle.double && availablePartyMembers > 1)
this.scene.unshiftPhase(new SummonPhase(this.scene, 1, false)); this.scene.unshiftPhase(new SummonPhase(this.scene, 1, false));
this.end(); this.end();
}, 1500, true); };
if (showEncounterMessage)
this.scene.ui.showText(this.getEncounterMessage(), null, doTrainerSummon, 1500, true);
else
doTrainerSummon();
}; };
if (!trainer.config.encounterMessages.length) if (!trainer.config.encounterMessages.length)
@ -514,13 +542,7 @@ export class EncounterPhase extends BattlePhase {
else { else {
let message: string; let message: string;
this.scene.executeWithSeedOffset(() => message = Phaser.Math.RND.pick(this.scene.currentBattle.trainer.config.encounterMessages), this.scene.currentBattle.waveIndex); this.scene.executeWithSeedOffset(() => message = Phaser.Math.RND.pick(this.scene.currentBattle.trainer.config.encounterMessages), this.scene.currentBattle.waveIndex);
const messagePages = message.split(/\$/g).map(m => m.trim()); this.scene.ui.showDialogue(message, trainer.getName(), null, doSummon, null, true);
let showMessageAndSummon = () => doSummon();
for (let p = messagePages.length - 1; p >= 0; p--) {
const originalFunc = showMessageAndSummon;
showMessageAndSummon = () => this.scene.ui.showDialogue(messagePages[p], trainer.getName(), null, originalFunc, null, true);
}
showMessageAndSummon();
} }
} }
} }
@ -570,6 +592,21 @@ export class EncounterPhase extends BattlePhase {
super.end(); super.end();
} }
tryOverrideForBattleSpec(): boolean {
switch (this.scene.currentBattle.battleSpec) {
case BattleSpec.FINAL_BOSS:
const enemy = this.scene.getEnemyPokemon();
this.scene.ui.showText(this.getEncounterMessage(), null, () => {
this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].encounter, enemy.name, null, () => {
this.doEncounterCommon(false);
}, null, true);
}, 1500, true);
return true;
}
return false;
}
} }
export class NextEncounterPhase extends EncounterPhase { export class NextEncounterPhase extends EncounterPhase {
@ -592,7 +629,8 @@ export class NextEncounterPhase extends EncounterPhase {
if (this.scene.lastEnemyTrainer) if (this.scene.lastEnemyTrainer)
this.scene.lastEnemyTrainer.destroy(); this.scene.lastEnemyTrainer.destroy();
this.doEncounterCommon(); if (!this.tryOverrideForBattleSpec())
this.doEncounterCommon();
} }
}); });
} }
@ -616,7 +654,10 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase {
targets: [ this.scene.arenaEnemy, enemyField ].flat(), targets: [ this.scene.arenaEnemy, enemyField ].flat(),
x: '+=300', x: '+=300',
duration: 2000, duration: 2000,
onComplete: () => this.doEncounterCommon() onComplete: () => {
if (!this.tryOverrideForBattleSpec())
this.doEncounterCommon();
}
}); });
} }
} }
@ -1604,7 +1645,7 @@ export class CommonAnimPhase extends PokemonPhase {
} }
export class MovePhase extends BattlePhase { export class MovePhase extends BattlePhase {
protected pokemon: Pokemon; public pokemon: Pokemon;
protected targets: BattlerIndex[]; protected targets: BattlerIndex[];
protected move: PokemonMove; protected move: PokemonMove;
protected followUp: boolean; protected followUp: boolean;
@ -2337,6 +2378,26 @@ export class DamagePhase extends PokemonPhase {
} else } else
this.getPokemon().updateInfo().then(() => this.end()); this.getPokemon().updateInfo().then(() => this.end());
} }
end() {
switch (this.scene.currentBattle.battleSpec) {
case BattleSpec.FINAL_BOSS:
const pokemon = this.getPokemon();
if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && !pokemon.bossSegmentIndex) {
this.scene.fadeOutBgm(Utils.fixedInt(2000), false);
this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.name, null, () => {
this.scene.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true);
pokemon.generateAndPopulateMoveset(1);
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
super.end();
}, null, true);
return;
}
break;
}
super.end();
}
} }
export class FaintPhase extends PokemonPhase { export class FaintPhase extends PokemonPhase {
@ -2372,6 +2433,13 @@ export class FaintPhase extends PokemonPhase {
} }
} }
if (!this.tryOverrideForBattleSpec())
this.doFaint();
}
doFaint(): void {
const pokemon = this.getPokemon();
this.scene.queueMessage(getPokemonMessage(pokemon, ' fainted!'), null, true); this.scene.queueMessage(getPokemonMessage(pokemon, ' fainted!'), null, true);
if (this.player) { if (this.player) {
@ -2416,6 +2484,19 @@ export class FaintPhase extends PokemonPhase {
}); });
}); });
} }
tryOverrideForBattleSpec(): boolean {
switch (this.scene.currentBattle.battleSpec) {
case BattleSpec.FINAL_BOSS:
const enemy = this.getPokemon();
if (enemy.formIndex) {
this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.name, null, () => this.doFaint(), null, true);
return true;
}
}
return false;
}
} }
export class VictoryPhase extends PokemonPhase { export class VictoryPhase extends PokemonPhase {

View File

@ -1,5 +1,4 @@
import Phaser from 'phaser'; import Phaser from 'phaser';
import { Biome } from './data/biome';
import UI, { Mode } from './ui/ui'; import UI, { Mode } from './ui/ui';
import { EncounterPhase, SummonPhase, NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, CheckLoadPhase, TurnInitPhase, ReturnPhase, LevelCapPhase, TestMessagePhase, ShowTrainerPhase, TrainerMessageTestPhase, LoginPhase, ConsolidateDataPhase } from './battle-phases'; import { EncounterPhase, SummonPhase, NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, CheckLoadPhase, TurnInitPhase, ReturnPhase, LevelCapPhase, TestMessagePhase, ShowTrainerPhase, TrainerMessageTestPhase, LoginPhase, ConsolidateDataPhase } from './battle-phases';
import Pokemon, { PlayerPokemon, EnemyPokemon } from './pokemon'; import Pokemon, { PlayerPokemon, EnemyPokemon } from './pokemon';
@ -11,11 +10,14 @@ import { initAutoPlay } from './system/auto-play';
import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from './data/battle-anims'; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from './data/battle-anims';
import { BattlePhase } from './battle-phase'; import { BattlePhase } from './battle-phase';
import { initGameSpeed } from './system/game-speed'; import { initGameSpeed } from './system/game-speed';
import { Biome } from "./data/enums/biome";
import { Arena, ArenaBase, getBiomeHasProps, getBiomeKey } from './arena'; import { Arena, ArenaBase, getBiomeHasProps, getBiomeKey } from './arena';
import { GameData } from './system/game-data'; import { GameData } from './system/game-data';
import StarterSelectUiHandler from './ui/starter-select-ui-handler'; import StarterSelectUiHandler from './ui/starter-select-ui-handler';
import { TextStyle, addTextObject } from './ui/text'; import { TextStyle, addTextObject } from './ui/text';
import { Moves, initMoves } from './data/move'; import { Moves } from "./data/enums/moves";
import { } from "./data/move";
import { initMoves } from './data/move';
import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave } from './modifier/modifier-type'; import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave } from './modifier/modifier-type';
import AbilityBar from './ui/ability-bar'; import AbilityBar from './ui/ability-bar';
import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, applyAbAttrs, initAbilities } from './data/ability'; import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, applyAbAttrs, initAbilities } from './data/ability';
@ -24,7 +26,8 @@ import { GameMode } from './game-mode';
import FieldSpritePipeline from './pipelines/field-sprite'; import FieldSpritePipeline from './pipelines/field-sprite';
import SpritePipeline from './pipelines/sprite'; import SpritePipeline from './pipelines/sprite';
import PartyExpBar from './ui/party-exp-bar'; import PartyExpBar from './ui/party-exp-bar';
import { TrainerType, trainerConfigs } from './data/trainer-type'; import { trainerConfigs } from './data/trainer-config';
import { TrainerType } from "./data/enums/trainer-type";
import Trainer from './trainer'; import Trainer from './trainer';
import TrainerData from './system/trainer-data'; import TrainerData from './system/trainer-data';
import SoundFade from 'phaser3-rex-plugins/plugins/soundfade'; import SoundFade from 'phaser3-rex-plugins/plugins/soundfade';
@ -33,7 +36,7 @@ import PokeballTray from './ui/pokeball-tray';
import { Setting, settingOptions } from './system/settings'; import { Setting, settingOptions } from './system/settings';
import SettingsUiHandler from './ui/settings-ui-handler'; import SettingsUiHandler from './ui/settings-ui-handler';
import MessageUiHandler from './ui/message-ui-handler'; import MessageUiHandler from './ui/message-ui-handler';
import { Species } from './data/species'; import { Species } from './data/enums/species';
import InvertPostFX from './pipelines/invert'; import InvertPostFX from './pipelines/invert';
import { Achv, ModifierAchv, achvs } from './system/achv'; import { Achv, ModifierAchv, achvs } from './system/achv';
import { GachaType } from './data/egg'; import { GachaType } from './data/egg';
@ -43,7 +46,7 @@ import UIPlugin from 'phaser3-rex-plugins/templates/ui/ui-plugin';
import { WindowVariant, getWindowVariantSuffix } from './ui/window'; import { WindowVariant, getWindowVariantSuffix } from './ui/window';
import PokemonData from './system/pokemon-data'; import PokemonData from './system/pokemon-data';
import { Nature } from './data/nature'; import { Nature } from './data/nature';
import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, getSpeciesFormChangeMessage, pokemonFormChanges } from './data/pokemon-forms'; import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from './data/pokemon-forms';
import { FormChangePhase, QuietFormChangePhase } from './form-change-phase'; import { FormChangePhase, QuietFormChangePhase } from './form-change-phase';
const enableAuto = true; const enableAuto = true;
@ -817,7 +820,7 @@ export default class BattleScene extends Phaser.Scene {
this.lastEnemyTrainer = lastBattle?.trainer ?? null; this.lastEnemyTrainer = lastBattle?.trainer ?? null;
this.currentBattle = new Battle(newWaveIndex, newBattleType, newTrainer, newDouble); this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble);
this.currentBattle.incrementTurn(this); this.currentBattle.incrementTurn(this);
//this.pushPhase(new TrainerMessageTestPhase(this)); //this.pushPhase(new TrainerMessageTestPhase(this));
@ -934,8 +937,6 @@ export default class BattleScene extends Phaser.Scene {
if (species) { if (species) {
if (species.baseTotal >= 670) if (species.baseTotal >= 670)
ret++; ret++;
if (speciesStarters.hasOwnProperty(species.speciesId) && speciesStarters[species.speciesId] > 8)
ret++;
} }
ret += Math.floor(waveIndex / 250); ret += Math.floor(waveIndex / 250);
@ -1289,6 +1290,8 @@ export default class BattleScene extends Phaser.Scene {
return 12.235; return 12.235;
case 'battle_elite': case 'battle_elite':
return 17.730; return 17.730;
case 'battle_final_encounter':
return 19.159;
case 'battle_final': case 'battle_final':
return 16.453; return 16.453;
case 'battle_gym': case 'battle_gym':
@ -1311,6 +1314,8 @@ export default class BattleScene extends Phaser.Scene {
return 12.703; return 12.703;
case 'battle_wild_strong': case 'battle_wild_strong':
return 13.940; return 13.940;
case 'end_summit':
return 30.025;
} }
return 0; return 0;
@ -1384,6 +1389,10 @@ export default class BattleScene extends Phaser.Scene {
return true; return true;
} }
findPhase(phaseFilter: (phase: BattlePhase) => boolean): BattlePhase {
return this.phaseQueue.find(phaseFilter);
}
queueMessage(message: string, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer, defer?: boolean) { queueMessage(message: string, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer, defer?: boolean) {
const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay); const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay);
if (!defer) if (!defer)
@ -1654,7 +1663,7 @@ export default class BattleScene extends Phaser.Scene {
phase = new FormChangePhase(this, pokemon, matchingFormChange, modal); phase = new FormChangePhase(this, pokemon, matchingFormChange, modal);
else else
phase = new QuietFormChangePhase(this, pokemon, matchingFormChange); phase = new QuietFormChangePhase(this, pokemon, matchingFormChange);
if (!matchingFormChange.quiet && modal) if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal)
this.overridePhase(phase); this.overridePhase(phase);
else if (delayed) else if (delayed)
this.pushPhase(phase); this.pushPhase(phase);

View File

@ -3,10 +3,11 @@ import { EnemyPokemon, PlayerPokemon, QueuedMove } from "./pokemon";
import { Command } from "./ui/command-ui-handler"; import { Command } from "./ui/command-ui-handler";
import * as Utils from "./utils"; import * as Utils from "./utils";
import Trainer from "./trainer"; import Trainer from "./trainer";
import { Species } from "./data/species"; import { Species } from "./data/enums/species";
import { Moves } from "./data/move"; import { Moves } from "./data/enums/moves";
import { TrainerType } from "./data/trainer-type"; import { TrainerType } from "./data/enums/trainer-type";
import { GameMode } from "./game-mode"; import { GameMode } from "./game-mode";
import { BattleSpec } from "./enums/battle-spec";
export enum BattleType { export enum BattleType {
WILD, WILD,
@ -35,8 +36,10 @@ interface TurnCommands {
} }
export default class Battle { export default class Battle {
protected gameMode: GameMode;
public waveIndex: integer; public waveIndex: integer;
public battleType: BattleType; public battleType: BattleType;
public battleSpec: BattleSpec;
public trainer: Trainer; public trainer: Trainer;
public enemyLevels: integer[]; public enemyLevels: integer[];
public enemyParty: EnemyPokemon[]; public enemyParty: EnemyPokemon[];
@ -51,10 +54,12 @@ export default class Battle {
public battleSeed: string; public battleSeed: string;
private battleSeedState: string; private battleSeedState: string;
constructor(waveIndex: integer, battleType: BattleType, trainer: Trainer, double: boolean) { constructor(gameMode: integer, waveIndex: integer, battleType: BattleType, trainer: Trainer, double: boolean) {
this.gameMode = gameMode;
this.waveIndex = waveIndex; this.waveIndex = waveIndex;
this.battleType = battleType; this.battleType = battleType;
this.trainer = trainer; this.trainer = trainer;
this.initBattleSpec();
this.enemyLevels = battleType !== BattleType.TRAINER this.enemyLevels = battleType !== BattleType.TRAINER
? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave())
: trainer.getPartyLevels(this.waveIndex); : trainer.getPartyLevels(this.waveIndex);
@ -67,13 +72,22 @@ export default class Battle {
this.battleSeedState = null; this.battleSeedState = null;
} }
private initBattleSpec(): void {
let spec = BattleSpec.DEFAULT;
if (this.gameMode === GameMode.CLASSIC) {
if (this.waveIndex === 200)
spec = BattleSpec.FINAL_BOSS;
}
this.battleSpec = spec;
}
private getLevelForWave(): integer { private getLevelForWave(): integer {
let baseLevel = 1 + this.waveIndex / 2 + Math.pow(this.waveIndex / 25, 2); let baseLevel = 1 + this.waveIndex / 2 + Math.pow(this.waveIndex / 25, 2);
const bossMultiplier = 1.2; const bossMultiplier = 1.2;
if (!(this.waveIndex % 10)) { if (!(this.waveIndex % 10)) {
const ret = Math.floor(baseLevel * bossMultiplier); const ret = Math.floor(baseLevel * bossMultiplier);
if (this.waveIndex === 200 || !(this.waveIndex % 250)) if (this.battleSpec === BattleSpec.FINAL_BOSS || !(this.waveIndex % 250))
return Math.ceil(ret / 25) * 25; return Math.ceil(ret / 25) * 25;
return ret + Math.round(Phaser.Math.RND.realInRange(-1, 1) * Math.floor(this.waveIndex / 10)); return ret + Math.round(Phaser.Math.RND.realInRange(-1, 1) * Math.floor(this.waveIndex / 10));
} }
@ -114,10 +128,14 @@ export default class Battle {
if (!this.started && this.trainer.config.encounterBgm && this.trainer.config.encounterMessages.length) if (!this.started && this.trainer.config.encounterBgm && this.trainer.config.encounterMessages.length)
return `encounter_${this.trainer.getEncounterBgm()}`; return `encounter_${this.trainer.getEncounterBgm()}`;
return this.trainer.getBattleBgm(); return this.trainer.getBattleBgm();
} } else if (this.gameMode === GameMode.CLASSIC && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS)
return 'end_summit';
for (let pokemon of battlers) { for (let pokemon of battlers) {
if (pokemon.species.speciesId === Species.ETERNATUS) if (this.battleSpec === BattleSpec.FINAL_BOSS) {
return 'battle_final'; if (pokemon.formIndex)
return 'battle_final';
return 'battle_final_encounter';
}
if (pokemon.species.legendary || pokemon.species.pseudoLegendary || pokemon.species.mythical) { if (pokemon.species.legendary || pokemon.species.pseudoLegendary || pokemon.species.mythical) {
if (pokemon.species.speciesId === Species.KYUREM) if (pokemon.species.speciesId === Species.KYUREM)
return 'battle_legendary_z'; return 'battle_legendary_z';
@ -149,7 +167,7 @@ export default class Battle {
export class FixedBattle extends Battle { export class FixedBattle extends Battle {
constructor(scene: BattleScene, waveIndex: integer, config: FixedBattleConfig) { constructor(scene: BattleScene, waveIndex: integer, config: FixedBattleConfig) {
super(waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : null, config.double); super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : null, config.double);
if (config.getEnemyParty) if (config.getEnemyParty)
this.enemyParty = config.getEnemyParty(scene); this.enemyParty = config.getEnemyParty(scene);
} }

View File

@ -1,16 +1,18 @@
import Pokemon, { HitResult, PokemonMove } from "../pokemon"; import Pokemon, { HitResult, PokemonMove } from "../pokemon";
import { Type, getTypeDamageMultiplier } from "./type"; import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { BattleStat, getBattleStatName } from "./battle-stat"; import { BattleStat, getBattleStatName } from "./battle-stat";
import { DamagePhase, ObtainStatusEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../battle-phases"; import { DamagePhase, ObtainStatusEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../battle-phases";
import { getPokemonMessage } from "../messages"; import { getPokemonMessage } from "../messages";
import { Weather, WeatherType } from "./weather"; import { Weather, WeatherType } from "./weather";
import { BattlerTag, BattlerTagType } from "./battler-tag"; import { BattlerTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type";
import { StatusEffect, getStatusEffectDescriptor } from "./status-effect"; import { StatusEffect, getStatusEffectDescriptor } from "./status-effect";
import Move, { MoveCategory, MoveFlags, Moves, RecoilAttr, StealHeldItemAttr } from "./move"; import Move, { MoveCategory, MoveFlags, RecoilAttr } from "./move";
import { ArenaTagType } from "./arena-tag"; import { ArenaTagType } from "./arena-tag";
import { Stat } from "./pokemon-stat"; import { Stat } from "./pokemon-stat";
import { PokemonHeldItemModifier } from "../modifier/modifier"; import { PokemonHeldItemModifier } from "../modifier/modifier";
import { Moves } from "./enums/moves";
export class Ability { export class Ability {
public id: Abilities; public id: Abilities;

View File

@ -6,7 +6,7 @@ import PokemonSpecies, { PokemonForm, SpeciesFormKey, allSpecies } from './pokem
import { GrowthRate } from './exp'; import { GrowthRate } from './exp';
import { Type } from './type'; import { Type } from './type';
import { Abilities, allAbilities } from './ability'; import { Abilities, allAbilities } from './ability';
import { Species } from './species'; import { Species } from './enums/species';
import { pokemonFormLevelMoves } from './pokemon-level-moves'; import { pokemonFormLevelMoves } from './pokemon-level-moves';
import { tmSpecies } from './tms'; import { tmSpecies } from './tms';

View File

@ -1,13 +1,14 @@
import { Arena } from "../arena"; import { Arena } from "../arena";
import { Type } from "./type"; import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { Moves, allMoves } from "./move"; import { allMoves } from "./move";
import { getPokemonMessage } from "../messages"; import { getPokemonMessage } from "../messages";
import Pokemon, { HitResult, PokemonMove } from "../pokemon"; import Pokemon, { HitResult, PokemonMove } from "../pokemon";
import { DamagePhase, MoveEffectPhase, ObtainStatusEffectPhase } from "../battle-phases"; import { DamagePhase, MoveEffectPhase, ObtainStatusEffectPhase } from "../battle-phases";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
import { BattlerTagType } from "./battler-tag"; import { BattlerTagType } from "./enums/battler-tag-type";
import { BattlerIndex } from "../battle"; import { BattlerIndex } from "../battle";
import { Moves } from "./enums/moves";
export enum ArenaTagType { export enum ArenaTagType {
NONE, NONE,

View File

@ -1,10 +1,11 @@
//import { battleAnimRawData } from "./battle-anim-raw-data"; //import { battleAnimRawData } from "./battle-anim-raw-data";
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { AttackMove, ChargeAttr, DelayedAttackAttr, MoveFlags, Moves, SelfStatusMove, allMoves } from "./move"; import { AttackMove, ChargeAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move";
import Pokemon from "../pokemon"; import Pokemon from "../pokemon";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { BattlerIndex } from "../battle"; import { BattlerIndex } from "../battle";
import stringify, { Element } from "json-stable-stringify"; import stringify, { Element } from "json-stable-stringify";
import { Moves } from "./enums/moves";
//import fs from 'vite-plugin-fs/browser'; //import fs from 'vite-plugin-fs/browser';
export enum AnimFrameTarget { export enum AnimFrameTarget {

View File

@ -5,45 +5,11 @@ import Pokemon, { MoveResult, HitResult } from "../pokemon";
import { Stat } from "./pokemon-stat"; import { Stat } from "./pokemon-stat";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { ChargeAttr, Moves, allMoves } from "./move"; import { Moves } from "./enums/moves";
import { ChargeAttr, allMoves } from "./move";
import { Type } from "./type"; import { Type } from "./type";
import { Abilities } from "./ability"; import { Abilities } from "./ability";
import { BattlerTagType } from "./enums/battler-tag-type";
export enum BattlerTagType {
NONE = "NONE",
RECHARGING = "RECHARGING",
FLINCHED = "FLINCHED",
CONFUSED = "CONFUSED",
INFATUATED = "INFATUATED",
SEEDED = "SEEDED",
NIGHTMARE = "NIGHTMARE",
FRENZY = "FRENZY",
ENCORE = "ENCORE",
INGRAIN = "INGRAIN",
AQUA_RING = "AQUA_RING",
DROWSY = "DROWSY",
TRAPPED = "TRAPPED",
BIND = "BIND",
WRAP = "WRAP",
FIRE_SPIN = "FIRE_SPIN",
WHIRLPOOL = "WHIRLPOOL",
CLAMP = "CLAMP",
SAND_TOMB = "SAND_TOMB",
MAGMA_STORM = "MAGMA_STORM",
PROTECTED = "PROTECTED",
PERISH_SONG = "PERISH_SONG",
TRUANT = "TRUANT",
SLOW_START = "SLOW_START",
FLYING = "FLYING",
UNDERGROUND = "UNDERGROUND",
HIDDEN = "HIDDEN",
FIRE_BOOST = "FIRE_BOOST",
CRIT_BOOST = "CRIT_BOOST",
NO_CRIT = "NO_CRIT",
IGNORE_ACCURACY = "IGNORE_ACCURACY",
BYPASS_SLEEP = "BYPASS_SLEEP",
IGNORE_FLYING = "IGNORE_FLYING"
}
export enum BattlerTagLapseType { export enum BattlerTagLapseType {
FAINT, FAINT,

View File

@ -3,7 +3,7 @@ import { getPokemonMessage } from "../messages";
import Pokemon, { HitResult } from "../pokemon"; import Pokemon, { HitResult } from "../pokemon";
import { getBattleStatName } from "./battle-stat"; import { getBattleStatName } from "./battle-stat";
import { BattleStat } from "./battle-stat"; import { BattleStat } from "./battle-stat";
import { BattlerTagType } from "./battler-tag"; import { BattlerTagType } from "./enums/battler-tag-type";
import { getStatusEffectHealText } from "./status-effect"; import { getStatusEffectHealText } from "./status-effect";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { DoubleBerryEffectAbAttr, applyAbAttrs } from "./ability"; import { DoubleBerryEffectAbAttr, applyAbAttrs } from "./ability";

View File

@ -1,49 +1,11 @@
import { pokemonEvolutions, SpeciesEvolution } from "./pokemon-evolutions"; import { Species } from "./enums/species";
import { Species } from "./species";
import { Type } from './type'; import { Type } from './type';
import * as Utils from '../utils'; import * as Utils from '../utils';
import beautify from 'json-beautify'; import beautify from 'json-beautify';
import { TrainerType } from "./trainer-type"; import { TrainerType } from "./enums/trainer-type";
import { TimeOfDay } from "../arena"; import { TimeOfDay } from "./enums/time-of-day";
import { Biome } from "./enums/biome";
export enum Biome { import { SpeciesEvolution } from "./pokemon-evolutions";
TOWN,
PLAINS,
GRASS,
TALL_GRASS,
METROPOLIS,
FOREST,
SEA,
SWAMP,
BEACH,
LAKE,
SEABED,
MOUNTAIN,
BADLANDS,
CAVE,
DESERT,
ICE_CAVE,
MEADOW,
POWER_PLANT,
VOLCANO,
GRAVEYARD,
DOJO,
FACTORY,
RUINS,
WASTELAND,
ABYSS,
SPACE,
CONSTRUCTION_SITE,
JUNGLE,
FAIRY_CAVE,
TEMPLE,
SLUM,
SNOWY_FOREST,
ISLAND = 40,
LABORATORY,
END = 50
};
export function getBiomeName(biome: Biome | -1) { export function getBiomeName(biome: Biome | -1) {
if (biome === -1) if (biome === -1)
@ -7387,118 +7349,121 @@ export const biomeTrainerPools: BiomeTrainerPools = {
traverseBiome(Biome.TOWN, 0); traverseBiome(Biome.TOWN, 0);
biomeDepths[Biome.END] = [ Object.values(biomeDepths).map(d => d[0]).reduce((max: integer, value: integer) => Math.max(max, value), 0) + 1, 1 ]; biomeDepths[Biome.END] = [ Object.values(biomeDepths).map(d => d[0]).reduce((max: integer, value: integer) => Math.max(max, value), 0) + 1, 1 ];
for (let biome of Utils.getEnumValues(Biome)) { import('./pokemon-evolutions').then(pe => {
biomePokemonPools[biome] = {}; const pokemonEvolutions = pe.pokemonEvolutions;
biomeTrainerPools[biome] = {}; for (let biome of Utils.getEnumValues(Biome)) {
biomePokemonPools[biome] = {};
biomeTrainerPools[biome] = {};
for (let tier of Utils.getEnumValues(BiomePoolTier)) { for (let tier of Utils.getEnumValues(BiomePoolTier)) {
biomePokemonPools[biome][tier] = {}; biomePokemonPools[biome][tier] = {};
biomeTrainerPools[biome][tier] = []; biomeTrainerPools[biome][tier] = [];
for (let tod of Utils.getEnumValues(TimeOfDay)) for (let tod of Utils.getEnumValues(TimeOfDay))
biomePokemonPools[biome][tier][tod] = []; biomePokemonPools[biome][tier][tod] = [];
}
} }
}
for (let pb of pokemonBiomes) { for (let pb of pokemonBiomes) {
const speciesId = pb[0] as Species; const speciesId = pb[0] as Species;
const biomeEntries = pb[3] as (Biome | BiomePoolTier)[][]; const biomeEntries = pb[3] as (Biome | BiomePoolTier)[][];
const speciesEvolutions: SpeciesEvolution[] = pokemonEvolutions.hasOwnProperty(speciesId) const speciesEvolutions: SpeciesEvolution[] = pokemonEvolutions.hasOwnProperty(speciesId)
? pokemonEvolutions[speciesId] ? pokemonEvolutions[speciesId]
: []; : [];
if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId))[3] as any[]).filter(b => b[0] !== Biome.END).length).length) if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId))[3] as any[]).filter(b => b[0] !== Biome.END).length).length)
uncatchableSpecies.push(speciesId); uncatchableSpecies.push(speciesId);
for (let b of biomeEntries) { for (let b of biomeEntries) {
const biome = b[0]; const biome = b[0];
const tier = b[1]; const tier = b[1];
const timesOfDay = b.length > 2 const timesOfDay = b.length > 2
? Array.isArray(b[2]) ? Array.isArray(b[2])
? b[2] ? b[2]
: [ b[2] ] : [ b[2] ]
: [ TimeOfDay.ALL ]; : [ TimeOfDay.ALL ];
for (let tod of timesOfDay) { for (let tod of timesOfDay) {
if (!biomePokemonPools.hasOwnProperty(biome) || !biomePokemonPools[biome].hasOwnProperty(tier) || !biomePokemonPools[biome][tier].hasOwnProperty(tod)) if (!biomePokemonPools.hasOwnProperty(biome) || !biomePokemonPools[biome].hasOwnProperty(tier) || !biomePokemonPools[biome][tier].hasOwnProperty(tod))
continue;
const biomeTierPool = biomePokemonPools[biome][tier][tod];
let treeIndex = -1;
let arrayIndex = 0;
for (let t = 0; t < biomeTierPool.length; t++) {
const existingSpeciesIds = biomeTierPool[t] as unknown as Species[];
for (let es = 0; es < existingSpeciesIds.length; es++) {
const existingSpeciesId = existingSpeciesIds[es];
if (pokemonEvolutions.hasOwnProperty(existingSpeciesId) && (pokemonEvolutions[existingSpeciesId] as SpeciesEvolution[]).find(ese => ese.speciesId === speciesId)) {
treeIndex = t;
arrayIndex = es + 1;
break;
} else if (speciesEvolutions && speciesEvolutions.find(se => se.speciesId === existingSpeciesId)) {
treeIndex = t;
arrayIndex = es;
break;
}
}
if (treeIndex > -1)
break;
}
if (treeIndex > -1)
(biomeTierPool[treeIndex] as unknown as Species[]).splice(arrayIndex, 0, speciesId);
else
(biomeTierPool as unknown as Species[][]).push([ speciesId ]);
}
}
}
for (let b of Object.keys(biomePokemonPools)) {
for (let t of Object.keys(biomePokemonPools[b])) {
const tier = parseInt(t) as BiomePoolTier;
for (let tod of Object.keys(biomePokemonPools[b][t])) {
const biomeTierTimePool = biomePokemonPools[b][t][tod];
for (let e = 0; e < biomeTierTimePool.length; e++) {
const entry = biomeTierTimePool[e];
if (entry.length === 1)
biomeTierTimePool[e] = entry[0];
else {
const newEntry = {
1: [ entry[0] ]
};
for (let s = 1; s < entry.length; s++) {
const speciesId = entry[s];
const prevolution = entry.map(s => pokemonEvolutions[s]).flat().find(e => e && e.speciesId === speciesId);
const level = prevolution.level - (prevolution.level === 1 ? 1 : 0) + (prevolution.wildDelay * 10) - (tier >= BiomePoolTier.BOSS ? 10 : 0);
if (!newEntry.hasOwnProperty(level))
newEntry[level] = [ speciesId ];
else
newEntry[level].push(speciesId);
}
biomeTierTimePool[e] = newEntry;
}
}
}
}
}
for (let tb of trainerBiomes) {
const trainerType = tb[0] as TrainerType;
const biomeEntries = tb[1] as BiomePoolTier[][];
for (let b of biomeEntries) {
const biome = b[0];
const tier = b[1];
if (!biomeTrainerPools.hasOwnProperty(biome) || !biomeTrainerPools[biome].hasOwnProperty(tier))
continue; continue;
const biomeTierPool = biomePokemonPools[biome][tier][tod]; const biomeTierPool = biomeTrainerPools[biome][tier];
biomeTierPool.push(trainerType);
let treeIndex = -1;
let arrayIndex = 0;
for (let t = 0; t < biomeTierPool.length; t++) {
const existingSpeciesIds = biomeTierPool[t] as unknown as Species[];
for (let es = 0; es < existingSpeciesIds.length; es++) {
const existingSpeciesId = existingSpeciesIds[es];
if (pokemonEvolutions.hasOwnProperty(existingSpeciesId) && (pokemonEvolutions[existingSpeciesId] as SpeciesEvolution[]).find(ese => ese.speciesId === speciesId)) {
treeIndex = t;
arrayIndex = es + 1;
break;
} else if (speciesEvolutions && speciesEvolutions.find(se => se.speciesId === existingSpeciesId)) {
treeIndex = t;
arrayIndex = es;
break;
}
}
if (treeIndex > -1)
break;
}
if (treeIndex > -1)
(biomeTierPool[treeIndex] as unknown as Species[]).splice(arrayIndex, 0, speciesId);
else
(biomeTierPool as unknown as Species[][]).push([ speciesId ]);
} }
} }
} });
for (let b of Object.keys(biomePokemonPools)) {
for (let t of Object.keys(biomePokemonPools[b])) {
const tier = parseInt(t) as BiomePoolTier;
for (let tod of Object.keys(biomePokemonPools[b][t])) {
const biomeTierTimePool = biomePokemonPools[b][t][tod];
for (let e = 0; e < biomeTierTimePool.length; e++) {
const entry = biomeTierTimePool[e];
if (entry.length === 1)
biomeTierTimePool[e] = entry[0];
else {
const newEntry = {
1: [ entry[0] ]
};
for (let s = 1; s < entry.length; s++) {
const speciesId = entry[s];
const prevolution = entry.map(s => pokemonEvolutions[s]).flat().find(e => e && e.speciesId === speciesId);
const level = prevolution.level - (prevolution.level === 1 ? 1 : 0) + (prevolution.wildDelay * 10) - (tier >= BiomePoolTier.BOSS ? 10 : 0);
if (!newEntry.hasOwnProperty(level))
newEntry[level] = [ speciesId ];
else
newEntry[level].push(speciesId);
}
biomeTierTimePool[e] = newEntry;
}
}
}
}
}
for (let tb of trainerBiomes) {
const trainerType = tb[0] as TrainerType;
const biomeEntries = tb[1] as BiomePoolTier[][];
for (let b of biomeEntries) {
const biome = b[0];
const tier = b[1];
if (!biomeTrainerPools.hasOwnProperty(biome) || !biomeTrainerPools[biome].hasOwnProperty(tier))
continue;
const biomeTierPool = biomeTrainerPools[biome][tier];
biomeTierPool.push(trainerType);
}
}
function outputPools() { function outputPools() {
const pokemonOutput = {}; const pokemonOutput = {};

283
src/data/dialogue.ts Normal file
View File

@ -0,0 +1,283 @@
import { trainerConfigs } from "./trainer-config";
import { TrainerType } from "./enums/trainer-type";
import { BattleSpec } from "../enums/battle-spec";
export interface TrainerTypeMessages {
encounter?: string | string[],
victory?: string | string[],
defeat?: string | string[]
}
export interface TrainerTypeDialogue {
[key: integer]: TrainerTypeMessages | [ TrainerTypeMessages, TrainerTypeMessages ]
}
export const trainerTypeDialogue = {
[TrainerType.YOUNGSTER]: [
{
encounter: [
`Hey, wanna battle?`,
`Are you a new trainer too?`,
`Hey, I haven't seen you before. Let's battle!`
],
victory: [
`Wow! You're strong!`,
`I didn't stand a chance, huh.`,
`I'll find you again when I'm older and beat you!`
]
},
{
encounter: [
`Let's have a battle, shall we?`,
`You look like a new trainer. Let's have a battle!`,
`I don't recognize you. How about a battle?`
],
victory: [
`That was impressive! I've got a lot to learn.`,
`I didn't think you'd beat me that bad…`,
`I hope we get to have a rematch some day.`
]
}
],
[TrainerType.ROXANNE]: {
encounter: [
`Would you kindly demonstrate how you battle?`,
`You can learn many things by battling many trainers.`,
`Oh, you caught me strategizing.\nWould you like to battle?`
],
victory: [
`Oh, I appear to have lost.\nI understand.`,
`It seems that I still have so much more to learn when it comes to battle.`,
`I'll take what I learned here today to heart.`
],
defeat: [
`I have learned many things from our battle.\nI hope you have too.`,
`I look forward to battling you again.\nI hope you'll use what you've learned here.`,
`I won due to everything I have learned.`
]
},
[TrainerType.BRAWLY]: {
encounter: [
`Oh man, a challenger!\nLet's see what you can do!`,
`You seem like a big splash.\nLet's battle!`,
`Time to create a storm!\nLet's go!`
],
victory: [
`Oh woah, you've washed me out!`,
`You surfed my wave and crashed me down!`,
`I feel like I'm lost in Granite Cave!`
],
defeat: [
`Haha, I surfed the big wave!\nChallenge me again sometime.`,
`Surf with me again some time!`,
`Just like the tides come in and out, I hope you return to challenge me again.`
]
},
[TrainerType.WATTSON]: {
encounter: [
`Time to get shocked!\nWahahahaha!`,
`I'll make sparks fly!\nWahahahaha!`,
`I hope you brought Paralyz Heal!\nWahahahaha!`
],
victory: [
`Seems like I'm out of charge!\nWahahahaha!`,
`You've completely grounded me!\nWahahahaha!`,
`Thanks for the thrill!\nWahahahaha!`
],
defeat: [
`Recharge your batteries and challenge me again sometime!\nWahahahaha!`,
`I hope you found our battle electrifying!\nWahahahaha!`,
`Aren't you shocked I won?\nWahahahaha!`
]
},
[TrainerType.FLANNERY]: {
encounter: [
`Nice to meet you! Wait, no…\nI will crush you!`,
`I've only been a leader for a little while, but I'll smoke you!`,
`It's time to demonstrate the moves my grandfather has taught me! Let's battle!`
],
victory: [
`You remind me of my grandfather…\nNo wonder I lost.`,
`Am I trying too hard?\nI should relax, can't get too heated.`,
`Losing isn't going to smother me out.\nTime to reignite training!`
],
defeat: [
`I hope I've made my grandfather proud…\nLet's battle again some time.`,
`I…I can't believe I won!\nDoing things my way worked!`,
`Let's exchange burning hot moves again soon!`
]
},
[TrainerType.NORMAN]: {
encounter: [
`I'm surprised you managed to get here.\nLet's battle.`,
`I'll do everything in my power as a Gym Leader to win.\nLet's go!`,
`You better give this your all.\nIt's time to battle!`
],
victory: [
`I lost to you…?\nRules are rules, though.`,
`Was moving from Olivine a mistake…?`,
`I can't believe it.\nThat was a great match.`
],
defeat: [
`We both tried our best.\nI hope we can battle again soon.`,
`You should try challenging my kid instead.\nYou might learn something!`,
`Thank you for the excellent battle.\nBetter luck next time.`
]
},
[TrainerType.WINONA]: {
encounter: [
`I've been soaring the skies looking for prey…\nAnd you're my target!`,
`No matter how our battle is, my Flying Pokémon and I will triumph with grace. Let's battle!`,
`I hope you aren't scared of heights.\nLet's ascend!`
],
victory: [
`You're the first Trainer I've seen with more grace than I.\nExcellently played.`,
`Oh, my Flying Pokémon have plummeted!\nVery well.`,
`Though I may have fallen, my Pokémon will continue to fly!`
],
defeat: [
`My Flying Pokémon and I will forever dance elegantly!`,
`I hope you enjoyed our show.\nOur graceful dance is finished.`,
`Won't you come see our elegant choreography again?`
]
},
[TrainerType.TATE]: {
encounter: [
`Hehehe…\nWere you surprised to see me without my sister?`,
`I can see what you're thinking…\nYou want to battle!`,
`How can you defeat someone…\nWho knows your every move?`
],
victory: [
`It can't be helped…\nI miss Liza…`,
`Your bond with your Pokémon was stronger than mine.`,
`If I were with Liza, we would have won.\nWe can finish each other's thoughts!`
],
defeat: [
`My Pokémon and I are superior!`,
`If you can't even defeat me, you'll never be able to defeat Liza either.`,
`It's all thanks to my strict training with Liza.\nI can make myself one with Pokémon.`
]
},
[TrainerType.LIZA]: {
encounter: [
`Fufufu…\nWere you surprised to see me without my brother?`,
`I can determine what you desire…\nYou want to battle, don't you?`,
`How can you defeat someone…\nWho's one with their Pokémon?`
],
victory: [
`It can't be helped…\nI miss Tate…`,
`Your bond with your Pokémon…\nIt's stronger than mine.`,
`If I were with Tate, we would have won.\nWe can finish each other's sentences!`
],
defeat: [
`My Pokémon and I are victorious.`,
`If you can't even defeat me, you'll never be able to defeat Tate either.`,
`It's all thanks to my strict training with Tate.\nI can synchronize myself with my Pokémon.`
]
},
[TrainerType.JUAN]: {
encounter: [
`Now's not the time to act coy.\nLet's battle!`,
`Ahahaha, You'll be witness to my artistry with Water Pokémon!`,
`A typhoon approaches!\nWill you be able to test me?`
],
victory: [
`You may be a genius who can take on Wallace!`,
`I focused on elegance while you trained.\nIt's only natural that you defeated me.`,
`Ahahaha!\nVery well, You have won this time.`
],
defeat: [
`My Pokémon and I have sculpted an illusion of Water and come out victorious.`,
`Ahahaha, I have won, and you have lost.`,
`Shall I loan you my outfit? It may help you battle!\nAhahaha, I jest!`
]
},
[TrainerType.RIVAL]: {
encounter: [
`There you are! I've been looking everywhere for you!\nDid you forget to say goodbye to your best friend?
$So you're finally pursuing your dream, huh?\nI knew you'd do it one day
$Anyway, I'll forgive you for forgetting me, but on one condition. You have to battle me!
$You'd better give it your best! Wouldn't want your adventure to be over before it started, right?`
],
victory: [
`You already have three Pokémon?!\nThat's not fair at all!
$Just kidding! I lost fair and square, and now I know you'll do fine out there.
$By the way, the professor wanted me to give you some items. Hopefully they're helpful!
$Do your best like always! I believe in you!`
]
},
[TrainerType.RIVAL_2]: {
encounter: [
`Oh, fancy meeting you here. Looks like you're still undefeated. Right on!
$I know what you're thinking, and no, I wasn't following you. I just happened to be in the area.
$I'm happy for you but I just want to let you know that it's OK to lose sometimes.
$We learn from our mistakes, often more than we would if we kept succeeding.
$In any case, I've been training hard for our rematch, so you'd better give it your all!`
],
victory: [
`I… wasn't supposed to lose that time…`
]
},
[TrainerType.RIVAL_3]: {
encounter: [
`Long time no see! Still haven't lost, huh.\nYou're starting to get on my nerves. Just kidding!
$But really, I think it's about time you came home.\nYour family and friends miss you, you know.
$I know your dream means a lot to you, but the reality is you're going to lose sooner or later.
$And when you do, I'll be there for you like always.\nNow, let me show you how strong I've become!`
],
victory: [
`After all that… it wasn't enough…?`
]
},
[TrainerType.RIVAL_4]: {
encounter: [
`It's me! You didn't forget about me again did you?
$You made it really far! I'm proud of you.\nBut it looks like it's the end of your journey.
$You've awoken something in me I never knew was there.\nIt seems like all I do now is train.
$I hardly even eat or sleep now, I just train my Pokémon all day, getting stronger every time.
$And now, I've finally reached peak performance.\nI don't think anyone could beat me now.
$And you know what? It's all because of you.\nI don't know whether to thank you or hate you.
$Prepare yourself.`
],
victory: [
`What…@d{64} what are you?`
]
},
[TrainerType.RIVAL_5]: {
encounter: [ `` ],
victory: [ '…' ]
}
};
export const battleSpecDialogue = {
[BattleSpec.FINAL_BOSS]: {
encounter: `It appears the time has finally come once again.\nYou know why you have come here, do you not?
$You were drawn here, because you have been here before.\nCountless times.
$Though, perhaps it can be counted.\nTo be precise, this is in fact your 5,643,853rd cycle.
$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.
$Until now you have yet to succeed, but I sense a different presence in you this time.\n
$You are the only one here, though it is as if there is another.
$Will you finally prove a formidable challenge to me?\nThe challenge I have longed for for millenia?
$We begin.`,
firstStageWin: `I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.
$Do not disappoint me.`,
secondStageWin: `…Magnificent.`
}
};
export function initTrainerTypeDialogue() {
const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType);
for (let trainerType of trainerTypes) {
const messages = trainerTypeDialogue[trainerType];
const messageTypes = [ 'encounter', 'victory', 'defeat' ];
for (let messageType of messageTypes) {
if (Array.isArray(messages)) {
if (messages[0][messageType])
trainerConfigs[trainerType][`${messageType}Messages`] = messages[0][messageType];
if (messages.length > 1)
trainerConfigs[trainerType][`female${messageType.slice(0, 1).toUpperCase()}${messageType.slice(1)}Messages`] = messages[1][messageType];
} else
trainerConfigs[trainerType][`${messageType}Messages`] = messages[messageType];
}
}
}

View File

@ -1,8 +1,8 @@
import { ModifierTier } from "../modifier/modifier-type"; import { ModifierTier } from "../modifier/modifier-tier";
import { Type } from "./type"; import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { Species } from "./species"; import { Species } from "./enums/species";
import { getPokemonSpecies, speciesStarters } from "./pokemon-species"; import { getPokemonSpecies, speciesStarters } from "./pokemon-species";
export const EGG_SEED = 1073741824; export const EGG_SEED = 1073741824;

View File

@ -0,0 +1,36 @@
export enum BattlerTagType {
NONE = "NONE",
RECHARGING = "RECHARGING",
FLINCHED = "FLINCHED",
CONFUSED = "CONFUSED",
INFATUATED = "INFATUATED",
SEEDED = "SEEDED",
NIGHTMARE = "NIGHTMARE",
FRENZY = "FRENZY",
ENCORE = "ENCORE",
INGRAIN = "INGRAIN",
AQUA_RING = "AQUA_RING",
DROWSY = "DROWSY",
TRAPPED = "TRAPPED",
BIND = "BIND",
WRAP = "WRAP",
FIRE_SPIN = "FIRE_SPIN",
WHIRLPOOL = "WHIRLPOOL",
CLAMP = "CLAMP",
SAND_TOMB = "SAND_TOMB",
MAGMA_STORM = "MAGMA_STORM",
PROTECTED = "PROTECTED",
PERISH_SONG = "PERISH_SONG",
TRUANT = "TRUANT",
SLOW_START = "SLOW_START",
FLYING = "FLYING",
UNDERGROUND = "UNDERGROUND",
HIDDEN = "HIDDEN",
FIRE_BOOST = "FIRE_BOOST",
CRIT_BOOST = "CRIT_BOOST",
NO_CRIT = "NO_CRIT",
IGNORE_ACCURACY = "IGNORE_ACCURACY",
BYPASS_SLEEP = "BYPASS_SLEEP",
IGNORE_FLYING = "IGNORE_FLYING"
}

38
src/data/enums/biome.ts Normal file
View File

@ -0,0 +1,38 @@
export enum Biome {
TOWN,
PLAINS,
GRASS,
TALL_GRASS,
METROPOLIS,
FOREST,
SEA,
SWAMP,
BEACH,
LAKE,
SEABED,
MOUNTAIN,
BADLANDS,
CAVE,
DESERT,
ICE_CAVE,
MEADOW,
POWER_PLANT,
VOLCANO,
GRAVEYARD,
DOJO,
FACTORY,
RUINS,
WASTELAND,
ABYSS,
SPACE,
CONSTRUCTION_SITE,
JUNGLE,
FAIRY_CAVE,
TEMPLE,
SLUM,
SNOWY_FOREST,
ISLAND = 40,
LABORATORY,
END = 50
}

922
src/data/enums/moves.ts Normal file
View File

@ -0,0 +1,922 @@
export enum Moves {
NONE,
POUND,
KARATE_CHOP,
DOUBLE_SLAP,
COMET_PUNCH,
MEGA_PUNCH,
PAY_DAY,
FIRE_PUNCH,
ICE_PUNCH,
THUNDER_PUNCH,
SCRATCH,
VICE_GRIP,
GUILLOTINE,
RAZOR_WIND,
SWORDS_DANCE,
CUT,
GUST,
WING_ATTACK,
WHIRLWIND,
FLY,
BIND,
SLAM,
VINE_WHIP,
STOMP,
DOUBLE_KICK,
MEGA_KICK,
JUMP_KICK,
ROLLING_KICK,
SAND_ATTACK,
HEADBUTT,
HORN_ATTACK,
FURY_ATTACK,
HORN_DRILL,
TACKLE,
BODY_SLAM,
WRAP,
TAKE_DOWN,
THRASH,
DOUBLE_EDGE,
TAIL_WHIP,
POISON_STING,
TWINEEDLE,
PIN_MISSILE,
LEER,
BITE,
GROWL,
ROAR,
SING,
SUPERSONIC,
SONIC_BOOM,
DISABLE,
ACID,
EMBER,
FLAMETHROWER,
MIST,
WATER_GUN,
HYDRO_PUMP,
SURF,
ICE_BEAM,
BLIZZARD,
PSYBEAM,
BUBBLE_BEAM,
AURORA_BEAM,
HYPER_BEAM,
PECK,
DRILL_PECK,
SUBMISSION,
LOW_KICK,
COUNTER,
SEISMIC_TOSS,
STRENGTH,
ABSORB,
MEGA_DRAIN,
LEECH_SEED,
GROWTH,
RAZOR_LEAF,
SOLAR_BEAM,
POISON_POWDER,
STUN_SPORE,
SLEEP_POWDER,
PETAL_DANCE,
STRING_SHOT,
DRAGON_RAGE,
FIRE_SPIN,
THUNDER_SHOCK,
THUNDERBOLT,
THUNDER_WAVE,
THUNDER,
ROCK_THROW,
EARTHQUAKE,
FISSURE,
DIG,
TOXIC,
CONFUSION,
PSYCHIC,
HYPNOSIS,
MEDITATE,
AGILITY,
QUICK_ATTACK,
RAGE,
TELEPORT,
NIGHT_SHADE,
MIMIC,
SCREECH,
DOUBLE_TEAM,
RECOVER,
HARDEN,
MINIMIZE,
SMOKESCREEN,
CONFUSE_RAY,
WITHDRAW,
DEFENSE_CURL,
BARRIER,
LIGHT_SCREEN,
HAZE,
REFLECT,
FOCUS_ENERGY,
BIDE,
METRONOME,
MIRROR_MOVE,
SELF_DESTRUCT,
EGG_BOMB,
LICK,
SMOG,
SLUDGE,
BONE_CLUB,
FIRE_BLAST,
WATERFALL,
CLAMP,
SWIFT,
SKULL_BASH,
SPIKE_CANNON,
CONSTRICT,
AMNESIA,
KINESIS,
SOFT_BOILED,
HIGH_JUMP_KICK,
GLARE,
DREAM_EATER,
POISON_GAS,
BARRAGE,
LEECH_LIFE,
LOVELY_KISS,
SKY_ATTACK,
TRANSFORM,
BUBBLE,
DIZZY_PUNCH,
SPORE,
FLASH,
PSYWAVE,
SPLASH,
ACID_ARMOR,
CRABHAMMER,
EXPLOSION,
FURY_SWIPES,
BONEMERANG,
REST,
ROCK_SLIDE,
HYPER_FANG,
SHARPEN,
CONVERSION,
TRI_ATTACK,
SUPER_FANG,
SLASH,
SUBSTITUTE,
STRUGGLE,
SKETCH,
TRIPLE_KICK,
THIEF,
SPIDER_WEB,
MIND_READER,
NIGHTMARE,
FLAME_WHEEL,
SNORE,
CURSE,
FLAIL,
CONVERSION_2,
AEROBLAST,
COTTON_SPORE,
REVERSAL,
SPITE,
POWDER_SNOW,
PROTECT,
MACH_PUNCH,
SCARY_FACE,
FEINT_ATTACK,
SWEET_KISS,
BELLY_DRUM,
SLUDGE_BOMB,
MUD_SLAP,
OCTAZOOKA,
SPIKES,
ZAP_CANNON,
FORESIGHT,
DESTINY_BOND,
PERISH_SONG,
ICY_WIND,
DETECT,
BONE_RUSH,
LOCK_ON,
OUTRAGE,
SANDSTORM,
GIGA_DRAIN,
ENDURE,
CHARM,
ROLLOUT,
FALSE_SWIPE,
SWAGGER,
MILK_DRINK,
SPARK,
FURY_CUTTER,
STEEL_WING,
MEAN_LOOK,
ATTRACT,
SLEEP_TALK,
HEAL_BELL,
RETURN,
PRESENT,
FRUSTRATION,
SAFEGUARD,
PAIN_SPLIT,
SACRED_FIRE,
MAGNITUDE,
DYNAMIC_PUNCH,
MEGAHORN,
DRAGON_BREATH,
BATON_PASS,
ENCORE,
PURSUIT,
RAPID_SPIN,
SWEET_SCENT,
IRON_TAIL,
METAL_CLAW,
VITAL_THROW,
MORNING_SUN,
SYNTHESIS,
MOONLIGHT,
HIDDEN_POWER,
CROSS_CHOP,
TWISTER,
RAIN_DANCE,
SUNNY_DAY,
CRUNCH,
MIRROR_COAT,
PSYCH_UP,
EXTREME_SPEED,
ANCIENT_POWER,
SHADOW_BALL,
FUTURE_SIGHT,
ROCK_SMASH,
WHIRLPOOL,
BEAT_UP,
FAKE_OUT,
UPROAR,
STOCKPILE,
SPIT_UP,
SWALLOW,
HEAT_WAVE,
HAIL,
TORMENT,
FLATTER,
WILL_O_WISP,
MEMENTO,
FACADE,
FOCUS_PUNCH,
SMELLING_SALTS,
FOLLOW_ME,
NATURE_POWER,
CHARGE,
TAUNT,
HELPING_HAND,
TRICK,
ROLE_PLAY,
WISH,
ASSIST,
INGRAIN,
SUPERPOWER,
MAGIC_COAT,
RECYCLE,
REVENGE,
BRICK_BREAK,
YAWN,
KNOCK_OFF,
ENDEAVOR,
ERUPTION,
SKILL_SWAP,
IMPRISON,
REFRESH,
GRUDGE,
SNATCH,
SECRET_POWER,
DIVE,
ARM_THRUST,
CAMOUFLAGE,
TAIL_GLOW,
LUSTER_PURGE,
MIST_BALL,
FEATHER_DANCE,
TEETER_DANCE,
BLAZE_KICK,
MUD_SPORT,
ICE_BALL,
NEEDLE_ARM,
SLACK_OFF,
HYPER_VOICE,
POISON_FANG,
CRUSH_CLAW,
BLAST_BURN,
HYDRO_CANNON,
METEOR_MASH,
ASTONISH,
WEATHER_BALL,
AROMATHERAPY,
FAKE_TEARS,
AIR_CUTTER,
OVERHEAT,
ODOR_SLEUTH,
ROCK_TOMB,
SILVER_WIND,
METAL_SOUND,
GRASS_WHISTLE,
TICKLE,
COSMIC_POWER,
WATER_SPOUT,
SIGNAL_BEAM,
SHADOW_PUNCH,
EXTRASENSORY,
SKY_UPPERCUT,
SAND_TOMB,
SHEER_COLD,
MUDDY_WATER,
BULLET_SEED,
AERIAL_ACE,
ICICLE_SPEAR,
IRON_DEFENSE,
BLOCK,
HOWL,
DRAGON_CLAW,
FRENZY_PLANT,
BULK_UP,
BOUNCE,
MUD_SHOT,
POISON_TAIL,
COVET,
VOLT_TACKLE,
MAGICAL_LEAF,
WATER_SPORT,
CALM_MIND,
LEAF_BLADE,
DRAGON_DANCE,
ROCK_BLAST,
SHOCK_WAVE,
WATER_PULSE,
DOOM_DESIRE,
PSYCHO_BOOST,
ROOST,
GRAVITY,
MIRACLE_EYE,
WAKE_UP_SLAP,
HAMMER_ARM,
GYRO_BALL,
HEALING_WISH,
BRINE,
NATURAL_GIFT,
FEINT,
PLUCK,
TAILWIND,
ACUPRESSURE,
METAL_BURST,
U_TURN,
CLOSE_COMBAT,
PAYBACK,
ASSURANCE,
EMBARGO,
FLING,
PSYCHO_SHIFT,
TRUMP_CARD,
HEAL_BLOCK,
WRING_OUT,
POWER_TRICK,
GASTRO_ACID,
LUCKY_CHANT,
ME_FIRST,
COPYCAT,
POWER_SWAP,
GUARD_SWAP,
PUNISHMENT,
LAST_RESORT,
WORRY_SEED,
SUCKER_PUNCH,
TOXIC_SPIKES,
HEART_SWAP,
AQUA_RING,
MAGNET_RISE,
FLARE_BLITZ,
FORCE_PALM,
AURA_SPHERE,
ROCK_POLISH,
POISON_JAB,
DARK_PULSE,
NIGHT_SLASH,
AQUA_TAIL,
SEED_BOMB,
AIR_SLASH,
X_SCISSOR,
BUG_BUZZ,
DRAGON_PULSE,
DRAGON_RUSH,
POWER_GEM,
DRAIN_PUNCH,
VACUUM_WAVE,
FOCUS_BLAST,
ENERGY_BALL,
BRAVE_BIRD,
EARTH_POWER,
SWITCHEROO,
GIGA_IMPACT,
NASTY_PLOT,
BULLET_PUNCH,
AVALANCHE,
ICE_SHARD,
SHADOW_CLAW,
THUNDER_FANG,
ICE_FANG,
FIRE_FANG,
SHADOW_SNEAK,
MUD_BOMB,
PSYCHO_CUT,
ZEN_HEADBUTT,
MIRROR_SHOT,
FLASH_CANNON,
ROCK_CLIMB,
DEFOG,
TRICK_ROOM,
DRACO_METEOR,
DISCHARGE,
LAVA_PLUME,
LEAF_STORM,
POWER_WHIP,
ROCK_WRECKER,
CROSS_POISON,
GUNK_SHOT,
IRON_HEAD,
MAGNET_BOMB,
STONE_EDGE,
CAPTIVATE,
STEALTH_ROCK,
GRASS_KNOT,
CHATTER,
JUDGMENT,
BUG_BITE,
CHARGE_BEAM,
WOOD_HAMMER,
AQUA_JET,
ATTACK_ORDER,
DEFEND_ORDER,
HEAL_ORDER,
HEAD_SMASH,
DOUBLE_HIT,
ROAR_OF_TIME,
SPACIAL_REND,
LUNAR_DANCE,
CRUSH_GRIP,
MAGMA_STORM,
DARK_VOID,
SEED_FLARE,
OMINOUS_WIND,
SHADOW_FORCE,
HONE_CLAWS,
WIDE_GUARD,
GUARD_SPLIT,
POWER_SPLIT,
WONDER_ROOM,
PSYSHOCK,
VENOSHOCK,
AUTOTOMIZE,
RAGE_POWDER,
TELEKINESIS,
MAGIC_ROOM,
SMACK_DOWN,
STORM_THROW,
FLAME_BURST,
SLUDGE_WAVE,
QUIVER_DANCE,
HEAVY_SLAM,
SYNCHRONOISE,
ELECTRO_BALL,
SOAK,
FLAME_CHARGE,
COIL,
LOW_SWEEP,
ACID_SPRAY,
FOUL_PLAY,
SIMPLE_BEAM,
ENTRAINMENT,
AFTER_YOU,
ROUND,
ECHOED_VOICE,
CHIP_AWAY,
CLEAR_SMOG,
STORED_POWER,
QUICK_GUARD,
ALLY_SWITCH,
SCALD,
SHELL_SMASH,
HEAL_PULSE,
HEX,
SKY_DROP,
SHIFT_GEAR,
CIRCLE_THROW,
INCINERATE,
QUASH,
ACROBATICS,
REFLECT_TYPE,
RETALIATE,
FINAL_GAMBIT,
BESTOW,
INFERNO,
WATER_PLEDGE,
FIRE_PLEDGE,
GRASS_PLEDGE,
VOLT_SWITCH,
STRUGGLE_BUG,
BULLDOZE,
FROST_BREATH,
DRAGON_TAIL,
WORK_UP,
ELECTROWEB,
WILD_CHARGE,
DRILL_RUN,
DUAL_CHOP,
HEART_STAMP,
HORN_LEECH,
SACRED_SWORD,
RAZOR_SHELL,
HEAT_CRASH,
LEAF_TORNADO,
STEAMROLLER,
COTTON_GUARD,
NIGHT_DAZE,
PSYSTRIKE,
TAIL_SLAP,
HURRICANE,
HEAD_CHARGE,
GEAR_GRIND,
SEARING_SHOT,
TECHNO_BLAST,
RELIC_SONG,
SECRET_SWORD,
GLACIATE,
BOLT_STRIKE,
BLUE_FLARE,
FIERY_DANCE,
FREEZE_SHOCK,
ICE_BURN,
SNARL,
ICICLE_CRASH,
V_CREATE,
FUSION_FLARE,
FUSION_BOLT,
FLYING_PRESS,
MAT_BLOCK,
BELCH,
ROTOTILLER,
STICKY_WEB,
FELL_STINGER,
PHANTOM_FORCE,
TRICK_OR_TREAT,
NOBLE_ROAR,
ION_DELUGE,
PARABOLIC_CHARGE,
FORESTS_CURSE,
PETAL_BLIZZARD,
FREEZE_DRY,
DISARMING_VOICE,
PARTING_SHOT,
TOPSY_TURVY,
DRAINING_KISS,
CRAFTY_SHIELD,
FLOWER_SHIELD,
GRASSY_TERRAIN,
MISTY_TERRAIN,
ELECTRIFY,
PLAY_ROUGH,
FAIRY_WIND,
MOONBLAST,
BOOMBURST,
FAIRY_LOCK,
KINGS_SHIELD,
PLAY_NICE,
CONFIDE,
DIAMOND_STORM,
STEAM_ERUPTION,
HYPERSPACE_HOLE,
WATER_SHURIKEN,
MYSTICAL_FIRE,
SPIKY_SHIELD,
AROMATIC_MIST,
EERIE_IMPULSE,
VENOM_DRENCH,
POWDER,
GEOMANCY,
MAGNETIC_FLUX,
HAPPY_HOUR,
ELECTRIC_TERRAIN,
DAZZLING_GLEAM,
CELEBRATE,
HOLD_HANDS,
BABY_DOLL_EYES,
NUZZLE,
HOLD_BACK,
INFESTATION,
POWER_UP_PUNCH,
OBLIVION_WING,
THOUSAND_ARROWS,
THOUSAND_WAVES,
LANDS_WRATH,
LIGHT_OF_RUIN,
ORIGIN_PULSE,
PRECIPICE_BLADES,
DRAGON_ASCENT,
HYPERSPACE_FURY,
BREAKNECK_BLITZ__PHYSICAL,
BREAKNECK_BLITZ__SPECIAL,
ALL_OUT_PUMMELING__PHYSICAL,
ALL_OUT_PUMMELING__SPECIAL,
SUPERSONIC_SKYSTRIKE__PHYSICAL,
SUPERSONIC_SKYSTRIKE__SPECIAL,
ACID_DOWNPOUR__PHYSICAL,
ACID_DOWNPOUR__SPECIAL,
TECTONIC_RAGE__PHYSICAL,
TECTONIC_RAGE__SPECIAL,
CONTINENTAL_CRUSH__PHYSICAL,
CONTINENTAL_CRUSH__SPECIAL,
SAVAGE_SPIN_OUT__PHYSICAL,
SAVAGE_SPIN_OUT__SPECIAL,
NEVER_ENDING_NIGHTMARE__PHYSICAL,
NEVER_ENDING_NIGHTMARE__SPECIAL,
CORKSCREW_CRASH__PHYSICAL,
CORKSCREW_CRASH__SPECIAL,
INFERNO_OVERDRIVE__PHYSICAL,
INFERNO_OVERDRIVE__SPECIAL,
HYDRO_VORTEX__PHYSICAL,
HYDRO_VORTEX__SPECIAL,
BLOOM_DOOM__PHYSICAL,
BLOOM_DOOM__SPECIAL,
GIGAVOLT_HAVOC__PHYSICAL,
GIGAVOLT_HAVOC__SPECIAL,
SHATTERED_PSYCHE__PHYSICAL,
SHATTERED_PSYCHE__SPECIAL,
SUBZERO_SLAMMER__PHYSICAL,
SUBZERO_SLAMMER__SPECIAL,
DEVASTATING_DRAKE__PHYSICAL,
DEVASTATING_DRAKE__SPECIAL,
BLACK_HOLE_ECLIPSE__PHYSICAL,
BLACK_HOLE_ECLIPSE__SPECIAL,
TWINKLE_TACKLE__PHYSICAL,
TWINKLE_TACKLE__SPECIAL,
CATASTROPIKA,
SHORE_UP,
FIRST_IMPRESSION,
BANEFUL_BUNKER,
SPIRIT_SHACKLE,
DARKEST_LARIAT,
SPARKLING_ARIA,
ICE_HAMMER,
FLORAL_HEALING,
HIGH_HORSEPOWER,
STRENGTH_SAP,
SOLAR_BLADE,
LEAFAGE,
SPOTLIGHT,
TOXIC_THREAD,
LASER_FOCUS,
GEAR_UP,
THROAT_CHOP,
POLLEN_PUFF,
ANCHOR_SHOT,
PSYCHIC_TERRAIN,
LUNGE,
FIRE_LASH,
POWER_TRIP,
BURN_UP,
SPEED_SWAP,
SMART_STRIKE,
PURIFY,
REVELATION_DANCE,
CORE_ENFORCER,
TROP_KICK,
INSTRUCT,
BEAK_BLAST,
CLANGING_SCALES,
DRAGON_HAMMER,
BRUTAL_SWING,
AURORA_VEIL,
SINISTER_ARROW_RAID,
MALICIOUS_MOONSAULT,
OCEANIC_OPERETTA,
GUARDIAN_OF_ALOLA,
SOUL_STEALING_7_STAR_STRIKE,
STOKED_SPARKSURFER,
PULVERIZING_PANCAKE,
EXTREME_EVOBOOST,
GENESIS_SUPERNOVA,
SHELL_TRAP,
FLEUR_CANNON,
PSYCHIC_FANGS,
STOMPING_TANTRUM,
SHADOW_BONE,
ACCELEROCK,
LIQUIDATION,
PRISMATIC_LASER,
SPECTRAL_THIEF,
SUNSTEEL_STRIKE,
MOONGEIST_BEAM,
TEARFUL_LOOK,
ZING_ZAP,
NATURES_MADNESS,
MULTI_ATTACK,
TEN_MILLION_VOLT_THUNDERBOLT,
MIND_BLOWN,
PLASMA_FISTS,
PHOTON_GEYSER,
LIGHT_THAT_BURNS_THE_SKY,
SEARING_SUNRAZE_SMASH,
MENACING_MOONRAZE_MAELSTROM,
LETS_SNUGGLE_FOREVER,
SPLINTERED_STORMSHARDS,
CLANGOROUS_SOULBLAZE,
ZIPPY_ZAP,
SPLISHY_SPLASH,
FLOATY_FALL,
PIKA_PAPOW,
BOUNCY_BUBBLE,
BUZZY_BUZZ,
SIZZLY_SLIDE,
GLITZY_GLOW,
BADDY_BAD,
SAPPY_SEED,
FREEZY_FROST,
SPARKLY_SWIRL,
VEEVEE_VOLLEY,
DOUBLE_IRON_BASH,
MAX_GUARD,
DYNAMAX_CANNON,
SNIPE_SHOT,
JAW_LOCK,
STUFF_CHEEKS,
NO_RETREAT,
TAR_SHOT,
MAGIC_POWDER,
DRAGON_DARTS,
TEATIME,
OCTOLOCK,
BOLT_BEAK,
FISHIOUS_REND,
COURT_CHANGE,
MAX_FLARE,
MAX_FLUTTERBY,
MAX_LIGHTNING,
MAX_STRIKE,
MAX_KNUCKLE,
MAX_PHANTASM,
MAX_HAILSTORM,
MAX_OOZE,
MAX_GEYSER,
MAX_AIRSTREAM,
MAX_STARFALL,
MAX_WYRMWIND,
MAX_MINDSTORM,
MAX_ROCKFALL,
MAX_QUAKE,
MAX_DARKNESS,
MAX_OVERGROWTH,
MAX_STEELSPIKE,
CLANGOROUS_SOUL,
BODY_PRESS,
DECORATE,
DRUM_BEATING,
SNAP_TRAP,
PYRO_BALL,
BEHEMOTH_BLADE,
BEHEMOTH_BASH,
AURA_WHEEL,
BREAKING_SWIPE,
BRANCH_POKE,
OVERDRIVE,
APPLE_ACID,
GRAV_APPLE,
SPIRIT_BREAK,
STRANGE_STEAM,
LIFE_DEW,
OBSTRUCT,
FALSE_SURRENDER,
METEOR_ASSAULT,
ETERNABEAM,
STEEL_BEAM,
EXPANDING_FORCE,
STEEL_ROLLER,
SCALE_SHOT,
METEOR_BEAM,
SHELL_SIDE_ARM,
MISTY_EXPLOSION,
GRASSY_GLIDE,
RISING_VOLTAGE,
TERRAIN_PULSE,
SKITTER_SMACK,
BURNING_JEALOUSY,
LASH_OUT,
POLTERGEIST,
CORROSIVE_GAS,
COACHING,
FLIP_TURN,
TRIPLE_AXEL,
DUAL_WINGBEAT,
SCORCHING_SANDS,
JUNGLE_HEALING,
WICKED_BLOW,
SURGING_STRIKES,
THUNDER_CAGE,
DRAGON_ENERGY,
FREEZING_GLARE,
FIERY_WRATH,
THUNDEROUS_KICK,
GLACIAL_LANCE,
ASTRAL_BARRAGE,
EERIE_SPELL,
DIRE_CLAW,
PSYSHIELD_BASH,
POWER_SHIFT,
STONE_AXE,
SPRINGTIDE_STORM,
MYSTICAL_POWER,
RAGING_FURY,
WAVE_CRASH,
CHLOROBLAST,
MOUNTAIN_GALE,
VICTORY_DANCE,
HEADLONG_RUSH,
BARB_BARRAGE,
ESPER_WING,
BITTER_MALICE,
SHELTER,
TRIPLE_ARROWS,
INFERNAL_PARADE,
CEASELESS_EDGE,
BLEAKWIND_STORM,
WILDBOLT_STORM,
SANDSEAR_STORM,
LUNAR_BLESSING,
TAKE_HEART,
TERA_BLAST,
SILK_TRAP,
AXE_KICK,
LAST_RESPECTS,
LUMINA_CRASH,
ORDER_UP,
JET_PUNCH,
SPICY_EXTRACT,
SPIN_OUT,
POPULATION_BOMB,
ICE_SPINNER,
GLAIVE_RUSH,
REVIVAL_BLESSING,
SALT_CURE,
TRIPLE_DIVE,
MORTAL_SPIN,
DOODLE,
FILLET_AWAY,
KOWTOW_CLEAVE,
FLOWER_TRICK,
TORCH_SONG,
AQUA_STEP,
RAGING_BULL,
MAKE_IT_RAIN,
PSYBLADE,
HYDRO_STEAM,
RUINATION,
COLLISION_COURSE,
ELECTRO_DRIFT,
SHED_TAIL,
CHILLY_RECEPTION,
TIDY_UP,
SNOWSCAPE,
POUNCE,
TRAILBLAZE,
CHILLING_WATER,
HYPER_DRILL,
TWIN_BEAM,
RAGE_FIST,
ARMOR_CANNON,
BITTER_BLADE,
DOUBLE_SHOCK,
GIGATON_HAMMER,
COMEUPPANCE,
AQUA_CUTTER,
BLAZING_TORQUE,
WICKED_TORQUE,
NOXIOUS_TORQUE,
COMBAT_TORQUE,
MAGICAL_TORQUE,
BLOOD_MOON,
MATCHA_GOTCHA,
SYRUP_BOMB,
IVY_CUDGEL,
ELECTRO_SHOT,
TERA_STARSTORM,
FICKLE_BEAM,
BURNING_BULWARK,
THUNDERCLAP,
MIGHTY_CLEAVE,
TACHYON_CUTTER,
HARD_PRESS,
DRAGON_CHEER,
ALLURING_VOICE,
TEMPER_FLARE,
SUPERCELL_SLAM,
PSYCHIC_NOISE,
UPPER_HAND,
MALIGNANT_CHAIN,
};

View File

@ -0,0 +1,8 @@
export enum TimeOfDay {
ALL = -1,
DAWN,
DAY,
DUSK,
NIGHT
}

View File

@ -0,0 +1,178 @@
export enum TrainerType {
UNKNOWN,
ACE_TRAINER,
ARTIST,
BACKERS,
BACKPACKER,
BAKER,
BEAUTY,
BIKER,
BLACK_BELT,
BREEDER,
CLERK,
CYCLIST,
DANCER,
DEPOT_AGENT,
DOCTOR,
FISHERMAN,
GUITARIST,
HARLEQUIN,
HIKER,
HOOLIGANS,
HOOPSTER,
INFIELDER,
JANITOR,
LINEBACKER,
MAID,
MUSICIAN,
NURSE,
NURSERY_AIDE,
OFFICER,
PARASOL_LADY,
PILOT,
POKEFAN,
PRESCHOOLER,
PSYCHIC,
RANGER,
RICH,
RICH_KID,
ROUGHNECK,
SCIENTIST,
SMASHER,
SNOW_WORKER,
STRIKER,
STUDENT,
SWIMMER,
TWINS,
VETERAN,
WAITER,
WORKER,
YOUNGSTER,
BROCK = 200,
MISTY,
LT_SURGE,
ERIKA,
JANINE,
SABRINA,
BLAINE,
GIOVANNI,
FALKNER,
BUGSY,
WHITNEY,
MORTY,
CHUCK,
JASMINE,
PRYCE,
CLAIR,
ROXANNE,
BRAWLY,
WATTSON,
FLANNERY,
NORMAN,
WINONA,
TATE,
LIZA,
JUAN,
ROARK,
GARDENIA,
MAYLENE,
CRASHER_WAKE,
FANTINA,
BYRON,
CANDICE,
VOLKNER,
CILAN,
CHILI,
CRESS,
CHEREN,
LENORA,
ROXIE,
BURGH,
ELESA,
CLAY,
SKYLA,
BRYCEN,
DRAYDEN,
MARLON,
VIOLA,
GRANT,
KORRINA,
RAMOS,
CLEMONT,
VALERIE,
OLYMPIA,
WULFRIC,
MILO,
NESSA,
KABU,
BEA,
ALLISTER,
OPAL,
BEDE,
GORDIE,
MELONY,
PIERS,
MARNIE,
RAIHAN,
/*KATY,
BRASSIUS,
IONO,
KOFU,
LARRY,
RYME,
TULIP,
GRUSHA*/
LORELEI = 300,
BRUNO,
AGATHA,
LANCE,
WILL,
KOGA,
KAREN,
SIDNEY,
PHOEBE,
GLACIA,
DRAKE,
AARON,
BERTHA,
FLINT,
LUCIAN,
SHAUNTAL,
MARSHAL,
GRIMSLEY,
CAITLIN,
MALVA,
SIEBOLD,
WIKSTROM,
DRASNA,
HALA,
MOLAYNE,
OLIVIA,
ACEROLA,
KAHILI,
/*RIKA,
POPPY,
LARRY_ELITE,
HASSEL*/
BLUE = 350,
RED,
LANCE_CHAMPION,
STEVEN,
WALLACE,
CYNTHIA,
ALDER,
IRIS,
DIANTHA,
LEON,
/*GEETA,
NEMONA,
KIERAN,*/
RIVAL = 375,
RIVAL_2,
RIVAL_3,
RIVAL_4,
RIVAL_5,
RIVAL_6
}

View File

@ -1,7 +1,9 @@
import { Moves } from "./enums/moves";
import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims";
import { BattleEndPhase, DamagePhase, MovePhase, NewBattlePhase, ObtainStatusEffectPhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../battle-phases"; import { BattleEndPhase, DamagePhase, MovePhase, NewBattlePhase, ObtainStatusEffectPhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../battle-phases";
import { BattleStat } from "./battle-stat"; import { BattleStat } from "./battle-stat";
import { BattlerTagType, EncoreTag } from "./battler-tag"; import { EncoreTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type";
import { getPokemonMessage } from "../messages"; import { getPokemonMessage } from "../messages";
import Pokemon, { AttackMoveResult, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../pokemon"; import Pokemon, { AttackMoveResult, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../pokemon";
import { StatusEffect, getStatusEffectDescriptor } from "./status-effect"; import { StatusEffect, getStatusEffectDescriptor } from "./status-effect";
@ -324,929 +326,6 @@ export class SelfStatusMove extends Move {
} }
} }
export enum Moves {
NONE,
POUND,
KARATE_CHOP,
DOUBLE_SLAP,
COMET_PUNCH,
MEGA_PUNCH,
PAY_DAY,
FIRE_PUNCH,
ICE_PUNCH,
THUNDER_PUNCH,
SCRATCH,
VICE_GRIP,
GUILLOTINE,
RAZOR_WIND,
SWORDS_DANCE,
CUT,
GUST,
WING_ATTACK,
WHIRLWIND,
FLY,
BIND,
SLAM,
VINE_WHIP,
STOMP,
DOUBLE_KICK,
MEGA_KICK,
JUMP_KICK,
ROLLING_KICK,
SAND_ATTACK,
HEADBUTT,
HORN_ATTACK,
FURY_ATTACK,
HORN_DRILL,
TACKLE,
BODY_SLAM,
WRAP,
TAKE_DOWN,
THRASH,
DOUBLE_EDGE,
TAIL_WHIP,
POISON_STING,
TWINEEDLE,
PIN_MISSILE,
LEER,
BITE,
GROWL,
ROAR,
SING,
SUPERSONIC,
SONIC_BOOM,
DISABLE,
ACID,
EMBER,
FLAMETHROWER,
MIST,
WATER_GUN,
HYDRO_PUMP,
SURF,
ICE_BEAM,
BLIZZARD,
PSYBEAM,
BUBBLE_BEAM,
AURORA_BEAM,
HYPER_BEAM,
PECK,
DRILL_PECK,
SUBMISSION,
LOW_KICK,
COUNTER,
SEISMIC_TOSS,
STRENGTH,
ABSORB,
MEGA_DRAIN,
LEECH_SEED,
GROWTH,
RAZOR_LEAF,
SOLAR_BEAM,
POISON_POWDER,
STUN_SPORE,
SLEEP_POWDER,
PETAL_DANCE,
STRING_SHOT,
DRAGON_RAGE,
FIRE_SPIN,
THUNDER_SHOCK,
THUNDERBOLT,
THUNDER_WAVE,
THUNDER,
ROCK_THROW,
EARTHQUAKE,
FISSURE,
DIG,
TOXIC,
CONFUSION,
PSYCHIC,
HYPNOSIS,
MEDITATE,
AGILITY,
QUICK_ATTACK,
RAGE,
TELEPORT,
NIGHT_SHADE,
MIMIC,
SCREECH,
DOUBLE_TEAM,
RECOVER,
HARDEN,
MINIMIZE,
SMOKESCREEN,
CONFUSE_RAY,
WITHDRAW,
DEFENSE_CURL,
BARRIER,
LIGHT_SCREEN,
HAZE,
REFLECT,
FOCUS_ENERGY,
BIDE,
METRONOME,
MIRROR_MOVE,
SELF_DESTRUCT,
EGG_BOMB,
LICK,
SMOG,
SLUDGE,
BONE_CLUB,
FIRE_BLAST,
WATERFALL,
CLAMP,
SWIFT,
SKULL_BASH,
SPIKE_CANNON,
CONSTRICT,
AMNESIA,
KINESIS,
SOFT_BOILED,
HIGH_JUMP_KICK,
GLARE,
DREAM_EATER,
POISON_GAS,
BARRAGE,
LEECH_LIFE,
LOVELY_KISS,
SKY_ATTACK,
TRANSFORM,
BUBBLE,
DIZZY_PUNCH,
SPORE,
FLASH,
PSYWAVE,
SPLASH,
ACID_ARMOR,
CRABHAMMER,
EXPLOSION,
FURY_SWIPES,
BONEMERANG,
REST,
ROCK_SLIDE,
HYPER_FANG,
SHARPEN,
CONVERSION,
TRI_ATTACK,
SUPER_FANG,
SLASH,
SUBSTITUTE,
STRUGGLE,
SKETCH,
TRIPLE_KICK,
THIEF,
SPIDER_WEB,
MIND_READER,
NIGHTMARE,
FLAME_WHEEL,
SNORE,
CURSE,
FLAIL,
CONVERSION_2,
AEROBLAST,
COTTON_SPORE,
REVERSAL,
SPITE,
POWDER_SNOW,
PROTECT,
MACH_PUNCH,
SCARY_FACE,
FEINT_ATTACK,
SWEET_KISS,
BELLY_DRUM,
SLUDGE_BOMB,
MUD_SLAP,
OCTAZOOKA,
SPIKES,
ZAP_CANNON,
FORESIGHT,
DESTINY_BOND,
PERISH_SONG,
ICY_WIND,
DETECT,
BONE_RUSH,
LOCK_ON,
OUTRAGE,
SANDSTORM,
GIGA_DRAIN,
ENDURE,
CHARM,
ROLLOUT,
FALSE_SWIPE,
SWAGGER,
MILK_DRINK,
SPARK,
FURY_CUTTER,
STEEL_WING,
MEAN_LOOK,
ATTRACT,
SLEEP_TALK,
HEAL_BELL,
RETURN,
PRESENT,
FRUSTRATION,
SAFEGUARD,
PAIN_SPLIT,
SACRED_FIRE,
MAGNITUDE,
DYNAMIC_PUNCH,
MEGAHORN,
DRAGON_BREATH,
BATON_PASS,
ENCORE,
PURSUIT,
RAPID_SPIN,
SWEET_SCENT,
IRON_TAIL,
METAL_CLAW,
VITAL_THROW,
MORNING_SUN,
SYNTHESIS,
MOONLIGHT,
HIDDEN_POWER,
CROSS_CHOP,
TWISTER,
RAIN_DANCE,
SUNNY_DAY,
CRUNCH,
MIRROR_COAT,
PSYCH_UP,
EXTREME_SPEED,
ANCIENT_POWER,
SHADOW_BALL,
FUTURE_SIGHT,
ROCK_SMASH,
WHIRLPOOL,
BEAT_UP,
FAKE_OUT,
UPROAR,
STOCKPILE,
SPIT_UP,
SWALLOW,
HEAT_WAVE,
HAIL,
TORMENT,
FLATTER,
WILL_O_WISP,
MEMENTO,
FACADE,
FOCUS_PUNCH,
SMELLING_SALTS,
FOLLOW_ME,
NATURE_POWER,
CHARGE,
TAUNT,
HELPING_HAND,
TRICK,
ROLE_PLAY,
WISH,
ASSIST,
INGRAIN,
SUPERPOWER,
MAGIC_COAT,
RECYCLE,
REVENGE,
BRICK_BREAK,
YAWN,
KNOCK_OFF,
ENDEAVOR,
ERUPTION,
SKILL_SWAP,
IMPRISON,
REFRESH,
GRUDGE,
SNATCH,
SECRET_POWER,
DIVE,
ARM_THRUST,
CAMOUFLAGE,
TAIL_GLOW,
LUSTER_PURGE,
MIST_BALL,
FEATHER_DANCE,
TEETER_DANCE,
BLAZE_KICK,
MUD_SPORT,
ICE_BALL,
NEEDLE_ARM,
SLACK_OFF,
HYPER_VOICE,
POISON_FANG,
CRUSH_CLAW,
BLAST_BURN,
HYDRO_CANNON,
METEOR_MASH,
ASTONISH,
WEATHER_BALL,
AROMATHERAPY,
FAKE_TEARS,
AIR_CUTTER,
OVERHEAT,
ODOR_SLEUTH,
ROCK_TOMB,
SILVER_WIND,
METAL_SOUND,
GRASS_WHISTLE,
TICKLE,
COSMIC_POWER,
WATER_SPOUT,
SIGNAL_BEAM,
SHADOW_PUNCH,
EXTRASENSORY,
SKY_UPPERCUT,
SAND_TOMB,
SHEER_COLD,
MUDDY_WATER,
BULLET_SEED,
AERIAL_ACE,
ICICLE_SPEAR,
IRON_DEFENSE,
BLOCK,
HOWL,
DRAGON_CLAW,
FRENZY_PLANT,
BULK_UP,
BOUNCE,
MUD_SHOT,
POISON_TAIL,
COVET,
VOLT_TACKLE,
MAGICAL_LEAF,
WATER_SPORT,
CALM_MIND,
LEAF_BLADE,
DRAGON_DANCE,
ROCK_BLAST,
SHOCK_WAVE,
WATER_PULSE,
DOOM_DESIRE,
PSYCHO_BOOST,
ROOST,
GRAVITY,
MIRACLE_EYE,
WAKE_UP_SLAP,
HAMMER_ARM,
GYRO_BALL,
HEALING_WISH,
BRINE,
NATURAL_GIFT,
FEINT,
PLUCK,
TAILWIND,
ACUPRESSURE,
METAL_BURST,
U_TURN,
CLOSE_COMBAT,
PAYBACK,
ASSURANCE,
EMBARGO,
FLING,
PSYCHO_SHIFT,
TRUMP_CARD,
HEAL_BLOCK,
WRING_OUT,
POWER_TRICK,
GASTRO_ACID,
LUCKY_CHANT,
ME_FIRST,
COPYCAT,
POWER_SWAP,
GUARD_SWAP,
PUNISHMENT,
LAST_RESORT,
WORRY_SEED,
SUCKER_PUNCH,
TOXIC_SPIKES,
HEART_SWAP,
AQUA_RING,
MAGNET_RISE,
FLARE_BLITZ,
FORCE_PALM,
AURA_SPHERE,
ROCK_POLISH,
POISON_JAB,
DARK_PULSE,
NIGHT_SLASH,
AQUA_TAIL,
SEED_BOMB,
AIR_SLASH,
X_SCISSOR,
BUG_BUZZ,
DRAGON_PULSE,
DRAGON_RUSH,
POWER_GEM,
DRAIN_PUNCH,
VACUUM_WAVE,
FOCUS_BLAST,
ENERGY_BALL,
BRAVE_BIRD,
EARTH_POWER,
SWITCHEROO,
GIGA_IMPACT,
NASTY_PLOT,
BULLET_PUNCH,
AVALANCHE,
ICE_SHARD,
SHADOW_CLAW,
THUNDER_FANG,
ICE_FANG,
FIRE_FANG,
SHADOW_SNEAK,
MUD_BOMB,
PSYCHO_CUT,
ZEN_HEADBUTT,
MIRROR_SHOT,
FLASH_CANNON,
ROCK_CLIMB,
DEFOG,
TRICK_ROOM,
DRACO_METEOR,
DISCHARGE,
LAVA_PLUME,
LEAF_STORM,
POWER_WHIP,
ROCK_WRECKER,
CROSS_POISON,
GUNK_SHOT,
IRON_HEAD,
MAGNET_BOMB,
STONE_EDGE,
CAPTIVATE,
STEALTH_ROCK,
GRASS_KNOT,
CHATTER,
JUDGMENT,
BUG_BITE,
CHARGE_BEAM,
WOOD_HAMMER,
AQUA_JET,
ATTACK_ORDER,
DEFEND_ORDER,
HEAL_ORDER,
HEAD_SMASH,
DOUBLE_HIT,
ROAR_OF_TIME,
SPACIAL_REND,
LUNAR_DANCE,
CRUSH_GRIP,
MAGMA_STORM,
DARK_VOID,
SEED_FLARE,
OMINOUS_WIND,
SHADOW_FORCE,
HONE_CLAWS,
WIDE_GUARD,
GUARD_SPLIT,
POWER_SPLIT,
WONDER_ROOM,
PSYSHOCK,
VENOSHOCK,
AUTOTOMIZE,
RAGE_POWDER,
TELEKINESIS,
MAGIC_ROOM,
SMACK_DOWN,
STORM_THROW,
FLAME_BURST,
SLUDGE_WAVE,
QUIVER_DANCE,
HEAVY_SLAM,
SYNCHRONOISE,
ELECTRO_BALL,
SOAK,
FLAME_CHARGE,
COIL,
LOW_SWEEP,
ACID_SPRAY,
FOUL_PLAY,
SIMPLE_BEAM,
ENTRAINMENT,
AFTER_YOU,
ROUND,
ECHOED_VOICE,
CHIP_AWAY,
CLEAR_SMOG,
STORED_POWER,
QUICK_GUARD,
ALLY_SWITCH,
SCALD,
SHELL_SMASH,
HEAL_PULSE,
HEX,
SKY_DROP,
SHIFT_GEAR,
CIRCLE_THROW,
INCINERATE,
QUASH,
ACROBATICS,
REFLECT_TYPE,
RETALIATE,
FINAL_GAMBIT,
BESTOW,
INFERNO,
WATER_PLEDGE,
FIRE_PLEDGE,
GRASS_PLEDGE,
VOLT_SWITCH,
STRUGGLE_BUG,
BULLDOZE,
FROST_BREATH,
DRAGON_TAIL,
WORK_UP,
ELECTROWEB,
WILD_CHARGE,
DRILL_RUN,
DUAL_CHOP,
HEART_STAMP,
HORN_LEECH,
SACRED_SWORD,
RAZOR_SHELL,
HEAT_CRASH,
LEAF_TORNADO,
STEAMROLLER,
COTTON_GUARD,
NIGHT_DAZE,
PSYSTRIKE,
TAIL_SLAP,
HURRICANE,
HEAD_CHARGE,
GEAR_GRIND,
SEARING_SHOT,
TECHNO_BLAST,
RELIC_SONG,
SECRET_SWORD,
GLACIATE,
BOLT_STRIKE,
BLUE_FLARE,
FIERY_DANCE,
FREEZE_SHOCK,
ICE_BURN,
SNARL,
ICICLE_CRASH,
V_CREATE,
FUSION_FLARE,
FUSION_BOLT,
FLYING_PRESS,
MAT_BLOCK,
BELCH,
ROTOTILLER,
STICKY_WEB,
FELL_STINGER,
PHANTOM_FORCE,
TRICK_OR_TREAT,
NOBLE_ROAR,
ION_DELUGE,
PARABOLIC_CHARGE,
FORESTS_CURSE,
PETAL_BLIZZARD,
FREEZE_DRY,
DISARMING_VOICE,
PARTING_SHOT,
TOPSY_TURVY,
DRAINING_KISS,
CRAFTY_SHIELD,
FLOWER_SHIELD,
GRASSY_TERRAIN,
MISTY_TERRAIN,
ELECTRIFY,
PLAY_ROUGH,
FAIRY_WIND,
MOONBLAST,
BOOMBURST,
FAIRY_LOCK,
KINGS_SHIELD,
PLAY_NICE,
CONFIDE,
DIAMOND_STORM,
STEAM_ERUPTION,
HYPERSPACE_HOLE,
WATER_SHURIKEN,
MYSTICAL_FIRE,
SPIKY_SHIELD,
AROMATIC_MIST,
EERIE_IMPULSE,
VENOM_DRENCH,
POWDER,
GEOMANCY,
MAGNETIC_FLUX,
HAPPY_HOUR,
ELECTRIC_TERRAIN,
DAZZLING_GLEAM,
CELEBRATE,
HOLD_HANDS,
BABY_DOLL_EYES,
NUZZLE,
HOLD_BACK,
INFESTATION,
POWER_UP_PUNCH,
OBLIVION_WING,
THOUSAND_ARROWS,
THOUSAND_WAVES,
LANDS_WRATH,
LIGHT_OF_RUIN,
ORIGIN_PULSE,
PRECIPICE_BLADES,
DRAGON_ASCENT,
HYPERSPACE_FURY,
BREAKNECK_BLITZ__PHYSICAL,
BREAKNECK_BLITZ__SPECIAL,
ALL_OUT_PUMMELING__PHYSICAL,
ALL_OUT_PUMMELING__SPECIAL,
SUPERSONIC_SKYSTRIKE__PHYSICAL,
SUPERSONIC_SKYSTRIKE__SPECIAL,
ACID_DOWNPOUR__PHYSICAL,
ACID_DOWNPOUR__SPECIAL,
TECTONIC_RAGE__PHYSICAL,
TECTONIC_RAGE__SPECIAL,
CONTINENTAL_CRUSH__PHYSICAL,
CONTINENTAL_CRUSH__SPECIAL,
SAVAGE_SPIN_OUT__PHYSICAL,
SAVAGE_SPIN_OUT__SPECIAL,
NEVER_ENDING_NIGHTMARE__PHYSICAL,
NEVER_ENDING_NIGHTMARE__SPECIAL,
CORKSCREW_CRASH__PHYSICAL,
CORKSCREW_CRASH__SPECIAL,
INFERNO_OVERDRIVE__PHYSICAL,
INFERNO_OVERDRIVE__SPECIAL,
HYDRO_VORTEX__PHYSICAL,
HYDRO_VORTEX__SPECIAL,
BLOOM_DOOM__PHYSICAL,
BLOOM_DOOM__SPECIAL,
GIGAVOLT_HAVOC__PHYSICAL,
GIGAVOLT_HAVOC__SPECIAL,
SHATTERED_PSYCHE__PHYSICAL,
SHATTERED_PSYCHE__SPECIAL,
SUBZERO_SLAMMER__PHYSICAL,
SUBZERO_SLAMMER__SPECIAL,
DEVASTATING_DRAKE__PHYSICAL,
DEVASTATING_DRAKE__SPECIAL,
BLACK_HOLE_ECLIPSE__PHYSICAL,
BLACK_HOLE_ECLIPSE__SPECIAL,
TWINKLE_TACKLE__PHYSICAL,
TWINKLE_TACKLE__SPECIAL,
CATASTROPIKA,
SHORE_UP,
FIRST_IMPRESSION,
BANEFUL_BUNKER,
SPIRIT_SHACKLE,
DARKEST_LARIAT,
SPARKLING_ARIA,
ICE_HAMMER,
FLORAL_HEALING,
HIGH_HORSEPOWER,
STRENGTH_SAP,
SOLAR_BLADE,
LEAFAGE,
SPOTLIGHT,
TOXIC_THREAD,
LASER_FOCUS,
GEAR_UP,
THROAT_CHOP,
POLLEN_PUFF,
ANCHOR_SHOT,
PSYCHIC_TERRAIN,
LUNGE,
FIRE_LASH,
POWER_TRIP,
BURN_UP,
SPEED_SWAP,
SMART_STRIKE,
PURIFY,
REVELATION_DANCE,
CORE_ENFORCER,
TROP_KICK,
INSTRUCT,
BEAK_BLAST,
CLANGING_SCALES,
DRAGON_HAMMER,
BRUTAL_SWING,
AURORA_VEIL,
SINISTER_ARROW_RAID,
MALICIOUS_MOONSAULT,
OCEANIC_OPERETTA,
GUARDIAN_OF_ALOLA,
SOUL_STEALING_7_STAR_STRIKE,
STOKED_SPARKSURFER,
PULVERIZING_PANCAKE,
EXTREME_EVOBOOST,
GENESIS_SUPERNOVA,
SHELL_TRAP,
FLEUR_CANNON,
PSYCHIC_FANGS,
STOMPING_TANTRUM,
SHADOW_BONE,
ACCELEROCK,
LIQUIDATION,
PRISMATIC_LASER,
SPECTRAL_THIEF,
SUNSTEEL_STRIKE,
MOONGEIST_BEAM,
TEARFUL_LOOK,
ZING_ZAP,
NATURES_MADNESS,
MULTI_ATTACK,
TEN_MILLION_VOLT_THUNDERBOLT,
MIND_BLOWN,
PLASMA_FISTS,
PHOTON_GEYSER,
LIGHT_THAT_BURNS_THE_SKY,
SEARING_SUNRAZE_SMASH,
MENACING_MOONRAZE_MAELSTROM,
LETS_SNUGGLE_FOREVER,
SPLINTERED_STORMSHARDS,
CLANGOROUS_SOULBLAZE,
ZIPPY_ZAP,
SPLISHY_SPLASH,
FLOATY_FALL,
PIKA_PAPOW,
BOUNCY_BUBBLE,
BUZZY_BUZZ,
SIZZLY_SLIDE,
GLITZY_GLOW,
BADDY_BAD,
SAPPY_SEED,
FREEZY_FROST,
SPARKLY_SWIRL,
VEEVEE_VOLLEY,
DOUBLE_IRON_BASH,
MAX_GUARD,
DYNAMAX_CANNON,
SNIPE_SHOT,
JAW_LOCK,
STUFF_CHEEKS,
NO_RETREAT,
TAR_SHOT,
MAGIC_POWDER,
DRAGON_DARTS,
TEATIME,
OCTOLOCK,
BOLT_BEAK,
FISHIOUS_REND,
COURT_CHANGE,
MAX_FLARE,
MAX_FLUTTERBY,
MAX_LIGHTNING,
MAX_STRIKE,
MAX_KNUCKLE,
MAX_PHANTASM,
MAX_HAILSTORM,
MAX_OOZE,
MAX_GEYSER,
MAX_AIRSTREAM,
MAX_STARFALL,
MAX_WYRMWIND,
MAX_MINDSTORM,
MAX_ROCKFALL,
MAX_QUAKE,
MAX_DARKNESS,
MAX_OVERGROWTH,
MAX_STEELSPIKE,
CLANGOROUS_SOUL,
BODY_PRESS,
DECORATE,
DRUM_BEATING,
SNAP_TRAP,
PYRO_BALL,
BEHEMOTH_BLADE,
BEHEMOTH_BASH,
AURA_WHEEL,
BREAKING_SWIPE,
BRANCH_POKE,
OVERDRIVE,
APPLE_ACID,
GRAV_APPLE,
SPIRIT_BREAK,
STRANGE_STEAM,
LIFE_DEW,
OBSTRUCT,
FALSE_SURRENDER,
METEOR_ASSAULT,
ETERNABEAM,
STEEL_BEAM,
EXPANDING_FORCE,
STEEL_ROLLER,
SCALE_SHOT,
METEOR_BEAM,
SHELL_SIDE_ARM,
MISTY_EXPLOSION,
GRASSY_GLIDE,
RISING_VOLTAGE,
TERRAIN_PULSE,
SKITTER_SMACK,
BURNING_JEALOUSY,
LASH_OUT,
POLTERGEIST,
CORROSIVE_GAS,
COACHING,
FLIP_TURN,
TRIPLE_AXEL,
DUAL_WINGBEAT,
SCORCHING_SANDS,
JUNGLE_HEALING,
WICKED_BLOW,
SURGING_STRIKES,
THUNDER_CAGE,
DRAGON_ENERGY,
FREEZING_GLARE,
FIERY_WRATH,
THUNDEROUS_KICK,
GLACIAL_LANCE,
ASTRAL_BARRAGE,
EERIE_SPELL,
DIRE_CLAW,
PSYSHIELD_BASH,
POWER_SHIFT,
STONE_AXE,
SPRINGTIDE_STORM,
MYSTICAL_POWER,
RAGING_FURY,
WAVE_CRASH,
CHLOROBLAST,
MOUNTAIN_GALE,
VICTORY_DANCE,
HEADLONG_RUSH,
BARB_BARRAGE,
ESPER_WING,
BITTER_MALICE,
SHELTER,
TRIPLE_ARROWS,
INFERNAL_PARADE,
CEASELESS_EDGE,
BLEAKWIND_STORM,
WILDBOLT_STORM,
SANDSEAR_STORM,
LUNAR_BLESSING,
TAKE_HEART,
TERA_BLAST,
SILK_TRAP,
AXE_KICK,
LAST_RESPECTS,
LUMINA_CRASH,
ORDER_UP,
JET_PUNCH,
SPICY_EXTRACT,
SPIN_OUT,
POPULATION_BOMB,
ICE_SPINNER,
GLAIVE_RUSH,
REVIVAL_BLESSING,
SALT_CURE,
TRIPLE_DIVE,
MORTAL_SPIN,
DOODLE,
FILLET_AWAY,
KOWTOW_CLEAVE,
FLOWER_TRICK,
TORCH_SONG,
AQUA_STEP,
RAGING_BULL,
MAKE_IT_RAIN,
PSYBLADE,
HYDRO_STEAM,
RUINATION,
COLLISION_COURSE,
ELECTRO_DRIFT,
SHED_TAIL,
CHILLY_RECEPTION,
TIDY_UP,
SNOWSCAPE,
POUNCE,
TRAILBLAZE,
CHILLING_WATER,
HYPER_DRILL,
TWIN_BEAM,
RAGE_FIST,
ARMOR_CANNON,
BITTER_BLADE,
DOUBLE_SHOCK,
GIGATON_HAMMER,
COMEUPPANCE,
AQUA_CUTTER,
BLAZING_TORQUE,
WICKED_TORQUE,
NOXIOUS_TORQUE,
COMBAT_TORQUE,
MAGICAL_TORQUE,
BLOOD_MOON,
MATCHA_GOTCHA,
SYRUP_BOMB,
IVY_CUDGEL,
ELECTRO_SHOT,
TERA_STARSTORM,
FICKLE_BEAM,
BURNING_BULWARK,
THUNDERCLAP,
MIGHTY_CLEAVE,
TACHYON_CUTTER,
HARD_PRESS,
DRAGON_CHEER,
ALLURING_VOICE,
TEMPER_FLARE,
SUPERCELL_SLAM,
PSYCHIC_NOISE,
UPPER_HAND,
MALIGNANT_CHAIN,
};
export abstract class MoveAttr { export abstract class MoveAttr {
public selfTarget: boolean; public selfTarget: boolean;
@ -2913,6 +1992,19 @@ export class TransformAttr extends MoveEffectAttr {
} }
} }
export class DiscourageFrequentUseAttr extends MoveAttr {
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
const lastMoves = user.getLastXMoves(4);
console.log(lastMoves);
for (let m = 0; m < lastMoves.length; m++) {
if (lastMoves[m].move === move.id)
return (4 - (m + 1)) * -10;
}
return 0;
}
}
const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY); const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY);
export type MoveAttrFilter = (attr: MoveAttr) => boolean; export type MoveAttrFilter = (attr: MoveAttr) => boolean;
@ -4652,6 +3744,7 @@ export function initMoves() {
.attr(ProtectAttr), .attr(ProtectAttr),
new AttackMove(Moves.DYNAMAX_CANNON, "Dynamax Cannon", Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, "The user unleashes a strong beam from its core. This move deals twice the damage if the target is over level 200.", -1, 0, 8) new AttackMove(Moves.DYNAMAX_CANNON, "Dynamax Cannon", Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, "The user unleashes a strong beam from its core. This move deals twice the damage if the target is over level 200.", -1, 0, 8)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.level > 200 ? 2 : 1) .attr(MovePowerMultiplierAttr, (user, target, move) => target.level > 200 ? 2 : 1)
.attr(DiscourageFrequentUseAttr)
.ignoresVirtual(), .ignoresVirtual(),
new AttackMove(Moves.SNIPE_SHOT, "Snipe Shot (N)", Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, "The user ignores the effects of opposing Pokémon's moves and Abilities that draw in moves, allowing this move to hit the chosen target.", -1, 0, 8), new AttackMove(Moves.SNIPE_SHOT, "Snipe Shot (N)", Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, "The user ignores the effects of opposing Pokémon's moves and Abilities that draw in moves, allowing this move to hit the chosen target.", -1, 0, 8),
new AttackMove(Moves.JAW_LOCK, "Jaw Lock (N)", Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, "This move prevents the user and the target from switching out until either of them faints. The effect goes away if either of the Pokémon leaves the field.", -1, 0, 8) new AttackMove(Moves.JAW_LOCK, "Jaw Lock (N)", Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, "This move prevents the user and the target from switching out until either of them faints. The effect goes away if either of the Pokémon leaves the field.", -1, 0, 8)

View File

@ -1,17 +1,17 @@
import { Gender } from "./gender"; import { Gender } from "./gender";
import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier"; import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier";
import { AttackTypeBoosterModifierType } from "../modifier/modifier-type"; import { AttackTypeBoosterModifierType } from "../modifier/modifier-type";
import { Moves } from "./move"; import { Moves } from "./enums/moves";
import { PokeballType } from "./pokeball"; import { PokeballType } from "./pokeball";
import Pokemon from "../pokemon"; import Pokemon from "../pokemon";
import { Stat } from "./pokemon-stat"; import { Stat } from "./pokemon-stat";
import { Species } from "./species"; import { Species } from "./enums/species";
import { Type } from "./type"; import { Type } from "./type";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { SpeciesFormKey } from "./pokemon-species"; import { SpeciesFormKey } from "./pokemon-species";
import { WeatherType } from "./weather"; import { WeatherType } from "./weather";
import { Biome } from "./biome"; import { Biome } from "./enums/biome";
import { TimeOfDay } from "../arena"; import { TimeOfDay } from "./enums/time-of-day";
import { Nature } from "./nature"; import { Nature } from "./nature";
export enum SpeciesWildEvolutionDelay { export enum SpeciesWildEvolutionDelay {

View File

@ -1,9 +1,9 @@
import { TimeOfDay } from "../arena"; import { TimeOfDay } from "./enums/time-of-day";
import { PokemonFormChangeItemModifier } from "../modifier/modifier"; import { PokemonFormChangeItemModifier } from "../modifier/modifier";
import Pokemon from "../pokemon"; import Pokemon from "../pokemon";
import { Moves } from "./move"; import { Moves } from "./enums/moves";
import { SpeciesFormKey } from "./pokemon-species"; import { SpeciesFormKey } from "./pokemon-species";
import { Species } from "./species"; import { Species } from "./enums/species";
import { StatusEffect } from "./status-effect"; import { StatusEffect } from "./status-effect";
export enum FormChangeItem { export enum FormChangeItem {
@ -138,6 +138,12 @@ export abstract class SpeciesFormChangeTrigger {
} }
} }
export class SpeciesFormChangeManualTrigger extends SpeciesFormChangeTrigger {
canChange(pokemon: Pokemon): boolean {
return true;
}
}
export class SpeciesFormChangeCompoundTrigger { export class SpeciesFormChangeCompoundTrigger {
public triggers: SpeciesFormChangeTrigger[]; public triggers: SpeciesFormChangeTrigger[];
@ -442,6 +448,9 @@ export const pokemonFormChanges: PokemonFormChanges = {
[Species.DIANCIE]: [ [Species.DIANCIE]: [
new SpeciesFormChange(Species.DIANCIE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.DIANCITE)) new SpeciesFormChange(Species.DIANCIE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.DIANCITE))
], ],
[Species.ETERNATUS]: [
new SpeciesFormChange(Species.ETERNATUS, '', 'eternamax', new SpeciesFormChangeManualTrigger())
],
[Species.ENAMORUS]: [ [Species.ENAMORUS]: [
new SpeciesFormChange(Species.ENAMORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) new SpeciesFormChange(Species.ENAMORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS))
] ]

View File

@ -1,5 +1,5 @@
import { Moves } from "./move"; import { Moves } from "./enums/moves";
import { Species } from "./species"; import { Species } from "./enums/species";
export type LevelMoves = (integer | Moves)[][]; export type LevelMoves = (integer | Moves)[][];

View File

@ -2,10 +2,10 @@ import { Abilities } from './ability';
import BattleScene, { AnySound } from '../battle-scene'; import BattleScene, { AnySound } from '../battle-scene';
import { GrowthRate } from './exp'; import { GrowthRate } from './exp';
import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from './pokemon-evolutions'; import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from './pokemon-evolutions';
import { Species } from './species'; import { Species } from './enums/species';
import { Type } from './type'; import { Type } from './type';
import { LevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from './pokemon-level-moves'; import { LevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from './pokemon-level-moves';
import { uncatchableSpecies } from './biome'; import { uncatchableSpecies } from './biomes';
import * as Utils from '../utils'; import * as Utils from '../utils';
export enum Region { export enum Region {

View File

@ -1,6 +1,6 @@
import { ModifierTier } from "../modifier/modifier-type"; import { ModifierTier } from "../modifier/modifier-tier";
import { Moves } from "./move"; import { Moves } from "./enums/moves";
import { Species } from "./species"; import { Species } from "./enums/species";
interface TmSpecies { interface TmSpecies {
[key: integer]: Array<Species | Array<Species | string>> [key: integer]: Array<Species | Array<Species | string>>

View File

@ -2,194 +2,15 @@ import BattleScene, { startingWave } from "../battle-scene";
import { ModifierTypeFunc, modifierTypes } from "../modifier/modifier-type"; import { ModifierTypeFunc, modifierTypes } from "../modifier/modifier-type";
import { EnemyPokemon } from "../pokemon"; import { EnemyPokemon } from "../pokemon";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { Moves } from "./move"; import { TrainerType } from "./enums/trainer-type";
import { Moves } from "./enums/moves";
import { PokeballType } from "./pokeball"; import { PokeballType } from "./pokeball";
import { pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; import { pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions";
import PokemonSpecies, { PokemonSpeciesFilter, getPokemonSpecies } from "./pokemon-species"; import PokemonSpecies, { PokemonSpeciesFilter, getPokemonSpecies } from "./pokemon-species";
import { Species } from "./species"; import { Species } from "./enums/species";
import { tmSpecies } from "./tms"; import { tmSpecies } from "./tms";
import { Type } from "./type"; import { Type } from "./type";
import { initTrainerTypeDialogue } from "./dialogue";
export enum TrainerType {
UNKNOWN,
ACE_TRAINER,
ARTIST,
BACKERS,
BACKPACKER,
BAKER,
BEAUTY,
BIKER,
BLACK_BELT,
BREEDER,
CLERK,
CYCLIST,
DANCER,
DEPOT_AGENT,
DOCTOR,
FISHERMAN,
GUITARIST,
HARLEQUIN,
HIKER,
HOOLIGANS,
HOOPSTER,
INFIELDER,
JANITOR,
LINEBACKER,
MAID,
MUSICIAN,
NURSE,
NURSERY_AIDE,
OFFICER,
PARASOL_LADY,
PILOT,
POKEFAN,
PRESCHOOLER,
PSYCHIC,
RANGER,
RICH,
RICH_KID,
ROUGHNECK,
SCIENTIST,
SMASHER,
SNOW_WORKER,
STRIKER,
STUDENT,
SWIMMER,
TWINS,
VETERAN,
WAITER,
WORKER,
YOUNGSTER,
BROCK = 200,
MISTY,
LT_SURGE,
ERIKA,
JANINE,
SABRINA,
BLAINE,
GIOVANNI,
FALKNER,
BUGSY,
WHITNEY,
MORTY,
CHUCK,
JASMINE,
PRYCE,
CLAIR,
ROXANNE,
BRAWLY,
WATTSON,
FLANNERY,
NORMAN,
WINONA,
TATE,
LIZA,
JUAN,
ROARK,
GARDENIA,
MAYLENE,
CRASHER_WAKE,
FANTINA,
BYRON,
CANDICE,
VOLKNER,
CILAN,
CHILI,
CRESS,
CHEREN,
LENORA,
ROXIE,
BURGH,
ELESA,
CLAY,
SKYLA,
BRYCEN,
DRAYDEN,
MARLON,
VIOLA,
GRANT,
KORRINA,
RAMOS,
CLEMONT,
VALERIE,
OLYMPIA,
WULFRIC,
MILO,
NESSA,
KABU,
BEA,
ALLISTER,
OPAL,
BEDE,
GORDIE,
MELONY,
PIERS,
MARNIE,
RAIHAN,
/*KATY,
BRASSIUS,
IONO,
KOFU,
LARRY,
RYME,
TULIP,
GRUSHA*/
LORELEI = 300,
BRUNO,
AGATHA,
LANCE,
WILL,
KOGA,
KAREN,
SIDNEY,
PHOEBE,
GLACIA,
DRAKE,
AARON,
BERTHA,
FLINT,
LUCIAN,
SHAUNTAL,
MARSHAL,
GRIMSLEY,
CAITLIN,
MALVA,
SIEBOLD,
WIKSTROM,
DRASNA,
HALA,
MOLAYNE,
OLIVIA,
ACEROLA,
KAHILI,
/*RIKA,
POPPY,
LARRY_ELITE,
HASSEL*/
BLUE = 350,
RED,
LANCE_CHAMPION,
STEVEN,
WALLACE,
CYNTHIA,
ALDER,
IRIS,
DIANTHA,
LEON,
/*GEETA,
NEMONA,
KIERAN,*/
RIVAL = 375,
RIVAL_2,
RIVAL_3,
RIVAL_4,
RIVAL_5,
RIVAL_6
}
export enum TrainerPoolTier { export enum TrainerPoolTier {
COMMON, COMMON,
@ -498,24 +319,6 @@ export class TrainerConfig {
return this; return this;
} }
setEncounterMessages(messages: string[], femaleMessages?: string[]): TrainerConfig {
this.encounterMessages = messages;
this.femaleEncounterMessages = femaleMessages;
return this;
}
setVictoryMessages(messages: string[], femaleMessages?: string[]): TrainerConfig {
this.victoryMessages = messages;
this.femaleVictoryMessages = femaleMessages;
return this;
}
setDefeatMessages(messages: string[], femaleMessages?: string[]): TrainerConfig {
this.defeatMessages = messages;
this.femaleDefeatMessages = femaleMessages;
return this;
}
setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig {
this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => { this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => {
const modifierTypeFunc = func(); const modifierTypeFunc = func();
@ -798,24 +601,7 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders('Lass', 'lass').setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders('Lass', 'lass').setPartyTemplates(trainerPartyTemplates.TWO_WEAKER)
.setSpeciesPools( .setSpeciesPools(
[ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ] [ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ]
).setEncounterMessages([ ),
`Hey, wanna battle?`,
`Are you a new trainer too?`,
`Hey, I haven't seen you before. Let's battle!`
], [
`Let's have a battle, shall we?`,
`You look like a new trainer. Let's have a battle!`,
`I don't recognize you. How about a battle?`
]).setVictoryMessages([
`Wow! You're strong!`,
`I didn't stand a chance, huh.`,
`I'll find you again when I'm older and beat you!`
], [
`That was impressive! I've got a lot to learn.`,
`I didn't think you'd beat me that bad…`,
`I hope we get to have a rematch some day.`
]),
[TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader([ Species.GEODUDE, Species.ONIX ], Type.ROCK), [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader([ Species.GEODUDE, Species.ONIX ], Type.ROCK),
[TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader([ Species.STARYU, Species.PSYDUCK ], Type.WATER), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader([ Species.STARYU, Species.PSYDUCK ], Type.WATER),
[TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader([ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], Type.ELECTRIC), [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader([ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], Type.ELECTRIC),
@ -832,132 +618,15 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.STEELIX ], Type.STEEL), [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.STEELIX ], Type.STEEL),
[TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader([ Species.SEEL, Species.SWINUB ], Type.ICE), [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader([ Species.SEEL, Species.SWINUB ], Type.ICE),
[TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader([ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], Type.DRAGON), [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader([ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], Type.DRAGON),
[TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader([ Species.GEODUDE, Species.NOSEPASS ], Type.ROCK) [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader([ Species.GEODUDE, Species.NOSEPASS ], Type.ROCK),
.setEncounterMessages([ [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader([ Species.MACHOP, Species.MAKUHITA ], Type.FIGHTING),
`Would you kindly demonstrate how you battle?`, [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], Type.ELECTRIC),
`You can learn many things by battling many trainers.`, [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader([ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], Type.FIRE),
`Oh, you caught me strategizing.\nWould you like to battle?` [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader([ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ], Type.NORMAL),
]).setVictoryMessages([ [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader([ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], Type.FLYING),
`Oh, I appear to have lost.\nI understand.`, [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader([ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], Type.PSYCHIC),
`It seems that I still have so much more to learn when it comes to battle.`, [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader([ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], Type.PSYCHIC),
`I'll take what I learned here today to heart.` [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader([ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], Type.WATER),
]).setDefeatMessages([
`I have learned many things from our battle.\nI hope you have too.`,
`I look forward to battling you again.\nI hope you'll use what you've learned here.`,
`I won due to everything I have learned.`
]),
[TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader([ Species.MACHOP, Species.MAKUHITA ], Type.FIGHTING)
.setEncounterMessages([
`Oh man, a challenger!\nLet's see what you can do!`,
`You seem like a big splash.\nLet's battle!`,
`Time to create a storm!\nLet's go!`
]).setVictoryMessages([
`Oh woah, you've washed me out!`,
`You surfed my wave and crashed me down!`,
`I feel like I'm lost in Granite Cave!`
]).setDefeatMessages([
`Haha, I surfed the big wave!\nChallenge me again sometime.`,
`Surf with me again some time!`,
`Just like the tides come in and out, I hope you return to challenge me again.`
]),
[TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], Type.ELECTRIC)
.setEncounterMessages([
`Time to get shocked!\nWahahahaha!`,
`I'll make sparks fly!\nWahahahaha!`,
`I hope you brought Paralyz Heal!\nWahahahaha!`
]).setVictoryMessages([
`Seems like I'm out of charge!\nWahahahaha!`,
`You've completely grounded me!\nWahahahaha!`,
`Thanks for the thrill!\nWahahahaha!`
]).setDefeatMessages([
`Recharge your batteries and challenge me again sometime!\nWahahahaha!`,
`I hope you found our battle electrifying!\nWahahahaha!`,
`Aren't you shocked I won?\nWahahahaha!`
]),
[TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader([ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], Type.FIRE)
.setEncounterMessages([
`Nice to meet you! Wait, no…\nI will crush you!`,
`I've only been a leader for a little while, but I'll smoke you!`,
`It's time to demonstrate the moves my grandfather has taught me! Let's battle!`
]).setVictoryMessages([
`You remind me of my grandfather…\nNo wonder I lost.`,
`Am I trying too hard?\nI should relax, can't get too heated.`,
`Losing isn't going to smother me out.\nTime to reignite training!`
]).setDefeatMessages([
`I hope I've made my grandfather proud…\nLet's battle again some time.`,
`I…I can't believe I won!\nDoing things my way worked!`,
`Let's exchange burning hot moves again soon!`
]),
[TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader([ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ], Type.NORMAL)
.setEncounterMessages([
`I'm surprised you managed to get here.\nLet's battle.`,
`I'll do everything in my power as a Gym Leader to win.\nLet's go!`,
`You better give this your all.\nIt's time to battle!`
]).setVictoryMessages([
`I lost to you…?\nRules are rules, though.`,
`Was moving from Olivine a mistake…?`,
`I can't believe it.\nThat was a great match.`
]).setDefeatMessages([
`We both tried our best.\nI hope we can battle again soon.`,
`You should try challenging my kid instead.\nYou might learn something!`,
`Thank you for the excellent battle.\nBetter luck next time.`
]),
[TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader([ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], Type.FLYING)
.setEncounterMessages([
`I've been soaring the skies looking for prey…\nAnd you're my target!`,
`No matter how our battle is, my Flying Pokémon and I will triumph with grace. Let's battle!`,
`I hope you aren't scared of heights.\nLet's ascend!`
]).setVictoryMessages([
`You're the first Trainer I've seen with more grace than I.\nExcellently played.`,
`Oh, my Flying Pokémon have plummeted!\nVery well.`,
`Though I may have fallen, my Pokémon will continue to fly!`
]).setDefeatMessages([
`My Flying Pokémon and I will forever dance elegantly!`,
`I hope you enjoyed our show.\nOur graceful dance is finished.`,
`Won't you come see our elegant choreography again?`
]),
[TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader([ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], Type.PSYCHIC)
.setEncounterMessages([
`Hehehe…\nWere you surprised to see me without my sister?`,
`I can see what you're thinking…\nYou want to battle!`,
`How can you defeat someone…\nWho knows your every move?`
]).setVictoryMessages([
`It can't be helped…\nI miss Liza…`,
`Your bond with your Pokémon was stronger than mine.`,
`If I were with Liza, we would have won.\nWe can finish each other's thoughts!`
]).setDefeatMessages([
`My Pokémon and I are superior!`,
`If you can't even defeat me, you'll never be able to defeat Liza either.`,
`It's all thanks to my strict training with Liza.\nI can make myself one with Pokémon.`
]),
[TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader([ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], Type.PSYCHIC)
.setEncounterMessages([
`Fufufu…\nWere you surprised to see me without my brother?`,
`I can determine what you desire…\nYou want to battle, don't you?`,
`How can you defeat someone…\nWho's one with their Pokémon?`
]).setVictoryMessages([
`It can't be helped…\nI miss Tate…`,
`Your bond with your Pokémon…\nIt's stronger than mine.`,
`If I were with Tate, we would have won.\nWe can finish each other's sentences!`
]).setDefeatMessages([
`My Pokémon and I are victorious.`,
`If you can't even defeat me, you'll never be able to defeat Tate either.`,
`It's all thanks to my strict training with Tate.\nI can synchronize myself with my Pokémon.`
]),
[TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader([ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], Type.WATER)
.setEncounterMessages([
`Now's not the time to act coy.\nLet's battle!`,
`Ahahaha, You'll be witness to my artistry with Water Pokémon!`,
`A typhoon approaches!\nWill you be able to test me?`
]).setVictoryMessages([
`You may be a genius who can take on Wallace!`,
`I focused on elegance while you trained.\nIt's only natural that you defeated me.`,
`Ahahaha!\nVery well, You have won this time.`
]).setDefeatMessages([
`My Pokémon and I have sculpted an illusion of Water and come out victorious.`,
`Ahahaha, I have won, and you have lost.`,
`Shall I loan you my outfit? It may help you battle!\nAhahaha, I jest!`
]),
[TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader([ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], Type.ROCK), [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader([ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], Type.ROCK),
[TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader([ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], Type.GRASS), [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader([ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], Type.GRASS),
[TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader([ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], Type.FIGHTING), [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader([ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], Type.FIGHTING),
@ -1059,55 +728,24 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion([ Species.LYCANROC, Species.KORAIDON, Species.KOMMO_O, Species.PAWMOT, Species.DUSKNOIR ]), [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion([ Species.LYCANROC, Species.KORAIDON, Species.KOMMO_O, Species.PAWMOT, Species.DUSKNOIR ]),
[TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion([ Species.POLITOED, Species.MIRAIDON, Species.HYDRAPPLE, Species.PORYGON_Z, Species.GRIMMSNARL ]),*/ [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion([ Species.POLITOED, Species.MIRAIDON, Species.HYDRAPPLE, Species.PORYGON_Z, Species.GRIMMSNARL ]),*/
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL).setEncounterMessages([ [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL)
`There you are! I've been looking everywhere for you!\nDid you forget to say goodbye to your best friend? .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE).setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE ]))
$So you're finally pursuing your dream, huh?\nI knew you'd do it one day
$Anyway, I'll forgive you for forgetting me, but on one condition. You have to battle me!
$You'd better give it your best! Wouldn't want your adventure to be over before it started, right?`
]).setVictoryMessages([
`You already have three Pokémon?!\nThat's not fair at all!
$Just kidding! I lost fair and square, and now I know you'll do fine out there.
$By the way, the professor wanted me to give you some items. Hopefully they're helpful!
$Do your best like always! I believe in you!`
]).setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE).setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE ])), .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE ])),
[TrainerType.RIVAL_2]: new TrainerConfig(++t).setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL_2).setEncounterMessages([ [TrainerType.RIVAL_2]: new TrainerConfig(++t).setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL_2)
`Oh, fancy meeting you here. Looks like you're still undefeated. Right on! .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE ]))
$I know what you're thinking, and no, I wasn't following you. I just happened to be in the area.
$I'm happy for you but I just want to let you know that it's OK to lose sometimes.
$We learn from our mistakes, often more than we would if we kept succeeding.
$In any case, I've been training hard for our rematch, so you'd better give it your all!`
]).setVictoryMessages([
`I… wasn't supposed to lose that time…`
]).setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE ]))
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)), .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)),
[TrainerType.RIVAL_3]: new TrainerConfig(++t).setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL_3).setEncounterMessages([ [TrainerType.RIVAL_3]: new TrainerConfig(++t).setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL_3)
`Long time no see! Still haven't lost, huh.\nYou're starting to get on my nerves. Just kidding! .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ]))
$But really, I think it's about time you came home.\nYour family and friends miss you, you know.
$I know your dream means a lot to you, but the reality is you're going to lose sooner or later.
$And when you do, I'll be there for you like always.\nNow, let me show you how strong I've become!`
]).setVictoryMessages([
`After all that… it wasn't enough…?`
]).setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT ]))
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
.setSpeciesFilter(species => species.baseTotal >= 540), .setSpeciesFilter(species => species.baseTotal >= 540),
[TrainerType.RIVAL_4]: new TrainerConfig(++t).setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival_2').setPartyTemplates(trainerPartyTemplates.RIVAL_4).setEncounterMessages([ [TrainerType.RIVAL_4]: new TrainerConfig(++t).setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival_2').setPartyTemplates(trainerPartyTemplates.RIVAL_4)
`It's me! You didn't forget about me again did you? .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ]))
$You made it really far! I'm proud of you.\nBut it looks like it's the end of your journey.
$You've awoken something in me I never knew was there.\nIt seems like all I do now is train.
$I hardly even eat or sleep now, I just train my Pokémon all day, getting stronger every time.
$And now, I've finally reached peak performance.\nI don't think anyone could beat me now.
$And you know what? It's all because of you.\nI don't know whether to thank you or hate you.
$Prepare yourself.`
]).setVictoryMessages([
`What…@d{64} what are you?`
]).setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT ]))
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
.setSpeciesFilter(species => species.baseTotal >= 540), .setSpeciesFilter(species => species.baseTotal >= 540),
[TrainerType.RIVAL_5]: new TrainerConfig(++t).setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_5).setEncounterMessages([ `` ]).setVictoryMessages([ '…' ]) [TrainerType.RIVAL_5]: new TrainerConfig(++t).setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_5)
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ])) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT ]))
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
@ -1126,4 +764,8 @@ export const trainerConfigs: TrainerConfigs = {
p.pokeball = PokeballType.MASTER_BALL; p.pokeball = PokeballType.MASTER_BALL;
p.formIndex = 1; p.formIndex = 1;
})), })),
} };
(function() {
initTrainerTypeDialogue();
})();

View File

@ -1,4 +1,4 @@
import { Biome } from "./biome"; import { Biome } from "./enums/biome";
import { getPokemonMessage } from "../messages"; import { getPokemonMessage } from "../messages";
import Pokemon from "../pokemon"; import Pokemon from "../pokemon";
import { Type } from "./type"; import { Type } from "./type";

View File

@ -5,8 +5,8 @@ import * as Utils from "./utils";
import { Mode } from "./ui/ui"; import { Mode } from "./ui/ui";
import { EGG_SEED, Egg, GachaType, getLegendaryGachaSpeciesForTimestamp, getTypeGachaTypeForTimestamp } from "./data/egg"; import { EGG_SEED, Egg, GachaType, getLegendaryGachaSpeciesForTimestamp, getTypeGachaTypeForTimestamp } from "./data/egg";
import EggHatchSceneHandler from "./ui/egg-hatch-scene-handler"; import EggHatchSceneHandler from "./ui/egg-hatch-scene-handler";
import { ModifierTier } from "./modifier/modifier-type"; import { ModifierTier } from "./modifier/modifier-tier";
import { Species } from "./data/species"; import { Species } from "./data/enums/species";
import { PlayerPokemon } from "./pokemon"; import { PlayerPokemon } from "./pokemon";
import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species";
import { StatsContainer } from "./ui/stats-container"; import { StatsContainer } from "./ui/stats-container";

5
src/enums/battle-spec.ts Normal file
View File

@ -0,0 +1,5 @@
export enum BattleSpec {
DEFAULT,
FINAL_BOSS
}

View File

@ -4,10 +4,12 @@ import { SpeciesFormKey } from "./data/pokemon-species";
import { achvs } from "./system/achv"; import { achvs } from "./system/achv";
import { SpeciesFormChange, getSpeciesFormChangeMessage } from "./data/pokemon-forms"; import { SpeciesFormChange, getSpeciesFormChangeMessage } from "./data/pokemon-forms";
import { EndEvolutionPhase, EvolutionPhase } from "./evolution-phase"; import { EndEvolutionPhase, EvolutionPhase } from "./evolution-phase";
import Pokemon, { PlayerPokemon } from "./pokemon"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "./pokemon";
import { Mode } from "./ui/ui"; import { Mode } from "./ui/ui";
import PartyUiHandler from "./ui/party-ui-handler"; import PartyUiHandler from "./ui/party-ui-handler";
import { BattlePhase } from "./battle-phase"; import { BattlePhase } from "./battle-phase";
import { BattleSpec } from "./enums/battle-spec";
import { MovePhase, PokemonHealPhase } from "./battle-phases";
export class FormChangePhase extends EvolutionPhase { export class FormChangePhase extends EvolutionPhase {
private formChange: SpeciesFormChange; private formChange: SpeciesFormChange;
@ -184,4 +186,21 @@ export class QuietFormChangePhase extends BattlePhase {
this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), Utils.fixedInt(1500)); this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), Utils.fixedInt(1500));
}); });
} }
end(): void {
if (this.pokemon.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) {
this.scene.playBgm();
this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false));
this.pokemon.bossSegments = 5;
this.pokemon.bossSegmentIndex = 4;
this.pokemon.initBattleInfo();
this.pokemon.cry();
const movePhase = this.scene.findPhase(p => p instanceof MovePhase && p.pokemon === this.pokemon) as MovePhase;
if (movePhase)
movePhase.cancel();
}
super.end();
}
} }

View File

@ -1,5 +1,15 @@
import { BattleSpec } from "./enums/battle-spec";
import Pokemon from "./pokemon"; import Pokemon from "./pokemon";
export function getPokemonMessage(pokemon: Pokemon, content: string): string { export function getPokemonMessage(pokemon: Pokemon, content: string): string {
return `${!pokemon.isPlayer() ? pokemon.hasTrainer() ? 'Foe ' : 'Wild ' : ''}${pokemon.name}${content}`; let prefix: string;
switch (pokemon.scene.currentBattle.battleSpec) {
case BattleSpec.DEFAULT:
prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? 'Foe ' : 'Wild ' : '';
break;
case BattleSpec.FINAL_BOSS:
prefix = 'Foe ';
break;
}
return `${prefix}${pokemon.name}${content}`;
} }

View File

@ -0,0 +1,7 @@
export enum ModifierTier {
COMMON,
GREAT,
ULTRA,
MASTER,
LUXURY
}

View File

@ -1,5 +1,6 @@
import * as Modifiers from './modifier'; import * as Modifiers from './modifier';
import { AttackMove, Moves, allMoves } from '../data/move'; import { AttackMove, allMoves } from '../data/move';
import { Moves } from "../data/enums/moves";
import { PokeballType, getPokeballName } from '../data/pokeball'; import { PokeballType, getPokeballName } from '../data/pokeball';
import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from '../pokemon'; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from '../pokemon';
import { EvolutionItem, SpeciesFriendshipEvolutionCondition, pokemonEvolutions } from '../data/pokemon-evolutions'; import { EvolutionItem, SpeciesFriendshipEvolutionCondition, pokemonEvolutions } from '../data/pokemon-evolutions';
@ -17,17 +18,10 @@ import { SpeciesFormKey } from '../data/pokemon-species';
import BattleScene from '../battle-scene'; import BattleScene from '../battle-scene';
import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from '../system/voucher'; import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from '../system/voucher';
import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from '../data/pokemon-forms'; import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from '../data/pokemon-forms';
import { ModifierTier } from './modifier-tier';
type Modifier = Modifiers.Modifier; type Modifier = Modifiers.Modifier;
export enum ModifierTier {
COMMON,
GREAT,
ULTRA,
MASTER,
LUXURY
};
export enum ModifierPoolType { export enum ModifierPoolType {
PLAYER, PLAYER,
WILD, WILD,
@ -1083,7 +1077,7 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers:
export function getEnemyModifierTypesForWave(waveIndex: integer, count: integer, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, gameMode: GameMode): PokemonHeldItemModifierType[] { export function getEnemyModifierTypesForWave(waveIndex: integer, count: integer, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, gameMode: GameMode): PokemonHeldItemModifierType[] {
const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType).type as PokemonHeldItemModifierType); const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType).type as PokemonHeldItemModifierType);
if ((gameMode === GameMode.CLASSIC && waveIndex === 200) || !(waveIndex % 1000)) if (!(waveIndex % 1000))
ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType); ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType);
return ret; return ret;
} }

View File

@ -1,7 +1,8 @@
import Phaser from 'phaser'; import Phaser from 'phaser';
import BattleScene, { AnySound } from './battle-scene'; import BattleScene, { AnySound } from './battle-scene';
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from './ui/battle-info'; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from './ui/battle-info';
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariablePowerAttr, Moves, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, AttackMove, AddBattlerTagAttr, OneHitKOAttr } from "./data/move"; import { Moves } from "./data/enums/moves";
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, AttackMove, AddBattlerTagAttr, OneHitKOAttr } from "./data/move";
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies } from './data/pokemon-species'; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies } from './data/pokemon-species';
import * as Utils from './utils'; import * as Utils from './utils';
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier } from './data/type'; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier } from './data/type';
@ -16,15 +17,17 @@ import { reverseCompatibleTms, tmSpecies } from './data/tms';
import { pokemonEvolutions, pokemonPrevolutions, SpeciesEvolution, SpeciesEvolutionCondition } from './data/pokemon-evolutions'; import { pokemonEvolutions, pokemonPrevolutions, SpeciesEvolution, SpeciesEvolutionCondition } from './data/pokemon-evolutions';
import { DamagePhase, FaintPhase, StatChangePhase, SwitchSummonPhase } from './battle-phases'; import { DamagePhase, FaintPhase, StatChangePhase, SwitchSummonPhase } from './battle-phases';
import { BattleStat } from './data/battle-stat'; import { BattleStat } from './data/battle-stat';
import { BattlerTag, BattlerTagLapseType, BattlerTagType, EncoreTag, TypeBoostTag, getBattlerTag } from './data/battler-tag'; import { BattlerTag, BattlerTagLapseType, EncoreTag, TypeBoostTag, getBattlerTag } from './data/battler-tags';
import { Species } from './data/species'; import { BattlerTagType } from "./data/enums/battler-tag-type";
import { Species } from './data/enums/species';
import { WeatherType } from './data/weather'; import { WeatherType } from './data/weather';
import { TempBattleStat } from './data/temp-battle-stat'; import { TempBattleStat } from './data/temp-battle-stat';
import { ArenaTagType, WeakenMoveTypeTag } from './data/arena-tag'; import { ArenaTagType, WeakenMoveTypeTag } from './data/arena-tag';
import { Biome } from './data/biome'; import { Biome } from "./data/enums/biome";
import { Abilities, Ability, BattleStatMultiplierAbAttr, BlockCritAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs } from './data/ability'; import { Abilities, Ability, BattleStatMultiplierAbAttr, BlockCritAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs } from './data/ability';
import PokemonData from './system/pokemon-data'; import PokemonData from './system/pokemon-data';
import { BattlerIndex } from './battle'; import { BattlerIndex } from './battle';
import { BattleSpec } from "./enums/battle-spec";
import { Mode } from './ui/ui'; import { Mode } from './ui/ui';
import PartyUiHandler, { PartyOption, PartyUiMode } from './ui/party-ui-handler'; import PartyUiHandler, { PartyOption, PartyUiMode } from './ui/party-ui-handler';
import SoundFade from 'phaser3-rex-plugins/plugins/soundfade'; import SoundFade from 'phaser3-rex-plugins/plugins/soundfade';
@ -2023,11 +2026,14 @@ export class EnemyPokemon extends Pokemon {
} }
initBattleInfo(): void { initBattleInfo(): void {
this.battleInfo = new EnemyBattleInfo(this.scene); if (!this.battleInfo) {
this.battleInfo.updateBossSegments(this); this.battleInfo = new EnemyBattleInfo(this.scene);
this.battleInfo.initInfo(this); this.battleInfo.updateBossSegments(this);
this.battleInfo.initInfo(this);
} else
this.battleInfo.updateBossSegments(this);
} }
setBoss(boss: boolean = true): void { setBoss(boss: boolean = true): void {
if (boss) { if (boss) {
this.bossSegments = this.scene.getEncounterBossSegments(this.scene.currentBattle.waveIndex, this.level, this.species, true); this.bossSegments = this.scene.getEncounterBossSegments(this.scene.currentBattle.waveIndex, this.level, this.species, true);
@ -2038,7 +2044,7 @@ export class EnemyPokemon extends Pokemon {
} }
} }
generateAndPopulateMoveset(): void { generateAndPopulateMoveset(formIndex?: integer): void {
switch (true) { switch (true) {
case (this.species.speciesId === Species.SMEARGLE): case (this.species.speciesId === Species.SMEARGLE):
this.moveset = [ this.moveset = [
@ -2049,18 +2055,18 @@ export class EnemyPokemon extends Pokemon {
]; ];
break; break;
case (this.species.speciesId === Species.ETERNATUS): case (this.species.speciesId === Species.ETERNATUS):
this.moveset = this.formIndex this.moveset = (formIndex !== undefined ? formIndex : this.formIndex)
? [ ? [
new PokemonMove(Moves.DYNAMAX_CANNON), new PokemonMove(Moves.DYNAMAX_CANNON),
new PokemonMove(Moves.SLUDGE_BOMB), new PokemonMove(Moves.CROSS_POISON),
new PokemonMove(Moves.FLAMETHROWER), new PokemonMove(Moves.FLAMETHROWER),
new PokemonMove(Moves.RECOVER) new PokemonMove(Moves.RECOVER)
] ]
: [ : [
new PokemonMove(Moves.ETERNABEAM), new PokemonMove(Moves.ETERNABEAM),
new PokemonMove(Moves.CROSS_POISON), new PokemonMove(Moves.SLUDGE_BOMB),
new PokemonMove(Moves.DRAGON_DANCE), new PokemonMove(Moves.DRAGON_DANCE),
new PokemonMove(Moves.RECOVER) new PokemonMove(Moves.COSMIC_POWER)
]; ];
break; break;
default: default:
@ -2105,12 +2111,17 @@ export class EnemyPokemon extends Pokemon {
const move = pokemonMove.getMove(); const move = pokemonMove.getMove();
let moveScore = moveScores[m]; let moveScore = moveScores[m];
let targetScores: integer[] = [];
for (let mt of moveTargets[move.id]) { for (let mt of moveTargets[move.id]) {
const target = this.scene.getField()[mt]; const target = this.scene.getField()[mt];
moveScore += move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1);
if (mt !== this.getBattlerIndex())
targetScore *= target.getAttackMoveEffectiveness(move.type);
targetScores.push(targetScore);
} }
moveScore /= moveTargets[move.id].length moveScore += Math.max(...targetScores);
// could make smarter by checking opponent def/spdef // could make smarter by checking opponent def/spdef
moveScores[m] = moveScore; moveScores[m] = moveScore;
@ -2229,7 +2240,7 @@ export class EnemyPokemon extends Pokemon {
const roundedHpThreshold = Math.round(hpThreshold); const roundedHpThreshold = Math.round(hpThreshold);
if (this.hp > roundedHpThreshold) { if (this.hp > roundedHpThreshold) {
if (this.hp - damage < roundedHpThreshold) { if (this.hp - damage < roundedHpThreshold) {
const bypassSegment = (this.hp - roundedHpThreshold) / damage < 0.1; const bypassSegment = this.canBypassBossSegments() && (this.hp - roundedHpThreshold) / damage < 0.1;
damage = this.hp - (bypassSegment ? Math.round(hpThreshold - segmentSize) : roundedHpThreshold); damage = this.hp - (bypassSegment ? Math.round(hpThreshold - segmentSize) : roundedHpThreshold);
this.handleBossSegmentCleared(s); this.handleBossSegmentCleared(s);
} }
@ -2241,6 +2252,15 @@ export class EnemyPokemon extends Pokemon {
return super.damage(damage, ignoreSegments, preventEndure); return super.damage(damage, ignoreSegments, preventEndure);
} }
canBypassBossSegments(): boolean {
if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) {
if (!this.formIndex && (this.bossSegmentIndex - 1) <= 1)
return false;
}
return true;
}
handleBossSegmentCleared(segmentIndex: integer): void { handleBossSegmentCleared(segmentIndex: integer): void {
while (segmentIndex - 1 < this.bossSegmentIndex) { while (segmentIndex - 1 < this.bossSegmentIndex) {
let boostedStat = BattleStat.RAND; let boostedStat = BattleStat.RAND;
@ -2275,7 +2295,6 @@ export class EnemyPokemon extends Pokemon {
statLevels++; statLevels++;
break; break;
} }
this.scene.unshiftPhase(new StatChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat ], statLevels)); this.scene.unshiftPhase(new StatChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat ], statLevels));

View File

@ -1,6 +1,6 @@
import { Arena } from "../arena"; import { Arena } from "../arena";
import { ArenaTag } from "../data/arena-tag"; import { ArenaTag } from "../data/arena-tag";
import { Biome } from "../data/biome"; import { Biome } from "../data/enums/biome";
import { Weather } from "../data/weather"; import { Weather } from "../data/weather";
export default class ArenaData { export default class ArenaData {

View File

@ -1,8 +1,8 @@
import { SelectModifierPhase } from "../battle-phases"; import { SelectModifierPhase } from "../battle-phases";
import BattleScene, { Button } from "../battle-scene"; import BattleScene, { Button } from "../battle-scene";
import { ModifierTier, ModifierType, ModifierTypeOption, PokemonBaseStatBoosterModifierType, PokemonHpRestoreModifierType, PokemonReviveModifierType } from "../modifier/modifier-type"; import { ModifierType, ModifierTypeOption, PokemonBaseStatBoosterModifierType, PokemonHpRestoreModifierType, PokemonReviveModifierType } from "../modifier/modifier-type";
import Pokemon, { AiType, EnemyPokemon, PlayerPokemon, PokemonMove } from "../pokemon"; import Pokemon, { AiType, EnemyPokemon, PlayerPokemon, PokemonMove } from "../pokemon";
import { Species } from "../data/species"; import { Species } from "../data/enums/species";
import BattleMessageUiHandler from "../ui/battle-message-ui-handler"; import BattleMessageUiHandler from "../ui/battle-message-ui-handler";
import CommandUiHandler from "../ui/command-ui-handler"; import CommandUiHandler from "../ui/command-ui-handler";
import FightUiHandler from "../ui/fight-ui-handler"; import FightUiHandler from "../ui/fight-ui-handler";
@ -11,6 +11,7 @@ import ModifierSelectUiHandler from "../ui/modifier-select-ui-handler";
import PartyUiHandler, { PartyUiMode } from "../ui/party-ui-handler"; import PartyUiHandler, { PartyUiMode } from "../ui/party-ui-handler";
import ConfirmUiHandler from "../ui/confirm-ui-handler"; import ConfirmUiHandler from "../ui/confirm-ui-handler";
import { Mode } from "../ui/ui"; import { Mode } from "../ui/ui";
import { ModifierTier } from "../modifier/modifier-tier";
export function initAutoPlay() { export function initAutoPlay() {
const thisArg = this as BattleScene; const thisArg = this as BattleScene;

View File

@ -2,7 +2,7 @@ import BattleScene, { PokeballCounts, bypassLogin } from "../battle-scene";
import Pokemon, { EnemyPokemon, PlayerPokemon } from "../pokemon"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "../pokemon";
import { pokemonPrevolutions } from "../data/pokemon-evolutions"; import { pokemonPrevolutions } from "../data/pokemon-evolutions";
import PokemonSpecies, { allSpecies, getPokemonSpecies, speciesStarters } from "../data/pokemon-species"; import PokemonSpecies, { allSpecies, getPokemonSpecies, speciesStarters } from "../data/pokemon-species";
import { Species } from "../data/species"; import { Species } from "../data/enums/species";
import * as Utils from "../utils"; import * as Utils from "../utils";
import PokemonData from "./pokemon-data"; import PokemonData from "./pokemon-data";
import PersistentModifierData from "./modifier-data"; import PersistentModifierData from "./modifier-data";
@ -11,7 +11,7 @@ import { Unlockables } from "./unlockables";
import { GameMode } from "../game-mode"; import { GameMode } from "../game-mode";
import { BattleType } from "../battle"; import { BattleType } from "../battle";
import TrainerData from "./trainer-data"; import TrainerData from "./trainer-data";
import { trainerConfigs } from "../data/trainer-type"; import { trainerConfigs } from "../data/trainer-config";
import { Setting, setSetting, settingDefaults } from "./settings"; import { Setting, setSetting, settingDefaults } from "./settings";
import { achvs } from "./achv"; import { achvs } from "./achv";
import EggData from "./egg-data"; import EggData from "./egg-data";

View File

@ -1,11 +1,11 @@
import { BattleType } from "../battle"; import { BattleType } from "../battle";
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { Biome } from "../data/biome"; import { Biome } from "../data/enums/biome";
import { Gender } from "../data/gender"; import { Gender } from "../data/gender";
import { Nature } from "../data/nature"; import { Nature } from "../data/nature";
import { PokeballType } from "../data/pokeball"; import { PokeballType } from "../data/pokeball";
import { getPokemonSpecies } from "../data/pokemon-species"; import { getPokemonSpecies } from "../data/pokemon-species";
import { Species } from "../data/species"; import { Species } from "../data/enums/species";
import { Status } from "../data/status-effect"; import { Status } from "../data/status-effect";
import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove, PokemonSummonData } from "../pokemon"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove, PokemonSummonData } from "../pokemon";
@ -43,7 +43,7 @@ export default class PokemonData {
public summonData: PokemonSummonData; public summonData: PokemonSummonData;
constructor(source: Pokemon | any) { constructor(source: Pokemon | any, forHistory: boolean = false) {
const sourcePokemon = source instanceof Pokemon ? source as Pokemon : null; const sourcePokemon = source instanceof Pokemon ? source as Pokemon : null;
this.id = source.id; this.id = source.id;
this.player = sourcePokemon ? sourcePokemon.isPlayer() : source.player; this.player = sourcePokemon ? sourcePokemon.isPlayer() : source.player;
@ -54,16 +54,19 @@ export default class PokemonData {
this.pokeball = source.pokeball; this.pokeball = source.pokeball;
this.level = source.level; this.level = source.level;
this.exp = source.exp; this.exp = source.exp;
this.levelExp = source.levelExp; if (!forHistory)
this.levelExp = source.levelExp;
this.gender = source.gender; this.gender = source.gender;
this.hp = source.hp; if (!forHistory)
this.hp = source.hp;
this.stats = source.stats; this.stats = source.stats;
this.ivs = source.ivs; this.ivs = source.ivs;
this.nature = source.nature !== undefined ? source.nature : 0 as Nature; this.nature = source.nature !== undefined ? source.nature : 0 as Nature;
this.friendship = source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship; this.friendship = source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship;
this.metLevel = source.metLevel || 5; this.metLevel = source.metLevel || 5;
this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1;
this.pauseEvolutions = !!source.pauseEvolutions; if (!forHistory)
this.pauseEvolutions = !!source.pauseEvolutions;
this.pokerus = !!source.pokerus; this.pokerus = !!source.pokerus;
this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies;
@ -72,21 +75,26 @@ export default class PokemonData {
this.fusionShiny = source.fusionShiny; this.fusionShiny = source.fusionShiny;
this.fusionGender = source.fusionGender; this.fusionGender = source.fusionGender;
this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); if (!forHistory)
this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss);
if (sourcePokemon) { if (sourcePokemon) {
this.moveset = sourcePokemon.moveset; this.moveset = sourcePokemon.moveset;
this.status = sourcePokemon.status; if (!forHistory) {
if (this.player) this.status = sourcePokemon.status;
this.summonData = sourcePokemon.summonData; if (this.player)
this.summonData = sourcePokemon.summonData;
}
} else { } else {
this.moveset = source.moveset.map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); this.moveset = source.moveset.map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp));
this.status = source.status if (!forHistory) {
? new Status(source.status.effect, source.status.turnCount, source.status.cureTurn) this.status = source.status
: undefined; ? new Status(source.status.effect, source.status.turnCount, source.status.cureTurn)
: undefined;
}
this.summonData = new PokemonSummonData(); this.summonData = new PokemonSummonData();
if (source.summonData) { if (!forHistory && source.summonData) {
this.summonData.battleStats = source.summonData.battleStats; this.summonData.battleStats = source.summonData.battleStats;
this.summonData.moveQueue = source.summonData.moveQueue; this.summonData.moveQueue = source.summonData.moveQueue;
this.summonData.tags = []; // TODO this.summonData.tags = []; // TODO

View File

@ -0,0 +1,22 @@
import { GameMode } from "../game-mode";
import PokemonData from "./pokemon-data";
import PersistentModifierData from "./modifier-data";
export enum SessionHistoryResult {
ACTIVE,
WIN,
LOSS
}
export interface SessionHistory {
seed: string;
playTime: integer;
result: SessionHistoryResult,
gameMode: GameMode;
party: PokemonData[];
modifiers: PersistentModifierData[];
money: integer;
waveIndex: integer;
gameVersion: string;
timestamp: integer;
}

View File

@ -1,5 +1,5 @@
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { TrainerType } from "../data/trainer-type"; import { TrainerType } from "../data/enums/trainer-type";
import Trainer from "../trainer"; import Trainer from "../trainer";
export default class TrainerData { export default class TrainerData {

View File

@ -1,6 +1,6 @@
import BattleScene from "../battle-scene"; import BattleScene from "../battle-scene";
import { TrainerType, trainerConfigs } from "../data/trainer-type"; import { TrainerType } from "../data/enums/trainer-type";
import { ModifierTier } from "../modifier/modifier-type"; import { ModifierTier } from "../modifier/modifier-tier";
import { Achv, achvs } from "./achv"; import { Achv, achvs } from "./achv";
export enum VoucherType { export enum VoucherType {
@ -86,30 +86,33 @@ const voucherAchvs: Achv[] = [ achvs.CLASSIC_VICTORY ];
{ {
(function() { (function() {
for (let achv of voucherAchvs) { import('../data/trainer-config').then(tc => {
const voucherType = achv.score >= 150 for (let achv of voucherAchvs) {
? VoucherType.GOLDEN const voucherType = achv.score >= 150
: achv.score >= 100 ? VoucherType.GOLDEN
? VoucherType.PREMIUM : achv.score >= 100
: achv.score >= 75 ? VoucherType.PREMIUM
? VoucherType.PLUS : achv.score >= 75
: VoucherType.REGULAR; ? VoucherType.PLUS
vouchers[achv.id] = new Voucher(voucherType, achv.description); : VoucherType.REGULAR;
} vouchers[achv.id] = new Voucher(voucherType, achv.description);
}
const bossTrainerTypes = Object.keys(trainerConfigs) const trainerConfigs = tc.trainerConfigs;
.filter(tt => trainerConfigs[tt].isBoss && trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL); const bossTrainerTypes = Object.keys(trainerConfigs)
.filter(tt => trainerConfigs[tt].isBoss && trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL);
for (let trainerType of bossTrainerTypes) { for (let trainerType of bossTrainerTypes) {
const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10
? VoucherType.PLUS ? VoucherType.PLUS
: VoucherType.PREMIUM; : VoucherType.PREMIUM;
const key = TrainerType[trainerType]; const key = TrainerType[trainerType];
vouchers[key] = new Voucher(voucherType, `Defeat ${trainerConfigs[trainerType].name}`); vouchers[key] = new Voucher(voucherType, `Defeat ${trainerConfigs[trainerType].name}`);
} }
const voucherKeys = Object.keys(vouchers); const voucherKeys = Object.keys(vouchers);
for (let k of voucherKeys) for (let k of voucherKeys)
vouchers[k].id = k; vouchers[k].id = k;
});
})(); })();
} }

View File

@ -1,7 +1,8 @@
import BattleScene from "./battle-scene"; import BattleScene from "./battle-scene";
import { pokemonPrevolutions } from "./data/pokemon-evolutions"; import { pokemonPrevolutions } from "./data/pokemon-evolutions";
import PokemonSpecies, { getPokemonSpecies } from "./data/pokemon-species"; import PokemonSpecies, { getPokemonSpecies } from "./data/pokemon-species";
import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyMemberStrength, TrainerPartyTemplate, TrainerPoolTier, TrainerType, trainerConfigs, trainerPartyTemplates } from "./data/trainer-type"; import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyMemberStrength, TrainerPartyTemplate, TrainerPoolTier, trainerConfigs, trainerPartyTemplates } from "./data/trainer-config";
import { TrainerType } from "./data/enums/trainer-type";
import { EnemyPokemon } from "./pokemon"; import { EnemyPokemon } from "./pokemon";
import * as Utils from "./utils"; import * as Utils from "./utils";

View File

@ -1,5 +1,6 @@
import BattleScene, { Button } from "../battle-scene"; import BattleScene, { Button } from "../battle-scene";
import { Biome, biomeLinks, getBiomeName } from "../data/biome"; import { biomeLinks, getBiomeName } from "../data/biomes";
import { Biome } from "../data/enums/biome";
import { addTextObject, TextStyle } from "./text"; import { addTextObject, TextStyle } from "./text";
import { Mode } from "./ui"; import { Mode } from "./ui";
import UiHandler from "./ui-handler"; import UiHandler from "./ui-handler";

View File

@ -3,9 +3,9 @@ import { Mode } from "./ui";
import { TextStyle, addTextObject, getModifierTierTextTint } from "./text"; import { TextStyle, addTextObject, getModifierTierTextTint } from "./text";
import MessageUiHandler from "./message-ui-handler"; import MessageUiHandler from "./message-ui-handler";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { ModifierTier } from "../modifier/modifier-type"; import { ModifierTier } from "../modifier/modifier-tier";
import { EGG_SEED, Egg, GachaType, getEggTierDefaultHatchWaves, getEggDescriptor, getLegendaryGachaSpeciesForTimestamp, getTypeGachaTypeForTimestamp } from "../data/egg"; import { EGG_SEED, Egg, GachaType, getEggTierDefaultHatchWaves, getEggDescriptor, getLegendaryGachaSpeciesForTimestamp, getTypeGachaTypeForTimestamp } from "../data/egg";
import { Voucher, VoucherType, getVoucherTypeIcon } from "../system/voucher"; import { VoucherType, getVoucherTypeIcon } from "../system/voucher";
import { getPokemonSpecies } from "../data/pokemon-species"; import { getPokemonSpecies } from "../data/pokemon-species";
import { Type } from "../data/type"; import { Type } from "../data/type";
import { addWindow } from "./window"; import { addWindow } from "./window";

View File

@ -7,7 +7,8 @@ import MessageUiHandler from "./message-ui-handler";
import { Mode } from "./ui"; import { Mode } from "./ui";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "../modifier/modifier"; import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "../modifier/modifier";
import { Moves, allMoves } from "../data/move"; import { allMoves } from "../data/move";
import { Moves } from "../data/enums/moves";
import { getGenderColor, getGenderSymbol } from "../data/gender"; import { getGenderColor, getGenderSymbol } from "../data/gender";
import { StatusEffect } from "../data/status-effect"; import { StatusEffect } from "../data/status-effect";
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler";

View File

@ -1,6 +1,6 @@
import BattleScene, { Button } from "../battle-scene"; import BattleScene, { Button } from "../battle-scene";
import PokemonSpecies, { SpeciesFormKey, allSpecies, getPokemonSpecies, speciesStarters as speciesStarterValues } from "../data/pokemon-species"; import PokemonSpecies, { SpeciesFormKey, allSpecies, getPokemonSpecies, speciesStarters as speciesStarterValues } from "../data/pokemon-species";
import { Species } from "../data/species"; import { Species } from "../data/enums/species";
import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text";
import { Mode } from "./ui"; import { Mode } from "./ui";
import MessageUiHandler from "./message-ui-handler"; import MessageUiHandler from "./message-ui-handler";

View File

@ -12,7 +12,7 @@ import { getLevelTotalExp } from "../data/exp";
import { Stat, getStatName } from "../data/pokemon-stat"; import { Stat, getStatName } from "../data/pokemon-stat";
import { PokemonHeldItemModifier } from "../modifier/modifier"; import { PokemonHeldItemModifier } from "../modifier/modifier";
import { StatusEffect } from "../data/status-effect"; import { StatusEffect } from "../data/status-effect";
import { getBiomeName } from "../data/biome"; import { getBiomeName } from "../data/biomes";
import { Nature, getNatureStatMultiplier } from "../data/nature"; import { Nature, getNatureStatMultiplier } from "../data/nature";
enum Page { enum Page {

View File

@ -1,5 +1,6 @@
import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText";
import InputText from "phaser3-rex-plugins/plugins/inputtext"; import InputText from "phaser3-rex-plugins/plugins/inputtext";
import { ModifierTier } from "../modifier/modifier-tier";
export enum TextStyle { export enum TextStyle {
MESSAGE, MESSAGE,
@ -146,15 +147,15 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean): string {
export function getModifierTierTextTint(tier: integer): integer { export function getModifierTierTextTint(tier: integer): integer {
switch (tier) { switch (tier) {
case 0: // ModifierTier.COMMON: case ModifierTier.COMMON:
return 0xffffff; return 0xffffff;
case 1: // ModifierTier.GREAT: case ModifierTier.GREAT:
return 0x3890f8; return 0x3890f8;
case 2: // ModifierTier.ULTRA: case ModifierTier.ULTRA:
return 0xf8d038; return 0xf8d038;
case 3: // ModifierTier.MASTER: case ModifierTier.MASTER:
return 0xe020c0; return 0xe020c0;
case 4: // ModifierTier.LUXURY: case ModifierTier.LUXURY:
return 0xe64a18; return 0xe64a18;
} }
} }

View File

@ -189,12 +189,22 @@ export default class UI extends Phaser.GameObjects.Container {
this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt, promptDelay); this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt, promptDelay);
} }
showDialogue(text: string, name: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer): void { showDialogue(text: string, name: string, delay: integer = 0, callback: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer): void {
const handler = this.getHandler(); if (text.indexOf('$') > -1) {
if (handler instanceof MessageUiHandler) const messagePages = text.split(/\$/g).map(m => m.trim());
(handler as MessageUiHandler).showDialogue(text, name, delay, callback, callbackDelay, prompt, promptDelay); let showMessageAndCallback = () => callback();
else for (let p = messagePages.length - 1; p >= 0; p--) {
this.getMessageHandler().showDialogue(text, name, delay, callback, callbackDelay, prompt, promptDelay); const originalFunc = showMessageAndCallback;
showMessageAndCallback = () => this.showDialogue(messagePages[p], name, null, originalFunc, null, true);
}
showMessageAndCallback();
} else {
const handler = this.getHandler();
if (handler instanceof MessageUiHandler)
(handler as MessageUiHandler).showDialogue(text, name, delay, callback, callbackDelay, prompt, promptDelay);
else
this.getMessageHandler().showDialogue(text, name, delay, callback, callbackDelay, prompt, promptDelay);
}
} }
showTooltip(title: string, content: string, overlap?: boolean): void { showTooltip(title: string, content: string, overlap?: boolean): void {