diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 73526cc2448..6f576c29b08 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -228,7 +228,7 @@ export class PhaseManager { private phaseQueuePrependSpliceIndex = -1; private nextCommandPhaseQueue: Phase[] = []; - private dynamicQueueManager = new DynamicQueueManager(); + public dynamicQueueManager = new DynamicQueueManager(); private currentPhase: Phase | null = null; private standbyPhase: Phase | null = null; diff --git a/src/queues/dynamic-queue-manager.ts b/src/queues/dynamic-queue-manager.ts index 3123c0b712b..75680074fe1 100644 --- a/src/queues/dynamic-queue-manager.ts +++ b/src/queues/dynamic-queue-manager.ts @@ -6,6 +6,7 @@ import { MovePhasePriorityQueue } from "#app/queues/move-phase-priority-queue"; import type { PhasePriorityQueue } from "#app/queues/phase-priority-queue"; import { PokemonPhasePriorityQueue } from "#app/queues/pokemon-phase-priority-queue"; import { PostSummonPhasePriorityQueue } from "#app/queues/post-summon-phase-priority-queue"; +import type { BattlerIndex } from "#enums/battler-index"; import type { MovePhaseTimingModifier } from "#enums/move-phase-timing-modifier"; export class DynamicQueueManager { private dynamicPhaseMap: Map>; @@ -43,4 +44,8 @@ export class DynamicQueueManager { const movePhaseQueue: MovePhasePriorityQueue = this.dynamicPhaseMap.get("MovePhase") as MovePhasePriorityQueue; movePhaseQueue.setTimingModifier(condition, modifier); } + + public setMoveOrder(order: BattlerIndex[]) { + (this.dynamicPhaseMap.get("MovePhase") as MovePhasePriorityQueue).setMoveOrder(order); + } } diff --git a/src/queues/move-phase-priority-queue.ts b/src/queues/move-phase-priority-queue.ts index b751b4bb608..cbd70d864c7 100644 --- a/src/queues/move-phase-priority-queue.ts +++ b/src/queues/move-phase-priority-queue.ts @@ -2,6 +2,7 @@ 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 { BattlerIndex } from "#enums/battler-index"; import type { MovePhaseTimingModifier } from "#enums/move-phase-timing-modifier"; export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue { @@ -17,6 +18,10 @@ export class MovePhasePriorityQueue extends PokemonPhasePriorityQueue } } + public setMoveOrder(order: BattlerIndex[]) { + this.setOrder = order; + } + private sortPostSpeed(): void { this.queue.sort((a: MovePhase, b: MovePhase) => { const priority = [a, b].map(movePhase => { diff --git a/src/queues/pokemon-phase-priority-queue.ts b/src/queues/pokemon-phase-priority-queue.ts index cabba068001..4dab3ffa6c3 100644 --- a/src/queues/pokemon-phase-priority-queue.ts +++ b/src/queues/pokemon-phase-priority-queue.ts @@ -2,9 +2,19 @@ import type { PartyMemberPokemonPhase } from "#app/phases/party-member-pokemon-p import type { PokemonPhase } from "#app/phases/pokemon-phase"; import { PhasePriorityQueue } from "#app/queues/phase-priority-queue"; import { sortInSpeedOrder } from "#app/utils/speed-order"; +import type { BattlerIndex } from "#enums/battler-index"; export class PokemonPhasePriorityQueue extends PhasePriorityQueue { + protected setOrder: BattlerIndex[] | undefined; public override reorder(): void { - this.queue = sortInSpeedOrder(this.queue); + if (this.setOrder) { + this.queue.sort( + (a, b) => + this.setOrder!.indexOf(a.getPokemon().getBattlerIndex()) - + this.setOrder!.indexOf(b.getPokemon().getBattlerIndex()), + ); + } else { + this.queue = sortInSpeedOrder(this.queue); + } } } diff --git a/test/testUtils/gameManager.ts b/test/testUtils/gameManager.ts index 5d3ed3b6c8c..b1822a95856 100644 --- a/test/testUtils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -531,7 +531,7 @@ export default class GameManager { async setTurnOrder(order: BattlerIndex[]): Promise { await this.phaseInterceptor.to(TurnStartPhase, false); - vi.spyOn(this.scene.phaseManager.getCurrentPhase() as TurnStartPhase, "getSpeedOrder").mockReturnValue(order); + this.scene.phaseManager.dynamicQueueManager.setMoveOrder(order); } /**