Move some comments to tsdocs, add tsdocs for `canMove()`

This commit is contained in:
NightKev 2024-09-07 01:25:02 -07:00
parent b9f7f1a5b5
commit 5bd259335b
1 changed files with 22 additions and 12 deletions

View File

@ -46,6 +46,11 @@ export class MovePhase extends BattlePhase {
this.ignorePp = ignorePp ?? false; this.ignorePp = ignorePp ?? false;
} }
/**
* Checks if the pokemon is active, if the move is usable, and that the move is targetting something.
* @param ignoreDisableTags `true` to not check if the move is disabled
* @returns `true` if all the checks pass
*/
canMove(ignoreDisableTags?: boolean): boolean { canMove(ignoreDisableTags?: boolean): boolean {
return this.pokemon.isActive(true) && this.move.isUsable(this.pokemon, this.ignorePp, ignoreDisableTags) && !!this.targets.length; return this.pokemon.isActive(true) && this.move.isUsable(this.pokemon, this.ignorePp, ignoreDisableTags) && !!this.targets.length;
} }
@ -109,11 +114,11 @@ export class MovePhase extends BattlePhase {
this.end(); this.end();
} }
/** Check for cancellation edge cases - no targets remaining, or Moves.NONE is on the queue (TODO: when does this happen?) */
resolveFinalPreMoveCancellationChecks() { resolveFinalPreMoveCancellationChecks() {
const targets = this.getActiveTargetPokemon(); const targets = this.getActiveTargetPokemon();
const moveQueue = this.pokemon.getMoveQueue(); const moveQueue = this.pokemon.getMoveQueue();
// Cancellation edge cases - no targets remaining, or Moves.NONE is on the queue (TODO: when does this happen?)
if (targets.length === 0 || (moveQueue.length && moveQueue[0].move === Moves.NONE)) { if (targets.length === 0 || (moveQueue.length && moveQueue[0].move === Moves.NONE)) {
this.showFailedText(); this.showFailedText();
this.cancelled = true; this.cancelled = true;
@ -124,9 +129,7 @@ export class MovePhase extends BattlePhase {
return this.scene.getField(true).filter(p => this.targets.includes(p.getBattlerIndex())); return this.scene.getField(true).filter(p => this.targets.includes(p.getBattlerIndex()));
} }
/** /** Handles Sleep/Paralysis/Freeze rolls and side effects, along with lapsing volatile statuses. */
* Handles Sleep/Paralysis/Freeze rolls and side effects, along with lapsing volatile statuses.
*/
resolvePreMoveStatusEffects() { resolvePreMoveStatusEffects() {
if (!this.followUp && this.pokemon.status && !this.pokemon.status.isPostTurn()) { if (!this.followUp && this.pokemon.status && !this.pokemon.status.isPostTurn()) {
this.pokemon.status.incrementTurn(); this.pokemon.status.incrementTurn();
@ -368,10 +371,24 @@ export class MovePhase extends BattlePhase {
} }
} }
/**
* Handles the case where the move was cancelled or failed:
* - Uses PP if the move failed (not cancelled) and should use PP (failed moves are not affected by Pressure)
* - Records a cancelled OR failed move in move history, so Abilities like Truant don't trigger on the
* next turn and soft-lock.
* - Lapses `MOVE_EFFECT` tags:
* - Semi-invulnerable battler tags (Fly/Dive/etc.) are intended to lapse on move effects, but also need
* to lapse on move failure/cancellation.
*
* TODO: ...this seems weird.
* - Removes the second turn of charge moves
*
* TODO: handle charge moves more gracefully
*/
handlePreMoveFailures() { handlePreMoveFailures() {
if (this.cancelled || this.failed) { if (this.cancelled || this.failed) {
if (this.failed) { if (this.failed) {
const ppUsed = this.ignorePp ? 0 : 1; // note that failed move PP usage isn't affected by pressure const ppUsed = this.ignorePp ? 0 : 1;
if (ppUsed) { if (ppUsed) {
this.move.usePp(); this.move.usePp();
@ -380,17 +397,10 @@ export class MovePhase extends BattlePhase {
this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed));
} }
// Record a cancelled OR failed move in move history, so Abilities like Truant don't trigger on the
// next turn and soft-lock.
this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL });
// Semi-invulnerable battler tags (Fly/Dive/etc.) are intended to lapse on move effects, but also need
// to lapse on move failure/cancellation.
// TODO: ...this seems weird.
this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT);
// Remove the second turn of charge moves
// TODO: handle charge moves more gracefully
this.pokemon.getMoveQueue().shift(); this.pokemon.getMoveQueue().shift();
} }
} }