fix(animation): restore retail transition sign gates

Match the v11.4186 CSequence transition assembly and ACE cross-reference, including direction-specific pose gates and the strict physics epsilon boundary. Add conformance tests and correct the stale research interpretation.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-19 21:44:12 +02:00
parent c5ab99081c
commit 31a0889f08
4 changed files with 155 additions and 42 deletions

View file

@ -1140,6 +1140,16 @@ still moves the frame even with nothing animating.
## 23. `CSequence::advance_to_next_animation` (line 301622, addr `0x005252b0`)
> **2026-07-19 assembly correction:** the cleaned pseudocode below lost four
> branch predicates. Matching v11.4186 assembly and ACE agree: elapsed ≥ 0
> subtracts the outgoing pose only for negative framerate and combines the
> incoming pose only for positive framerate; elapsed < 0 subtracts only for
> non-negative outgoing framerate and combines only for negative incoming
> framerate. The nested physics gate is strict
> `abs(framerate) > F_EPSILON`. Use
> `r1-ace-sequence.md:70-86` and the production `CSequence` conformance tests,
> not the unconditional-pose cleanup later in this section.
**Signature:** `advance_to_next_animation(CSequence const* this, double arg2,
AnimSequenceNode const** arg3, double* arg4, Frame* arg5)` — `arg2` is
the signed elapsed/rate value carried over from `update_internal`