pokerogue/src/queues/post-summon-phase-priority-queue.ts
Dean a4b27eb05e
[Bug] Use InitEncounterPhase to queue PSPs for new encounters (#6614)
* Use InitEncounterPhase to queue PSPs for new encounters

* Add doc

* Add manual PSP queues
2025-10-07 22:09:17 -05:00

44 lines
1.6 KiB
TypeScript

import { globalScene } from "#app/global-scene";
import { PostSummonActivateAbilityPhase } from "#app/phases/post-summon-activate-ability-phase";
import type { PostSummonPhase } from "#app/phases/post-summon-phase";
import { PokemonPhasePriorityQueue } from "#app/queues/pokemon-phase-priority-queue";
import { sortInSpeedOrder } from "#app/utils/speed-order";
/**
* Priority Queue for {@linkcode PostSummonPhase} and {@linkcode PostSummonActivateAbilityPhase}
*
* Orders phases first by ability priority, then by the {@linkcode Pokemon}'s effective speed
*/
export class PostSummonPhasePriorityQueue extends PokemonPhasePriorityQueue<PostSummonPhase> {
protected override reorder(): void {
this.queue = sortInSpeedOrder(this.queue, false);
this.queue.sort((phaseA, phaseB) => phaseB.getPriority() - phaseA.getPriority());
}
public override push(phase: PostSummonPhase): void {
super.push(phase);
this.queueAbilityPhase(phase);
}
/**
* Queues all necessary {@linkcode PostSummonActivateAbilityPhase}s for each pushed {@linkcode PostSummonPhase}
* @param phase - The {@linkcode PostSummonPhase} that was pushed onto the queue
*/
private queueAbilityPhase(phase: PostSummonPhase): void {
if (phase instanceof PostSummonActivateAbilityPhase) {
return;
}
const phasePokemon = phase.getPokemon();
phasePokemon.getAbilityPriorities().forEach((priority, idx) => {
const activateAbilityPhase = new PostSummonActivateAbilityPhase(
phasePokemon.getBattlerIndex(),
priority,
idx !== 0,
);
globalScene.phaseManager.unshiftPhase(activateAbilityPhase);
});
}
}