From a33a49cbdae506ae813ae0f54cad71cb63eab4a1 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Fri, 12 May 2023 11:08:33 -0400 Subject: [PATCH] More fixes for double battles --- src/battle-phases.ts | 25 ++++++------------ src/data/ability.ts | 2 +- src/data/arena-tag.ts | 4 +-- src/data/move.ts | 4 +-- src/pokemon.ts | 57 +++++++++++++++++++++++++++++++++++++++-- src/system/game-data.ts | 6 ++--- 6 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/battle-phases.ts b/src/battle-phases.ts index 8774eb76a6f..d9f92a6168c 100644 --- a/src/battle-phases.ts +++ b/src/battle-phases.ts @@ -1,5 +1,5 @@ import BattleScene, { maxExpLevel, startingLevel, startingWave } from "./battle-scene"; -import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult } from "./pokemon"; +import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition } from "./pokemon"; import * as Utils from './utils'; import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveCategory, MoveEffectAttr, MoveFlags, MoveHitEffectAttr, Moves, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, OneHitKOAttr } from "./data/move"; import { Mode } from './ui/ui'; @@ -213,11 +213,8 @@ export class EncounterPhase extends BattlePhase { if (this.scene.getPlayerPokemon().visible) this.scene.field.moveBelow(enemyPokemon, this.scene.getPlayerPokemon()); enemyPokemon.tint(0, 0.5); - if (battle.enemyField.length > 1) { - enemyPokemon.x += 32 * (e ? 1 : -1); - if (!e) - enemyPokemon.y += 8 * (e ? 1 : -1); - } + if (battle.enemyField.length > 1) + enemyPokemon.setFieldPosition(e ? FieldPosition.RIGHT : FieldPosition.LEFT); }); if (!this.loaded) { @@ -469,14 +466,10 @@ export class SummonPhase extends PartyMemberPokemonPhase { const playerPokemon = this.getPokemon(); if (this.fieldIndex === 1) { - this.scene.tweens.add({ - targets: this.scene.getPlayerField(), - ease: 'Sine.easeOut', - duration: 250, - x: (_target, _key, value: number, fieldIndex: integer) => value + 32 * (fieldIndex ? 1 : -1), - y: (_target, _key, value: number, fieldIndex: integer) => value + 8 * (fieldIndex ? 1 : -1) - }); - } + this.scene.getPlayerField()[0].setFieldPosition(FieldPosition.LEFT, 250); + playerPokemon.setFieldPosition(FieldPosition.RIGHT, 0); + } else + playerPokemon.setFieldPosition(!this.scene.currentBattle.double ? FieldPosition.CENTER : FieldPosition.LEFT); pokeball.setVisible(true); this.scene.tweens.add({ @@ -744,7 +737,7 @@ export class CommandPhase extends FieldPhase { if (cursor === -1 || playerPokemon.trySelectMove(cursor, args[0] as boolean)) { this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.FIGHT, cursor: cursor, - move: cursor > -1 ? { move: playerPokemon.moveset[cursor].moveId } : null, args: args }; // TODO: Struggle logic + move: cursor > -1 ? { move: playerPokemon.moveset[cursor].moveId } : null, targetIndex: targetIndex, args: args }; // TODO: Struggle logic success = true; } else if (cursor < playerPokemon.getMoveset().length) { const move = playerPokemon.getMoveset()[cursor]; @@ -872,8 +865,6 @@ export class TurnStartPhase extends FieldPhase { const pokemon = field[o]; const turnCommand = this.scene.currentBattle.turnCommands[o]; - console.log(pokemon, field, o); - switch (turnCommand.command) { case Command.FIGHT: const queuedMove = turnCommand.move; diff --git a/src/data/ability.ts b/src/data/ability.ts index 67df80c0a60..49f2bae8793 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -654,7 +654,7 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { if (pokemon.getHpRatio() < 1) { const scene = pokemon.scene; scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${pokemon.getAbility()}!`)); - scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.isPlayer(), MoveResult.OTHER)); + scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.isPlayer(), pokemon.getFieldIndex(), MoveResult.OTHER)); pokemon.damage(Math.ceil(pokemon.getMaxHp() * (16 / this.damageFactor))); return true; } diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index ff6f8b262bd..26ffe451a73 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -151,7 +151,7 @@ class SpikesTag extends ArenaTrapTag { const damageHpRatio = 1 / (10 - 2 * this.layers); pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is hurt\nby the spikes!')); - pokemon.scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.isPlayer(), MoveResult.OTHER)); + pokemon.scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.isPlayer(), pokemon.getFieldIndex(), MoveResult.OTHER)); pokemon.damage(Math.ceil(pokemon.getMaxHp() * damageHpRatio)); return true; } @@ -225,7 +225,7 @@ class StealthRockTag extends ArenaTrapTag { if (damageHpRatio) { pokemon.scene.queueMessage(`Pointed stones dug into\n${pokemon.name}!`); - pokemon.scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.isPlayer(), MoveResult.OTHER)); + pokemon.scene.unshiftPhase(new DamagePhase(pokemon.scene, pokemon.isPlayer(), pokemon.getFieldIndex(), MoveResult.OTHER)); pokemon.damage(Math.ceil(pokemon.getMaxHp() * damageHpRatio)); } diff --git a/src/data/move.ts b/src/data/move.ts index 4c53e1efe5a..f053c02afb3 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -889,7 +889,7 @@ export class RecoilAttr extends MoveEffectAttr { return false; const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) / 4), 1); - user.scene.unshiftPhase(new DamagePhase(user.scene, user.isPlayer(), MoveResult.OTHER)); + user.scene.unshiftPhase(new DamagePhase(user.scene, user.isPlayer(), user.getFieldIndex(), MoveResult.OTHER)); user.scene.queueMessage(getPokemonMessage(user, ' is hit\nwith recoil!')); user.damage(recoilDamage); @@ -906,7 +906,7 @@ export class SacrificialAttr extends MoveEffectAttr { if (!super.apply(user, target, move, args)) return false; - user.scene.unshiftPhase(new DamagePhase(user.scene, user.isPlayer(), MoveResult.OTHER)); + user.scene.unshiftPhase(new DamagePhase(user.scene, user.isPlayer(), user.getFieldIndex(), MoveResult.OTHER)); user.damage(user.getMaxHp()); return true; diff --git a/src/pokemon.ts b/src/pokemon.ts index 1c8f891707e..725a2fb2cfa 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -26,6 +26,12 @@ import { Biome } from './data/biome'; import { Abilities, Ability, BattleStatMultiplierAbAttr, BlockCritAbAttr, PreApplyBattlerTagAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, abilities, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs } from './data/ability'; import PokemonData from './system/pokemon-data'; +export enum FieldPosition { + CENTER, + LEFT, + RIGHT +} + export default abstract class Pokemon extends Phaser.GameObjects.Container { public id: integer; public name: string; @@ -50,6 +56,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public battleSummonData: PokemonBattleSummonData; public turnData: PokemonTurnData; + public fieldPosition: FieldPosition; + public maskEnabled: boolean; public maskSprite: Phaser.GameObjects.Sprite; @@ -139,6 +147,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.calculateStats(); + this.fieldPosition = FieldPosition.CENTER; + scene.fieldUI.addAt(this.battleInfo, 0); this.battleInfo.initInfo(this); @@ -263,11 +273,54 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { : this.maskSprite; } - playAnim(): void{ + playAnim(): void { this.getSprite().play(this.getBattleSpriteKey()); this.getTintSprite().play(this.getBattleSpriteKey()); } + getFieldPositionOffset(): [ number, number ] { + switch (this.fieldPosition) { + case FieldPosition.CENTER: + return [ 0, 0 ]; + case FieldPosition.LEFT: + return [ -32, -8 ]; + case FieldPosition.RIGHT: + return [ 32, 0 ]; + } + } + + setFieldPosition(fieldPosition: FieldPosition, duration?: integer): Promise { + return new Promise(resolve => { + if (fieldPosition === this.fieldPosition) { + resolve(); + return; + } + + const initialOffset = this.getFieldPositionOffset(); + + this.fieldPosition = fieldPosition; + + const newOffset = this.getFieldPositionOffset(); + + let relX = newOffset[0] - initialOffset[0]; + let relY = newOffset[1] - initialOffset[1]; + + if (duration) { + this.scene.tweens.add({ + targets: this, + x: (_target, _key, value: number) => value + relX, + y: (_target, _key, value: number) => value + relY, + duration: duration, + ease: 'Sine.easeOut', + onComplete: () => resolve() + }); + } else { + this.x += relX; + this.y += relY; + } + }); + } + getBattleStat(stat: Stat): integer { if (stat === Stat.HP) return this.stats[Stat.HP]; @@ -597,7 +650,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (damage) { - this.scene.unshiftPhase(new DamagePhase(this.scene, this.isPlayer(), result as DamageResult)); + this.scene.unshiftPhase(new DamagePhase(this.scene, this.isPlayer(), this.getFieldIndex(), result as DamageResult)); if (isCritical) this.scene.queueMessage('A critical hit!'); this.damage(damage); diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 51a64b22f19..9d5e2270c18 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -127,8 +127,8 @@ export class GameData { const sessionData = { party: scene.getParty().map(p => new PokemonData(p)), enemyField: scene.getEnemyField().map(p => new PokemonData(p)), - modifiers: scene.findModifiers(m => true).map(m => new PersistentModifierData(m, true)), - enemyModifiers: scene.findModifiers(m => true, false).map(m => new PersistentModifierData(m, false)), + modifiers: scene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), + enemyModifiers: scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), arena: new ArenaData(scene.arena), pokeballCounts: scene.pokeballCounts, waveIndex: scene.currentBattle.waveIndex, @@ -153,7 +153,7 @@ export class GameData { try { const sessionData = JSON.parse(atob(localStorage.getItem('sessionData')), (k: string, v: any) => { - if (k === 'party' || k === 'enemyParty') { + if (k === 'party' || k === 'enemyField') { const ret: PokemonData[] = []; for (let pd of v) ret.push(new PokemonData(pd));