- r2-motiontable-decomp.md: 1,603-line verbatim extraction — full CMotionTable (GetObjectSequence all 4 class branches, get_link, is_allowed, re_modify, StopSequenceMotion, SetDefaultState, wrappers), the free functions (add/combine/subtract_motion, change_cycle_speed, same_sign), all 16 MotionTableManager members (pending_animations, add_to_queue, remove_redundant_links with the 0xb0000000/0x70000000 block masks, truncate, AnimationDone vs CheckForCompletedMotions, PerformMovement with the 0x41000003 stop sentinel), MotionState's full modifier-stack/action-FIFO cast, verbatim struct layouts + constants table. BN mistypings identified (SurfInfo lookups are style_defaults/links hashes). - r2-ace-motiontable.md: ACE cross-ref with the two-tracker headline (MotionTableManager UPSTREAM of MotionInterp — never merged) + 5 flagged ACE oddities. - r2-port-plan.md: 17 gaps (H1-H17), keep list, Q0-Q6 commit sequence, the MotionDone->R3 boundary contract. - Q0-pins.md: A1/A2 pinned to ACE's reading (three corroborations; cdb confirmation folds into the next live session), A3 outTicks decode, A4 ACE-oddity adjudications (the Action-branch double-count is an ACE bug — do not copy), A5 Bitfield check at Q2. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.5 KiB
2.5 KiB
R2-Q0 — ambiguity pins and ACE-oddity adjudications
The verbatim extraction is r2-motiontable-decomp.md (1,603 lines, line-anchored);
the port plan with the full ambiguity table is r2-port-plan.md §0. This note
records the PINNED resolutions the Q1–Q5 ports code against.
Pinned
- A1 —
get_linkbranch predicate: PINNED to ACE's reading ("EITHER speed negative → swapped-key branch"). Three independent corroborations: ACEMotionTable.cs:395-426; the working adapter's field-validatedGetLink(the reversed-key branch fixed the Ready→WalkBackward glitch); call-site arg roles. The BN "both negative" reading is the same x87-flag-noise class asis_newer's garbled setcc and the R1 hook-direction swap. cdb confirmation (bpCMotionTable::get_link, Ready→WalkBackward vs Ready→WalkForward) folds into the next live retail session — non-blocking. - A2 — Branch-2
signedSpeed: PINNED to ACE (SubstateMod < 0 && speedMod > 0 → -speedMod, the single-direction flip) pending the same cdb session (golden: a Walk(−)→Walk(+) flip). - A3 — outTicks = sum of each appended MotionData's
num_anims(+ base cycle in Branch 1/2) − 1. Theaction_headrendering in BN is the packednum_animsbyte (decomp's own note). - A4 — ACE oddities adjudicated: (1) Action-branch numAnims double-count =
ACE BUG, do not copy (retail sums outHop + actionLink [+ returnHop] only);
(2)
change_cycle_speedold≈0 silent no-op = RETAIL (port verbatim, including the gap); (3)GetLinkData0xFFFF mask = ACE-only helper, not ported; (4)StopObjectCompletelyreturn =finalStopOk ? 1 : anyModifierStopOk, port verbatim; (5)re_modifysnapshot = deep-copied MotionState used ONLY as the loop-termination bound — C# port deep-copies, pops both, terminates on snapshot empty. - A5 —
MotionData.Bitfield(bit1 = substate-gated foris_allowed, bit0 = clear-modifiers-on-entry): confirm on DatReaderWriterTypes.MotionDatawith a one-line Humanoid-table test at Q2.
Q0 cdb capture (pending, non-blocking)
One live session feeds all R2 goldens: bp GetObjectSequence / get_link /
StopSequenceMotion / add_to_queue / remove_redundant_links /
truncate_animation_list / AnimationDone / CheckForCompletedMotions with
arg+ret logging (pattern tools/cdb/l2g-observer.cdb); protocol per
r2-port-plan.md §0. Until then Q2/Q3 rest on dat fixtures + synthetic
state tables + the archived 2026-05-03 walk→run trace golden (quoted in the
old Fix B comment block).