From 2ea180e94c9b4e04d843f4b8e8055332cd723dde Mon Sep 17 00:00:00 2001 From: Dean Date: Sat, 14 Jun 2025 18:46:28 -0700 Subject: [PATCH] Add timing modifier and fix post speed ordering --- src/enums/move-phase-timing-modifier.ts | 5 +++++ src/queues/move-phase-priority-queue.ts | 22 +++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 src/enums/move-phase-timing-modifier.ts diff --git a/src/enums/move-phase-timing-modifier.ts b/src/enums/move-phase-timing-modifier.ts new file mode 100644 index 00000000000..219def57466 --- /dev/null +++ b/src/enums/move-phase-timing-modifier.ts @@ -0,0 +1,5 @@ +export enum MovePhaseTimingModifier { + LAST = 0, + NORMAL, + FIRST +} \ No newline at end of file diff --git a/src/queues/move-phase-priority-queue.ts b/src/queues/move-phase-priority-queue.ts index 142271424b3..b751b4bb608 100644 --- a/src/queues/move-phase-priority-queue.ts +++ b/src/queues/move-phase-priority-queue.ts @@ -1,5 +1,8 @@ +import type { PhaseConditionFunc } from "#app/@types/phase-condition"; import type { MovePhase } from "#app/phases/move-phase"; 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 { public override reorder(): void { @@ -7,6 +10,13 @@ export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue 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 { this.queue.sort((a: MovePhase, b: MovePhase) => { const priority = [a, b].map(movePhase => { @@ -18,11 +28,17 @@ export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue movePhase.move.getMove().getPriorityModifier(movePhase.pokemon), ); - if (priority[0] === priority[1] && priorityModifiers[0] !== priorityModifiers[1]) { - return priorityModifiers[0] - priorityModifiers[1]; + const timingModifiers = [a, b].map(movePhase => movePhase.timingModifier); + + 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]; }); } }