Files
skate-3-rust-engine/docs/RUNOUT.md
T

91 lines
5.2 KiB
Markdown

# Runout crash investigation
The Hardcore 360-flip reports at ticks 583 and 378 terminate at MotionGraph
behavior 86, `AddRunoutAttribs`. This operation was unsupported before the
difficulty-menu changes. Entering the stock runout graph now succeeds in Easy,
Normal and Hardcore. A full-frame regression then exposed the next missing
owner: `PhysicsGround -> BipedGround` has no production adapter yet.
## Reference
TU3 dump `default_82000000_011B0000.bin`, guest base 0x82000000,
SHA256 f4aa113eb541bfba03dbc108cf5ab43f58c965b20fa3b82f9c40938a0ad841c4.
Registration 0x82F89700 selects factory 0x82BC9BA8; vtable 0x82320BDC has
Begin 0x82BBA4A8, Update 0x82BBA770 and empty End 0x82B61BB8.
The initializer pair 0x82F85870/0x82F85888 identifies BipedStartAngle/BipedSpeed.
Addresses are guest addresses; subtract 0x82000000 for dump offsets.
Observed: Begin reads Skeleton0 (effective animation root Z),
SystemReckoning16 (COM velocity), SystemReckoning96 (up), and mirrors through
ISkaterAnim slot28. OffBoard331 selects alternate velocity OffBoard128.
It uses 0x8286CD88 for the projected signed angle, wraps with the strict
fraction > 0.5 condition, converts radians to degrees using word 0x42652EE1,
and captures full three-dimensional speed. Update emits the retained values
with normalized=false and sequence=-1. End performs no writes.
The game currently publishes the ordinary velocity branch; existing riding/air
states leave OffBoard331 at its native reset value. The alternate branch is
implemented and tested but requires the future BipedAir output owner.
The host numerical routines follow recovered arithmetic; no hardware-matched
360-flip replay has been recorded. A test-injected runout request verifies the
stock animation branch in all three modes, not complete on-foot physics.
## Remaining integration
User explicitly selected implementing native on-foot/runout instead of an
error-recovery screen. BipedGround requires the contact toolkit (82D811C8 /
82D81610), ground job producer, controller placement/update, skeleton mode4,
board manager, state publications, and BipedAir/remount transitions. Existing
recovered modules are being compiled and connected; enabling modules alone is
not a working BipedGround implementation.
## Contact toolkit progress
The compiled offboard modules now include the existing native ground lifecycle,
sync, reckoning, board possession, reset animation, stock settings loader and
Skeleton mode4 adapter. The retained board transform has a distinct owner, as
required by the recovered BipedGround skeleton update.
`contact_queries` reconstructs82D856C8's three support probes and44 obstacle
queries, including reverse rays and the constructor's accumulated float rounding.
All41 probe definitions are checked word-for-word against an independently
evaluated constructor using the dump above. The game adapter queries actual map
triangles through the existing acceleration tree and retains query observations.
Nonidentity mesh transforms use the complete geometry path to avoid incorrect
world/local-space culling. Authored-floor and empty-space query tests pass.
`contact_records` ports82D81F80's projection, normal fallback, record routing,
flags, distance selection and64-record surface capacity. `contact_packet` ports
82D2DDD0's reset and82D81610..82D818A0's primary/side-support consumption.
Boundary tests cover the strict side-height limits, central-contact requirement,
world-Y normal replacement, deep-support flags, lateral-normal fallback and
record capacity. These tests validate recovered host arithmetic, not bit-exact
Xenon arithmetic or a hardware replay.
`contact_promotion` now implements82D82498's promotion stage before its final
sort, retaining the original vertical-group scan and cursor advancement.
`contact_segments` implements82D83438 and candidate insertion82D82380. The
normalization threshold at830BD350 is initialized by82F826F8 from82181A88
(word358637BD); its zero value in the raw dump is not the runtime constant.
`ground_job` implements PreUpdate82D30D30's job fields, contact completion and
fallback ordering, twenty-frame teleport suppression, geometry adjustment and
retained publication flags. None of these components enables a physical state.
The full contact chain is now connected to real world queries: native record
sorting, edge intersections, normal constraints, reduction, segment candidates,
slope history and final packet publication. The reduced forward limit reaches
packet172, which the subsequent ledge query consumes. Tests cover actual floor
queries at speeds0,1,3 and6, along with step and slope boundaries.
Player Update82DB4048 calls refresh82D81610 before state PreUpdate (call at
82DB4094). Reset82D30BD0 and Exit82D30CC0 finish pending queries before clearing
the completion latch and classifier history. This ordering is retained in the
contact owner. A mesh's stable host identity replaces the original query body's
guest pointer; current map providers contain static authored geometry.
Still required: production lifecycle owners and job integration; BipedAir,
board possession and remount integration. These component tests do not enable
BipedGround or establish end-to-end runout correctness. The production runout
transition still fails and the playable binary has not been replaced.