Add timing modifier and fix post speed ordering

This commit is contained in:
Dean 2025-06-14 18:46:28 -07:00
parent 0121589d6f
commit 2ea180e94c
2 changed files with 24 additions and 3 deletions

View File

@ -0,0 +1,5 @@
export enum MovePhaseTimingModifier {
LAST = 0,
NORMAL,
FIRST
}

View File

@ -1,5 +1,8 @@
import type { PhaseConditionFunc } from "#app/@types/phase-condition";
import type { MovePhase } from "#app/phases/move-phase"; import type { MovePhase } from "#app/phases/move-phase";
import { PokemonPhasePriorityQueue } from "#app/queues/pokemon-phase-priority-queue"; import { PokemonPhasePriorityQueue } from "#app/queues/pokemon-phase-priority-queue";
import { isNullOrUndefined } from "#app/utils/common";
import type { MovePhaseTimingModifier } from "#enums/move-phase-timing-modifier";
export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue<MovePhase> { export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue<MovePhase> {
public override reorder(): void { public override reorder(): void {
@ -7,6 +10,13 @@ export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue<MovePhase>
this.sortPostSpeed(); this.sortPostSpeed();
} }
public setTimingModifier(condition: PhaseConditionFunc, modifier: MovePhaseTimingModifier): void {
const phase = this.queue.find(phase => condition(phase));
if (!isNullOrUndefined(phase)) {
phase.timingModifier = modifier;
}
}
private sortPostSpeed(): void { private sortPostSpeed(): void {
this.queue.sort((a: MovePhase, b: MovePhase) => { this.queue.sort((a: MovePhase, b: MovePhase) => {
const priority = [a, b].map(movePhase => { const priority = [a, b].map(movePhase => {
@ -18,11 +28,17 @@ export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue<MovePhase>
movePhase.move.getMove().getPriorityModifier(movePhase.pokemon), movePhase.move.getMove().getPriorityModifier(movePhase.pokemon),
); );
if (priority[0] === priority[1] && priorityModifiers[0] !== priorityModifiers[1]) { const timingModifiers = [a, b].map(movePhase => movePhase.timingModifier);
return priorityModifiers[0] - priorityModifiers[1];
if (timingModifiers[0] !== timingModifiers[1]) {
return timingModifiers[1] - timingModifiers[0];
} }
return priority[0] - priority[1]; if (priority[0] === priority[1] && priorityModifiers[0] !== priorityModifiers[1]) {
return priorityModifiers[1] - priorityModifiers[0];
}
return priority[1] - priority[0];
}); });
} }
} }