Skip to content

Harden character expression transitions - #55

Merged
S1mplector merged 1 commit into
stablefrom
agent/core-expression-timing
Jul 28, 2026
Merged

Harden character expression transitions#55
S1mplector merged 1 commit into
stablefrom
agent/core-expression-timing

Conversation

@S1mplector

Copy link
Copy Markdown
Owner

What changed

  • add independent exprDur / expressionDuration support to [move] and [character … move …]
  • carry expression timing through parsed move nodes, scenario execution, direct interop, and display-slot movement
  • preserve existing behavior with a -1 sentinel: omitted expression duration still uses the documented 180 ms default, while exprDur=0 swaps instantly
  • prevent a newly started post-move crossfade from consuming the movement frame’s entire delta
  • add parser/runtime coverage for instant and default expression swaps, quoted/unquoted move forms, deterministic save/load, and rollback during an active crossfade

Root cause and impact

Movement and expression changes previously shared only the movement command’s timing path, while the expression crossfade duration was hard-coded in state. Save/load and rollback already captured the target expression deterministically, but that contract was not protected by tests.

Authors can now tune movement and expression timing independently without changing existing scripts. Saves and rollback made during a crossfade restore a complete target expression with no renderer-specific half-state.

Validation

  • ./gradlew :core:test --no-daemon
  • focused parser, interop, save/load, and rollback test run
  • git diff --check

Closes #14
Closes #15
Closes #19

@S1mplector
S1mplector marked this pull request as ready for review July 28, 2026 10:08
@S1mplector
S1mplector merged commit 9f90a62 into stable Jul 28, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant