Add RunSequenceAction and related functionality

This commit is contained in:
2026-04-14 23:33:13 +02:00
parent 328018154c
commit 5cf32b88d1
3 changed files with 146 additions and 7 deletions

View File

@@ -1,4 +1,5 @@
import {
getControlEffectLabel,
cloneControlEffect,
type ControlEffect
} from "../controls/control-surface";
@@ -39,6 +40,15 @@ export interface ToggleVisibilitySequenceStep {
visible?: boolean;
}
type SequenceDefinitionLike = {
id: string;
steps: SequenceStep[];
};
type SequenceLibraryLike = {
sequences: Record<string, SequenceDefinitionLike>;
};
export type HeldSequenceStep = HeldControlSequenceStep;
export type ImpulseSequenceStep =
@@ -83,8 +93,50 @@ export function cloneSequenceSteps(steps: SequenceStep[]): SequenceStep[] {
return steps.map(cloneSequenceStep);
}
export function getSequenceStepLabel(step: SequenceStep): string {
switch (step.type) {
case "controlEffect":
return `${step.stepClass === "held" ? "Held" : "Impulse"}: ${getControlEffectLabel(step.effect)}`;
case "startDialogue":
return "Impulse: Start Dialogue";
case "teleportPlayer":
return "Impulse: Teleport Player";
case "toggleVisibility":
return "Impulse: Toggle Visibility";
}
}
export function getHeldSequenceSteps(
steps: readonly SequenceStep[]
): HeldSequenceStep[] {
return steps
.filter((step): step is HeldSequenceStep => step.stepClass === "held")
.map(cloneSequenceStep) as HeldSequenceStep[];
}
export function getImpulseSequenceSteps(
steps: readonly SequenceStep[]
): ImpulseSequenceStep[] {
return steps
.filter((step): step is ImpulseSequenceStep => step.stepClass === "impulse")
.map(cloneSequenceStep) as ImpulseSequenceStep[];
}
export function getProjectSequenceHeldSteps(
sequence: SequenceDefinitionLike
): HeldSequenceStep[] {
return getHeldSequenceSteps(sequence.steps);
}
export function getProjectSequenceImpulseSteps(
sequence: SequenceDefinitionLike
): ImpulseSequenceStep[] {
return getImpulseSequenceSteps(sequence.steps);
}
export function getInteractionLinkImpulseSteps(
link: InteractionLink
link: InteractionLink,
sequenceLibrary?: SequenceLibraryLike | null
): ImpulseSequenceStep[] {
const controlEffect = getInteractionActionControlEffect(link.action);
@@ -124,6 +176,11 @@ export function getInteractionLinkImpulseSteps(
dialogueId: link.action.dialogueId
}
];
case "runSequence": {
const sequence =
sequenceLibrary?.sequences[link.action.sequenceId] ?? null;
return sequence === null ? [] : getProjectSequenceImpulseSteps(sequence);
}
case "playAnimation":
case "stopAnimation":
case "playSound":
@@ -136,14 +193,24 @@ export function getInteractionLinkImpulseSteps(
}
export function getInteractionLinkSequenceSteps(
link: InteractionLink
link: InteractionLink,
sequenceLibrary?: SequenceLibraryLike | null
): SequenceStep[] {
return getInteractionLinkImpulseSteps(link);
return getInteractionLinkImpulseSteps(link, sequenceLibrary);
}
export function getProjectScheduleRoutineHeldSteps(
routine: ProjectScheduleRoutine
routine: ProjectScheduleRoutine,
sequenceLibrary?: SequenceLibraryLike | null
): HeldSequenceStep[] {
if (routine.sequenceId !== null) {
const sequence = sequenceLibrary?.sequences[routine.sequenceId] ?? null;
if (sequence !== null) {
return getProjectSequenceHeldSteps(sequence);
}
}
return routine.effects.map((effect) => ({
stepClass: "held" as const,
type: "controlEffect" as const,
@@ -152,9 +219,10 @@ export function getProjectScheduleRoutineHeldSteps(
}
export function getProjectScheduleRoutineSequenceSteps(
routine: ProjectScheduleRoutine
routine: ProjectScheduleRoutine,
sequenceLibrary?: SequenceLibraryLike | null
): SequenceStep[] {
return getProjectScheduleRoutineHeldSteps(routine);
return getProjectScheduleRoutineHeldSteps(routine, sequenceLibrary);
}
export function getHeldSequenceControlEffects(