From d5209c903acbb79009961d6f0285e882b1b8fef2 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 15 Apr 2026 00:47:53 +0200 Subject: [PATCH] Enhance runtime-project-scheduler.ts with resolved held effects and path effect resolution --- .../runtime-project-scheduler.ts | 67 ++++++++++++++----- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/src/runtime-three/runtime-project-scheduler.ts b/src/runtime-three/runtime-project-scheduler.ts index 05659193..43f34c8d 100644 --- a/src/runtime-three/runtime-project-scheduler.ts +++ b/src/runtime-three/runtime-project-scheduler.ts @@ -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)) {