diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 25d4335a201..41cc1babeda 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1372,6 +1372,7 @@ export default class BattleScene extends SceneBase { for (const pokemon of this.getPlayerParty()) { pokemon.resetBattleData(); + pokemon.resetTera(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } diff --git a/src/field/arena.ts b/src/field/arena.ts index deeb261a491..a78c295cc63 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -44,6 +44,7 @@ export class Arena { public bgm: string; public ignoreAbilities: boolean; public ignoringEffectSource: BattlerIndex | null; + public playerTerasUsed: number; private lastTimeOfDay: TimeOfDay; @@ -58,6 +59,7 @@ export class Arena { this.bgm = bgm; this.trainerPool = biomeTrainerPools[biome]; this.updatePoolsForTimeOfDay(); + this.playerTerasUsed = 0; } init() { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 006b15eace3..b5261c3bc20 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3796,12 +3796,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { resetBattleData(): void { this.battleData = new PokemonBattleData(); - const wasTerastallized = this.isTerastallized; - this.isTerastallized = false; - if (wasTerastallized) { - this.updateSpritePipelineData(); - globalScene.triggerPokemonFormChange(this, SpeciesFormChangeLapseTeraTrigger); - } } resetBattleSummonData(): void { @@ -3814,6 +3808,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + resetTera(): void { + const wasTerastallized = this.isTerastallized; + this.isTerastallized = false; + if (wasTerastallized) { + this.updateSpritePipelineData(); + globalScene.triggerPokemonFormChange(this, SpeciesFormChangeLapseTeraTrigger); + } + } + resetTurnData(): void { this.turnData = new PokemonTurnData(); } diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 7bf3bc81930..be34ecc5873 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -109,6 +109,8 @@ export class FaintPhase extends PokemonPhase { globalScene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + pokemon.resetTera(); + if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, globalScene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct? diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index 2c1a6c33163..c87c5d00be5 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -36,5 +36,6 @@ export class PartyHealPhase extends BattlePhase { globalScene.ui.fadeIn(500).then(() => this.end()); }); }); + globalScene.arena.playerTerasUsed = 0; } } diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts index 95e4845a633..4b094ee7cfb 100644 --- a/src/phases/tera-phase.ts +++ b/src/phases/tera-phase.ts @@ -6,7 +6,8 @@ import { globalScene } from "#app/global-scene"; import { Type } from "#app/enums/type"; import { achvs } from "#app/system/achv"; import { SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; -import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; +import { CommonAnim } from "#app/data/battle-anims"; +import { CommonAnimPhase } from "./common-anim-phase"; export class TeraPhase extends BattlePhase { public pokemon: Pokemon; @@ -32,9 +33,8 @@ export class TeraPhase extends BattlePhase { // parent.add(teraburst); // this.pokemon.scene.time.delayedCall(Utils.fixedInt(Math.floor((1000 / 12) * 13)), () => teraburst.destroy()); - new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(); globalScene.queueMessage(getPokemonNameWithAffix(this.pokemon) + " terrastallized into a " + i18next.t(`pokemonInfo:Type.${Type[this.pokemon.teraType]}`) + " type!"); // TODO: Localize this - // this.scene.unshiftPhase(new CommonAnimPhase(this.scene, this.pokemon.getBattlerIndex(), undefined, CommonAnim.???)); + globalScene.unshiftPhase(new CommonAnimPhase(this.pokemon.getBattlerIndex(), this.pokemon.getBattlerIndex(), CommonAnim.TERASTALLIZE, false)); this.end(); } @@ -44,6 +44,10 @@ export class TeraPhase extends BattlePhase { this.pokemon.isTerastallized = true; this.pokemon.updateSpritePipelineData(); + if (this.pokemon.isPlayer()) { + globalScene.arena.playerTerasUsed += 1; + } + globalScene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangeTeraTrigger); if (this.pokemon.isPlayer()) { diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index 98ab611ff3c..435f416b7e3 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -10,12 +10,14 @@ export default class ArenaData { public weather: Weather | null; public terrain: Terrain | null; public tags: ArenaTag[]; + public playerTerasUsed: number; constructor(source: Arena | any) { const sourceArena = source instanceof Arena ? source as Arena : null; this.biome = sourceArena ? sourceArena.biomeType : source.biome; this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : null; this.terrain = sourceArena ? sourceArena.terrain : source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : null; + this.playerTerasUsed = sourceArena ? sourceArena.playerTerasUsed : source.playerTerasUsed; this.tags = []; if (source.tags) { diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 58d416eb468..5f5996dad95 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1082,6 +1082,8 @@ export class GameData { globalScene.arena.terrain = sessionData.arena.terrain; globalScene.arena.eventTarget.dispatchEvent(new TerrainChangedEvent(TerrainType.NONE, globalScene.arena.terrain?.terrainType!, globalScene.arena.terrain?.turnsLeft!)); // TODO: is this bang correct? + globalScene.arena.playerTerasUsed = sessionData.arena.playerTerasUsed; + globalScene.arena.tags = sessionData.arena.tags; if (globalScene.arena.tags) { for (const tag of globalScene.arena.tags) { diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 898e5997434..36b766e6891 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -175,9 +175,9 @@ export default class CommandUiHandler extends UiHandler { canTera(): boolean { const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length; - const currentTeras = globalScene.getPlayerParty().filter(p => p.isTerastallized).length; - const plannedTera = globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA; - return hasTeraMod && currentTeras < 1 && !plannedTera; + const currentTeras = globalScene.arena.playerTerasUsed; + const plannedTera = globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA ? 1 : 0; + return hasTeraMod && (currentTeras + plannedTera) < 1; } getCursor(): integer {