Enhance runtime-project-scheduler.ts with resolved held effects and path effect resolution

This commit is contained in:
2026-04-15 00:47:53 +02:00
parent 06e0b7c555
commit d5209c903a

View File

@@ -29,7 +29,8 @@ import {
import {
findHeldSequenceControlEffect,
getHeldSequenceControlEffects,
getProjectScheduleRoutineHeldSteps
getProjectScheduleRoutineHeldSteps,
getProjectScheduleRoutineResolvedHeldControlEffectsAtMinute
} from "../sequencer/project-sequence-steps";
import type { ProjectSequenceLibrary } from "../sequencer/project-sequences";
@@ -431,24 +432,42 @@ export function resolveRuntimeActorScheduleState(options: {
activeRoutine,
options.sequences
);
const presenceEffect =
findHeldSequenceControlEffect(heldSteps, "setActorPresence") ??
createSetActorPresenceControlEffect({
target: createActorControlTargetRef(options.actorId),
active: true
});
const animationEffect =
findHeldSequenceControlEffect(heldSteps, "playActorAnimation");
const pathEffect = findHeldSequenceControlEffect(
heldSteps,
"followActorPath"
);
const elapsedHours = getProjectScheduleRoutineElapsedHoursAt(
activeRoutine,
options.dayNumber,
options.timeOfDayHours
);
const resolvedHeldEffects =
elapsedHours === null
? []
: getProjectScheduleRoutineResolvedHeldControlEffectsAtMinute(
activeRoutine,
options.sequences,
elapsedHours * 60
);
const presenceEffect =
(resolvedHeldEffects.find(
(entry): entry is typeof entry & { effect: SetActorPresenceControlEffect } =>
entry.effect.type === "setActorPresence"
)?.effect ??
findHeldSequenceControlEffect(heldSteps, "setActorPresence")) ??
createSetActorPresenceControlEffect({
target: createActorControlTargetRef(options.actorId),
active: true
});
const animationEffect =
resolvedHeldEffects.find(
(entry): entry is typeof entry & { effect: PlayActorAnimationControlEffect } =>
entry.effect.type === "playActorAnimation"
)?.effect ?? findHeldSequenceControlEffect(heldSteps, "playActorAnimation");
const pathEffectEntry = resolvedHeldEffects.find(
(entry): entry is typeof entry & { effect: FollowActorPathControlEffect } =>
entry.effect.type === "followActorPath"
);
const pathEffect =
pathEffectEntry?.effect ??
findHeldSequenceControlEffect(heldSteps, "followActorPath");
return {
actorId: options.actorId,
@@ -465,7 +484,10 @@ export function resolveRuntimeActorScheduleState(options: {
? null
: resolveActorSchedulePathState({
effect: pathEffect,
elapsedHours,
elapsedHours:
pathEffectEntry === undefined
? elapsedHours
: pathEffectEntry.elapsedMinutes / 60,
path: options.pathsById?.get(pathEffect.pathId) ?? null
})
};
@@ -519,9 +541,18 @@ function resolveRuntimeScheduledControlRoutines(options: {
continue;
}
for (const effect of getHeldSequenceControlEffects(
getProjectScheduleRoutineHeldSteps(routine, options.sequences)
)) {
const elapsedHours = getProjectScheduleRoutineElapsedHoursAt(
routine,
options.dayNumber,
options.timeOfDayHours
);
const effects = getProjectScheduleRoutineResolvedHeldControlEffectsAtMinute(
routine,
options.sequences,
elapsedHours === null ? null : elapsedHours * 60
).map((entry) => cloneControlEffect(entry.effect));
for (const effect of effects) {
const resolutionKey = getControlEffectResolutionKey(effect);
if (seenResolutionKeys.has(resolutionKey)) {