mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-01 14:02:18 +02:00
* Added `MoveUseType` and refactored MEP * Fixed Wimp out tests & ME code finally i think all the booleans are gone i hope * Added version migration for last resort and co. buh gumbug * Fixed various bugs and added tests for previous bugfixes * Reverted a couple doc changes * WIP * Update pokemon-species.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update pokemon-phase.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fixed remaining tests (I think) * Reverted rollout test changes * Fixed command phase bug causing metronome test timeout * Revert early_bird.test.ts * Fix biome.jsonc * Made `MoveUseType` start at 1 As per @DayKev's request * Fixed a thing * Fixed bolt beak condition to be marginally less jank * Applied some review suggestions * Reverted move phase operations * Added helper functions complete with markdown tables * Fixed things * Update battler-tags.ts * Fixed random issues * Fixed code * Fixed comment * Fixed import issues * Fix disable.test.ts conflicts * Update instruct.test.ts * Update `biome.jsonc` * Renamed `MoveUseType` to `MoveUseMode`; applied review comments * Fixed space * Fixed phasemanager bugs * Fixed instruct test to not bork * Fixed gorilla tactics bug * Battler Tags doc fixes * Fixed formatting and suttff * Minor comment updates and remove unused imports in `move.ts` * Re-add `public`, remove unnecessary default value in `battler-tags.ts` * Restore `{}` in `turn-start-phase.ts` Fixes `lint/correctness/noSwitchDeclarations` * Remove extra space in TSDoc in `move-phase.ts` * Use `game.field` instead of `game.scene` in `instruct.test.ts` Also `game.toEndOfTurn()` instead of `game.phaseInterceptor.to("BerryPhase")` * Use `game.field` instead of `game.scene` in `metronome.test.ts` * Use `toEndOfTurn()` instead of `to("BerryPhase")` in `powder.test.ts` * Convert `MoveUseMode` enum to `const` object * Update move-phase.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Add `enumValueToKey` utility function * Apply Biome --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
93 lines
3.4 KiB
TypeScript
93 lines
3.4 KiB
TypeScript
import type Pokemon from "#app/field/pokemon";
|
|
import { toDmgValue } from "#app/utils/common";
|
|
import type { MoveId } from "#enums/move-id";
|
|
import { allMoves } from "../data-lists";
|
|
import type Move from "./move";
|
|
|
|
/**
|
|
* Wrapper class for the {@linkcode Move} class for Pokemon to interact with.
|
|
* These are the moves assigned to a {@linkcode Pokemon} object.
|
|
* It links to {@linkcode Move} class via the move ID.
|
|
* Compared to {@linkcode Move}, this class also tracks things like
|
|
* PP Ups recieved, PP used, etc.
|
|
* @see {@linkcode isUsable} - checks if move is restricted, out of PP, or not implemented.
|
|
* @see {@linkcode getMove} - returns {@linkcode Move} object by looking it up via ID.
|
|
* @see {@linkcode usePp} - removes a point of PP from the move.
|
|
* @see {@linkcode getMovePp} - returns amount of PP a move currently has.
|
|
* @see {@linkcode getPpRatio} - returns the current PP amount / max PP amount.
|
|
* @see {@linkcode getName} - returns name of {@linkcode Move}.
|
|
**/
|
|
export class PokemonMove {
|
|
public moveId: MoveId;
|
|
public ppUsed: number;
|
|
public ppUp: number;
|
|
|
|
/**
|
|
* If defined and nonzero, overrides the maximum PP of the move (e.g., due to move being copied by Transform).
|
|
* This also nullifies all effects of `ppUp`.
|
|
*/
|
|
public maxPpOverride?: number;
|
|
|
|
constructor(moveId: MoveId, ppUsed = 0, ppUp = 0, maxPpOverride?: number) {
|
|
this.moveId = moveId;
|
|
this.ppUsed = ppUsed;
|
|
this.ppUp = ppUp;
|
|
this.maxPpOverride = maxPpOverride;
|
|
}
|
|
|
|
/**
|
|
* Checks whether the move can be selected or performed by a Pokemon, without consideration for the move's targets.
|
|
* The move is unusable if it is out of PP, restricted by an effect, or unimplemented.
|
|
*
|
|
* @param pokemon - {@linkcode Pokemon} that would be using this move
|
|
* @param ignorePp - If `true`, skips the PP check
|
|
* @param ignoreRestrictionTags - If `true`, skips the check for move restriction tags (see {@link MoveRestrictionBattlerTag})
|
|
* @returns `true` if the move can be selected and used by the Pokemon, otherwise `false`.
|
|
*/
|
|
isUsable(pokemon: Pokemon, ignorePp = false, ignoreRestrictionTags = false): boolean {
|
|
// TODO: Add Sky Drop's 1 turn stall
|
|
if (this.moveId && !ignoreRestrictionTags && pokemon.isMoveRestricted(this.moveId, pokemon)) {
|
|
return false;
|
|
}
|
|
|
|
if (this.getMove().name.endsWith(" (N)")) {
|
|
return false;
|
|
}
|
|
|
|
return ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1;
|
|
}
|
|
|
|
getMove(): Move {
|
|
return allMoves[this.moveId];
|
|
}
|
|
|
|
/**
|
|
* Sets {@link ppUsed} for this move and ensures the value does not exceed {@link getMovePp}
|
|
* @param count Amount of PP to use
|
|
*/
|
|
usePp(count = 1) {
|
|
this.ppUsed = Math.min(this.ppUsed + count, this.getMovePp());
|
|
}
|
|
|
|
getMovePp(): number {
|
|
return this.maxPpOverride || this.getMove().pp + this.ppUp * toDmgValue(this.getMove().pp / 5);
|
|
}
|
|
|
|
getPpRatio(): number {
|
|
return 1 - this.ppUsed / this.getMovePp();
|
|
}
|
|
|
|
getName(): string {
|
|
return this.getMove().name;
|
|
}
|
|
|
|
/**
|
|
* Copies an existing move or creates a valid {@linkcode PokemonMove} object from json representing one
|
|
* @param source The data for the move to copy; can be a {@linkcode PokemonMove} or JSON object representing one
|
|
* @returns A valid {@linkcode PokemonMove} object
|
|
*/
|
|
static loadMove(source: PokemonMove | any): PokemonMove {
|
|
return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.maxPpOverride);
|
|
}
|
|
}
|