mirror of
https://github.com/SK8-ENGINE/skate-3-rust-engine.git
synced 2026-10-26 19:47:44 +00:00
91 lines
5.2 KiB
Markdown
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.
|