Update validation messages and logic in scene document, project scheduler, and sequencer

This commit is contained in:
2026-04-15 07:24:02 +02:00
parent 0791a1357a
commit da510ad776
3 changed files with 15 additions and 39 deletions

View File

@@ -3557,7 +3557,7 @@ function validateInteractionLink(
createDiagnostic(
"error",
"invalid-link-sequence-no-impulse-steps",
"Interaction link sequences must expose at least one impulse step.",
"Interaction link sequences must include at least one start effect.",
`${path}.action.sequenceId`
)
);
@@ -3764,11 +3764,15 @@ function validateProjectScheduler(
continue;
}
if (routine.target.kind === "actor") {
continue;
}
diagnostics.push(
createDiagnostic(
"error",
"invalid-project-schedule-routine-effects-empty",
"Project schedule routines must resolve at least one held control effect.",
"Project sequencer placements must resolve at least one timeline control effect unless they only use start effects.",
routine.sequenceId === null ? `${path}.effects` : `${path}.sequenceId`
)
);
@@ -3780,7 +3784,7 @@ function validateProjectScheduler(
createDiagnostic(
"error",
"invalid-project-schedule-non-actor-effect-count",
"Non-actor schedule routines must currently resolve exactly one held control effect.",
"Non-actor sequencer placements must currently resolve exactly one timeline control effect.",
routine.sequenceId === null ? `${path}.effects` : `${path}.sequenceId`
)
);
@@ -3832,20 +3836,6 @@ function validateProjectScheduler(
);
}
}
if (
routine.target.kind === "actor" &&
!resolvedEffects.some((effect) => effect.type === "setActorPresence")
) {
diagnostics.push(
createDiagnostic(
"error",
"invalid-project-schedule-actor-presence-missing",
"Actor schedule routines must include an actor presence effect.",
routine.sequenceId === null ? `${path}.effects` : `${path}.sequenceId`
)
);
}
}
}

View File

@@ -6,8 +6,6 @@ import {
getControlEffectResolutionKey,
type ControlEffect,
type ControlTargetRef,
createActorControlTargetRef,
createSetActorPresenceControlEffect,
getControlTargetRefKey
} from "../controls/control-surface";
import {
@@ -204,19 +202,7 @@ function normalizeProjectScheduleEffects(
}
}
if (
target.kind === "actor" &&
!normalizedEffects.some((effect) => effect.type === "setActorPresence")
) {
normalizedEffects.push(
createSetActorPresenceControlEffect({
target,
active: true
})
);
}
if (normalizedEffects.length === 0) {
if (normalizedEffects.length === 0 && target.kind !== "actor") {
throw new Error("Project schedule routines must contain at least one control effect.");
}

View File

@@ -155,21 +155,21 @@ export function cloneSequenceSteps(steps: SequenceStep[]): SequenceStep[] {
export function getSequenceEffectLabel(effect: SequenceEffect): string {
switch (effect.type) {
case "controlEffect":
return `${effect.stepClass === "held" ? "Held" : "Impulse"}: ${getControlEffectLabel(effect.effect)}`;
return getControlEffectLabel(effect.effect);
case "startDialogue":
return "Impulse: Start Dialogue";
return "Start Dialogue";
case "teleportPlayer":
return "Impulse: Teleport Player";
return "Teleport Player";
case "startSceneTransition":
return "Impulse: Change Scene";
return "Change Scene";
case "setVisibility":
switch (effect.mode) {
case "show":
return "Impulse: Show";
return "Show";
case "hide":
return "Impulse: Hide";
return "Hide";
case "toggle":
return "Impulse: Toggle Visibility";
return "Toggle Visibility";
}
}
}