From 8bee927e0840400f05d5de66d96bec34c9329c76 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 27 Feb 2024 15:16:06 -0500 Subject: [PATCH] Remove some legacy features and fix a crash Remove legacy autoplay and quick start features; fix crash related to leech seed on missing source --- src/battle-scene.ts | 47 +------ src/data/battler-tags.ts | 17 ++- src/system/auto-play.ts | 266 --------------------------------------- src/system/game-data.ts | 3 - 4 files changed, 15 insertions(+), 318 deletions(-) delete mode 100644 src/system/auto-play.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index d0c985025..659aa715e 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -6,7 +6,6 @@ import PokemonSpecies, { PokemonSpeciesFilter, SpeciesFormKey, allSpecies, getPo import * as Utils from './utils'; import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier } from './modifier/modifier'; import { PokeballType } from './data/pokeball'; -import { initAutoPlay } from './system/auto-play'; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from './data/battle-anims'; import { Phase } from './phase'; import { initGameSpeed } from './system/game-speed'; @@ -53,8 +52,6 @@ import { getTypeRgb } from './data/type'; import PokemonSpriteSparkleHandler from './sprite/pokemon-sprite-sparkle-handler'; import CharSprite from './ui/char-sprite'; -const enableAuto = true; -const quickStart = false; export const bypassLogin = false; export const startingLevel = 5; export const startingWave = 1; @@ -77,8 +74,6 @@ export enum Button { CYCLE_GENDER, CYCLE_ABILITY, CYCLE_NATURE, - QUICK_START, - AUTO, SPEED_UP, SLOW_DOWN } @@ -92,7 +87,6 @@ export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound export default class BattleScene extends Phaser.Scene { public rexUI: UIPlugin; - public auto: boolean; public sessionPlayTime: integer = null; public masterVolume: number = 0.5; public bgmVolume: number = 1; @@ -104,7 +98,6 @@ export default class BattleScene extends Phaser.Scene { public experimentalSprites: boolean = false; public enableTouchControls: boolean = false; public enableVibration: boolean = false; - public quickStart: boolean = quickStart; public finalWave: integer = 200; public gameData: GameData; @@ -551,8 +544,6 @@ export default class BattleScene extends Phaser.Scene { let loadPokemonAssets = []; - this.quickStart = this.quickStart || this.isButtonPressed(Button.QUICK_START); - this.arenaPlayer = new ArenaBase(this, true); this.arenaPlayerTransition = new ArenaBase(this, true); this.arenaEnemy = new ArenaBase(this, false); @@ -594,19 +585,6 @@ export default class BattleScene extends Phaser.Scene { this.reset(); - if (this.quickStart) { - this.newBattle(); - - for (let s = 0; s < 3; s++) { - const playerSpecies = this.randomSpecies(startingWave, startingLevel); - const playerPokemon = this.addPlayerPokemon(playerSpecies, startingLevel, 0, 0); - playerPokemon.setVisible(false); - this.party.push(playerPokemon); - - loadPokemonAssets.push(playerPokemon.loadAssets()); - } - } - const ui = new UI(this); this.uiContainer.add(ui); @@ -619,16 +597,10 @@ export default class BattleScene extends Phaser.Scene { initCommonAnims().then(() => loadCommonAnimAssets(this, true)), initMoveAnim(Moves.STRUGGLE).then(() => loadMoveAnimAssets(this, [ Moves.STRUGGLE ], true)) ]).then(() => { - if (enableAuto) - initAutoPlay.apply(this); - - if (!this.quickStart) { - this.pushPhase(new LoginPhase(this)); - if (!bypassLogin) - this.pushPhase(new ConsolidateDataPhase(this)); // TODO: Remove - this.pushPhase(new CheckLoadPhase(this)); - } else - this.pushPhase(new EncounterPhase(this)); + this.pushPhase(new LoginPhase(this)); + if (!bypassLogin) + this.pushPhase(new ConsolidateDataPhase(this)); // TODO: Remove + this.pushPhase(new CheckLoadPhase(this)); this.shiftPhase(); }); @@ -680,8 +652,6 @@ export default class BattleScene extends Phaser.Scene { [Button.CYCLE_GENDER]: [keyCodes.G], [Button.CYCLE_ABILITY]: [keyCodes.E], [Button.CYCLE_NATURE]: [keyCodes.N], - [Button.QUICK_START]: [keyCodes.Q], - [Button.AUTO]: [keyCodes.F2], [Button.SPEED_UP]: [keyCodes.PLUS], [Button.SLOW_DOWN]: [keyCodes.MINUS] }; @@ -1252,15 +1222,6 @@ export default class BattleScene extends Phaser.Scene { if (this.ui.getMode() === Mode.SETTINGS) (this.ui.getHandler() as SettingsUiHandler).show([]); } - } else if (enableAuto) { - if (this.isButtonPressed(Button.AUTO)) { - this.auto = !this.auto; - if (this.auto) - this.gameSpeed = Math.floor(this.gameSpeed); - else if (this.gameSpeed > 5) - this.gameSpeed = 5; - } else - return; } else return; if (inputSuccess && this.enableVibration) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 08f229b2e..32ce7913e 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -243,6 +243,8 @@ export class InfatuatedTag extends BattlerTag { } export class SeedTag extends BattlerTag { + private sourceIndex: integer; + constructor(sourceId: integer) { super(BattlerTagType.SEEDED, BattlerTagLapseType.AFTER_MOVE, 1, Moves.LEECH_SEED, sourceId); } @@ -251,19 +253,22 @@ export class SeedTag extends BattlerTag { super.onAdd(pokemon); pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' was seeded!')); + this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - const source = pokemon.scene.getPokemonById(this.sourceId); - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED)); + const source = pokemon.getOpponents().find(o => o.getBattlerIndex() === this.sourceIndex); + if (source) { + pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED)); - const damage = Math.max(Math.floor(pokemon.getMaxHp() / 8), 1); - pokemon.scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.getBattlerIndex())); - pokemon.damage(damage); - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(), damage, getPokemonMessage(pokemon, '\'s health is\nsapped by Leech Seed!'), false, true)); + const damage = Math.max(Math.floor(pokemon.getMaxHp() / 8), 1); + pokemon.scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.getBattlerIndex())); + pokemon.damage(damage); + pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(), damage, getPokemonMessage(pokemon, '\'s health is\nsapped by Leech Seed!'), false, true)); + } } return ret; diff --git a/src/system/auto-play.ts b/src/system/auto-play.ts deleted file mode 100644 index 05255a2c0..000000000 --- a/src/system/auto-play.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { SelectModifierPhase } from "../phases"; -import BattleScene, { Button } from "../battle-scene"; -import { ModifierType, ModifierTypeOption, PokemonBaseStatBoosterModifierType, PokemonHpRestoreModifierType, PokemonReviveModifierType } from "../modifier/modifier-type"; -import Pokemon, { AiType, EnemyPokemon, PlayerPokemon, PokemonMove } from "../pokemon"; -import { Species } from "../data/enums/species"; -import BattleMessageUiHandler from "../ui/battle-message-ui-handler"; -import CommandUiHandler from "../ui/command-ui-handler"; -import FightUiHandler from "../ui/fight-ui-handler"; -import MessageUiHandler from "../ui/message-ui-handler"; -import ModifierSelectUiHandler from "../ui/modifier-select-ui-handler"; -import PartyUiHandler, { PartyUiMode } from "../ui/party-ui-handler"; -import ConfirmUiHandler from "../ui/confirm-ui-handler"; -import { Mode } from "../ui/ui"; -import { ModifierTier } from "../modifier/modifier-tier"; - -export function initAutoPlay() { - const thisArg = this as BattleScene; - - PlayerPokemon.prototype.getNextMove = EnemyPokemon.prototype.getNextMove; - - const playerPokemon = this.getParty()[0] as PlayerPokemon; - - const messageUiHandler = this.ui.handlers[Mode.MESSAGE] as BattleMessageUiHandler; - const commandUiHandler = this.ui.handlers[Mode.COMMAND] as CommandUiHandler; - const fightUiHandler = this.ui.handlers[Mode.FIGHT] as FightUiHandler; - const partyUiHandler = this.ui.handlers[Mode.PARTY] as PartyUiHandler; - const confirmUiHandler = this.ui.handlers[Mode.CONFIRM] as ConfirmUiHandler; - const modifierSelectUiHandler = this.ui.handlers[Mode.MODIFIER_SELECT] as ModifierSelectUiHandler; - - const getBestPartyMemberIndex = () => { - const enemyPokemon = thisArg.getEnemyPokemon(); - const party = thisArg.getParty(); - let bestPartyMemberIndex = -1; - let bestPartyMemberEffectiveness = 0.5; - for (let p = 0; p < party.length; p++) { - const pokemon = party[p]; - if (pokemon.getHpRatio() <= 0.2) - continue; - const effectiveness = enemyPokemon - ? getMaxMoveEffectiveness(pokemon, enemyPokemon) / getMaxMoveEffectiveness(enemyPokemon, pokemon) - : 1; - if (effectiveness > bestPartyMemberEffectiveness) { - bestPartyMemberIndex = p; - bestPartyMemberEffectiveness = effectiveness; - } - if (enemyPokemon) - console.log(p, Species[pokemon.species.speciesId], '->', Species[enemyPokemon.species.speciesId], effectiveness); - } - - if (bestPartyMemberIndex === -1) { - let highestHpValue = -1; - for (let p = 0; p < party.length; p++) { - const pokemon = party[p]; - if (pokemon.hp > highestHpValue) { - highestHpValue = pokemon.hp; - bestPartyMemberIndex = p; - } - } - } - - return bestPartyMemberIndex; - }; - - const getMaxMoveEffectiveness = (attacker: Pokemon, defender: Pokemon) => { - let maxEffectiveness = 0.5; - for (let m of attacker.getMoveset()) { - const moveType = m.getMove().type; - const effectiveness = defender.getAttackMoveEffectiveness(moveType); - if (effectiveness > maxEffectiveness) - maxEffectiveness = effectiveness; - } - - return maxEffectiveness; - }; - - let nextPartyMemberIndex = -1; - - const originalMessageUiHandlerShowText = MessageUiHandler.prototype.showText; - MessageUiHandler.prototype.showText = function (text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { - if (thisArg.auto) { - delay = 1; - callbackDelay = 0; - promptDelay = 0; - } - originalMessageUiHandlerShowText.apply(this, [ text, delay, callback, callbackDelay, prompt, promptDelay ]); - }; - - const originalMessageUiHandlerShowPrompt = MessageUiHandler.prototype.showPrompt; - MessageUiHandler.prototype.showPrompt = function (callback: Function, callbackDelay: integer) { - if (thisArg.auto) - callbackDelay = 0; - originalMessageUiHandlerShowPrompt.apply(this, [ callback, callbackDelay ]); - if (thisArg.auto) - thisArg.time.delayedCall(20, () => this.processInput(Button.ACTION)); - }; - - const originalMessageUiHandlerPromptLevelUpStats = messageUiHandler.promptLevelUpStats; - messageUiHandler.promptLevelUpStats = function (partyMemberIndex: integer, prevStats: integer[], showTotals: boolean): Promise { - return new Promise(resolve => { - originalMessageUiHandlerPromptLevelUpStats.apply(this, [ partyMemberIndex, prevStats, showTotals ]).then(() => resolve()); - if (thisArg.auto) - thisArg.time.delayedCall(20, () => this.processInput(Button.ACTION)); - }); - }; - - const originalCommandUiHandlerShow = commandUiHandler.show; - commandUiHandler.show = function (args: any[]) { - originalCommandUiHandlerShow.apply(this, [ args ]); - if (thisArg.auto) { - thisArg.time.delayedCall(20, () => { - const bestPartyMemberIndex = getBestPartyMemberIndex(); - if (bestPartyMemberIndex) { - console.log(bestPartyMemberIndex, thisArg.getParty()) - console.log('Switching to ', Species[thisArg.getParty()[bestPartyMemberIndex].species.speciesId]); - nextPartyMemberIndex = bestPartyMemberIndex; - commandUiHandler.setCursor(2); - thisArg.time.delayedCall(20, () => this.processInput(Button.ACTION)); - } else { - commandUiHandler.setCursor(0); - thisArg.time.delayedCall(20, () => this.processInput(Button.ACTION)); - } - }); - } - }; - - const originalFightUiHandlerShow = fightUiHandler.show; - fightUiHandler.show = function (args: any[]) { - originalFightUiHandlerShow.apply(this, [ args ]); - if (thisArg.auto) { - if (!playerPokemon.aiType) - playerPokemon.aiType = AiType.SMART; - thisArg.time.delayedCall(20, () => { - const nextMove = playerPokemon.getNextMove() as PokemonMove; - fightUiHandler.setCursor(playerPokemon.getMoveset().indexOf(nextMove)); - thisArg.time.delayedCall(20, () => this.processInput(Button.ACTION)); - }); - } - }; - - const originalPartyUiHandlerShow = partyUiHandler.show; - partyUiHandler.show = function (args: any[]) { - originalPartyUiHandlerShow.apply(this, [ args ]); - if (thisArg.auto) { - thisArg.time.delayedCall(20, () => { - if (nextPartyMemberIndex === -1) - nextPartyMemberIndex = getBestPartyMemberIndex(); - partyUiHandler.setCursor(nextPartyMemberIndex); - nextPartyMemberIndex = -1; - if ((partyUiHandler.partyUiMode === PartyUiMode.MODIFIER || partyUiHandler.partyUiMode === PartyUiMode.TM_MODIFIER) || partyUiHandler.getCursor()) { - this.processInput(Button.ACTION); - thisArg.time.delayedCall(250, () => this.processInput(Button.ACTION)); - } else - this.processInput(Button.CANCEL); - }); - } - }; - - const originalSwitchCheckUiHandlerShow = confirmUiHandler.show; - confirmUiHandler.show = function (args: any[]) { - originalSwitchCheckUiHandlerShow.apply(this, [ args ]); - if (thisArg.auto) { - const bestPartyMemberIndex = getBestPartyMemberIndex(); - thisArg.time.delayedCall(20, () => { - if (bestPartyMemberIndex) - nextPartyMemberIndex = bestPartyMemberIndex; - confirmUiHandler.setCursor(bestPartyMemberIndex ? 1 : 0); - thisArg.time.delayedCall(20, () => this.processInput(Button.ACTION)); - }); - } - } - - const tryGetBestModifier = (modifierTypeOptions: Array, predicate: Function) => { - for (let mt = 0; mt < modifierTypeOptions.length; mt++) { - const modifierTypeOption = modifierTypeOptions[mt]; - if (predicate(modifierTypeOption.type)) { - return mt; - } - } - - return -1; - }; - - const originalModifierSelectUiHandlerShow = modifierSelectUiHandler.show; - modifierSelectUiHandler.show = function (args: any[]) { - if (!thisArg.auto) { - originalModifierSelectUiHandlerShow.apply(this, [ args ]); - return; - } - - if (modifierSelectUiHandler.active) - return; - - thisArg.time.delayedCall(20, () => { - originalModifierSelectUiHandlerShow.apply(this, [ args ]); - - const party = thisArg.getParty(); - const modifierTypeOptions = modifierSelectUiHandler.options.map(o => o.modifierTypeOption); - const faintedPartyMemberIndex = party.findIndex(p => p.isFainted()); - const lowHpPartyMemberIndex = party.findIndex(p => p.getHpRatio() <= 0.5); - const criticalHpPartyMemberIndex = party.findIndex(p => p.getHpRatio() <= 0.25); - - let optionIndex = tryGetBestModifier(modifierTypeOptions, (modifierType: ModifierType) => { - if (modifierType instanceof PokemonHpRestoreModifierType) { - if (modifierType instanceof PokemonReviveModifierType) { - if (faintedPartyMemberIndex > -1) { - nextPartyMemberIndex = faintedPartyMemberIndex; - return true; - } - } else if (criticalHpPartyMemberIndex > -1){ - nextPartyMemberIndex = criticalHpPartyMemberIndex; - return true; - } - } - }); - - if (optionIndex === -1) { - optionIndex = tryGetBestModifier(modifierTypeOptions, (modifierType: ModifierType) => { - if (modifierType.tier >= ModifierTier.ULTRA) { - nextPartyMemberIndex = 0; - return true; - } - }); - } - - if (optionIndex === -1) { - optionIndex = tryGetBestModifier(modifierTypeOptions, (modifierType: ModifierType) => { - if (modifierType instanceof PokemonBaseStatBoosterModifierType) { - nextPartyMemberIndex = 0; - return true; - } - }); - } - - if (optionIndex === -1) { - optionIndex = tryGetBestModifier(modifierTypeOptions, (modifierType: ModifierType) => { - if (lowHpPartyMemberIndex && modifierType instanceof PokemonHpRestoreModifierType && !(ModifierType instanceof PokemonReviveModifierType)) { - nextPartyMemberIndex = lowHpPartyMemberIndex; - return true; - } - }); - } - - if (optionIndex === -1) - optionIndex = 0; - - const trySelectModifier = () => { - modifierSelectUiHandler.setCursor(optionIndex); - thisArg.time.delayedCall(20, () => { - modifierSelectUiHandler.processInput(Button.ACTION); - thisArg.time.delayedCall(250, () => { - console.log(modifierTypeOptions[optionIndex]?.type.name); - if (thisArg.getCurrentPhase() instanceof SelectModifierPhase) { - if (optionIndex < modifierSelectUiHandler.options.length - 1) { - optionIndex++; - thisArg.time.delayedCall(250, () => trySelectModifier()); - } else - modifierSelectUiHandler.processInput(Button.CANCEL); - } - }); - }); - }; - - thisArg.time.delayedCall(4000, () => trySelectModifier()); - }); - } -} \ No newline at end of file diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 408b030d2..a06ebe127 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -219,9 +219,6 @@ export class GameData { public saveSystem(): Promise { return new Promise(resolve => { - if (this.scene.quickStart) - return resolve(true); - updateUserInfo().then((success: boolean) => { if (!success) return resolve(false);