|
Download docs/research/QVM_ANIMATION_CONTACTS.md from nmarshall/urt-rs: direct link, hf CLI and curl.
- Browser
- Download file 7.51 kB
-
https://huggingface.co/nmarshall/urt-rs/resolve/main/docs/research/QVM_ANIMATION_CONTACTS.md
- Command line
-
hf download hf://nmarshall/urt-rs/docs/research/QVM_ANIMATION_CONTACTS.md
-
curl -L -o QVM_ANIMATION_CONTACTS.md https://huggingface.co/nmarshall/urt-rs/resolve/main/docs/research/QVM_ANIMATION_CONTACTS.md
7.51 kB
| # Game-QVM animation helpers and contact registration | |
| RE-445–447 / F-193–195. [qvm-animation-contacts.json](qvm-animation-contacts.json) retains seven complete instruction partitions,576 animation probes,30 contact probes and ten posture bridges from the verified shipped qagame. Reproduce with `python3 scripts/analyze_qvm_animation_contacts.py`; check with `python3 scripts/test_qvm_animation_contacts.py`. | |
| These are bounded synthetic instruction evaluations, following [posture recovery](QVM_POSTURE.md) and [ground classification](QVM_GROUND.md). Original executables, complete QVM, native collision and rendering do not execute. Recovered animation children are evaluated at recorded call boundaries with separate synthetic local frames. Timed-animation table addresses are computed from the instructions, but their words are supplied fixtures: neither initialized nor live table contents, selector domains, request legality or real animation playback are established. Field names describe candidate roles and remain provisional. | |
| ## ANIM-001 — Direct setters and continuation wrappers (RE-445) | |
| The helper family reads the PS pointer through global35024032 and its movement-frame pointer. PS+76/+72 are called legs/timer below, and PS+84/+80 torso/timer. Direct helper39338 rejects PS type+4 >=3 or positive torso timer. Otherwise it writes torso as `((old & 128) XOR 128) OR request`. It does not reject an identical raw request: old25/request25 becomes153 when permitted. | |
| Direct helper39383 first rejects an identical raw leg word/request, then rejects type>=3 or positive leg timer. Otherwise it applies the same toggle/OR expression to PS+76. Old25/request25 remains25; old153/request25 can become25 through this direct setter. Requests themselves are not normalized or masked: a request containing bit128 can force that bit into the result regardless of the toggled old bit. | |
| Continuation helper39439 rejects either raw leg equality or equality after clearing bit128 from the current leg word, then rejects a positive leg timer; otherwise it calls39383(request). Torso continuation helper39482 applies the matching policy to PS+84/+80 and calls39338. These wrappers do not check type themselves; the evaluated child supplies that guard. They compare the masked old word to the raw request, rather than masking both operands. | |
| Fixtures cover signed type-1/0/3, timer-1/0/1, old words25/153 and requests25/36/153/164. Negative types and timers are synthetic guard probes, not established reachable gameplay inputs. Tests independently model the raw/masked comparisons, toggle algebra, timer/type guards and nested requests. | |
| ## ANIM-002 — Forced requests, timed torso and posture composition (RE-446) | |
| Helper39525 returns immediately for raw leg equality. Otherwise it first clears PS+72, then calls39383(request). Thus a positive prior timer does not block this forced path. Type>=3 still blocks the child's animation assignment, but the parent's timer reset survives. Raw equality skips both the reset and the child. | |
| Helper39552 always clears PS+80, calls39338(request), then assigns PS+80 from this computed word address: | |
| `35018540 + frame[+248] * 2560 + request * 32 + 28` | |
| The final duration assignment occurs even if the child rejects type>=3. Timed fixtures cover types-1/0/3, old torso26/154, timers-1/0/1, requests36/164, selectors0/2 and supplied duration words-1/0/321. This recovers request/selector strides and load ordering, not the table's allocation bounds, producers, loaded animation definitions or actual durations. No generic array-domain compatibility policy should be inferred from these samples. | |
| Ten bridges take the actual helper39525 request sequence from prior posture probes, evaluate its children and then apply the caller's timer200 store. They cover ordinary/no transition, entering, standing up, blocked stand-up, initial timer suppression, early type3 and identical/toggle-bearing current animations. For example, entry from animation0 requests36 and yields164, then timer200. Entry with raw animation36 skips helper animation/reset work, but the posture caller still assigns200. Successful stand-up requests37 with the same raw-equality/toggle policy. This removes the previously omitted animation-child effects from these selected request boundaries only: other PS/frame mutations, native collision/sqrt effects and complete movement composition remain outside the bridge. | |
| The bounded evaluator now supports standard signed32 `BXOR`; existing opcode paths are unchanged. The test covers bit128 toggles and high-bit/negative operands. Separate synthetic child frames preserve parent words; source-backed child/parent local-address checks verify isolation. | |
| ## CONTACT-001 — Touch/contact list policy (RE-447) | |
| Helper39253 receives an entity word. Entity1022 returns immediately. A count at frame+52 equal32 also returns. Otherwise a signed loop scans entries starting at frame+56, each four bytes; any matching word returns without appending. A new entity is written at `frame+56+4*count`, then count increments. | |
| Thirty fixtures cover counts0/1/2/31/32, first/last matches, fresh99, -1,1022 and1023 (some input rows coincide for empty/single lists). The append branch accepts1023 and synthetic-1; no semantic validity check occurs in this helper. This does not establish that the complete runtime submits either. A33rd canary slot remains untouched, and full-list requests leave every slot/count unchanged. The equality capacity guard is specifically `==32`, not `>=32`; invalid negative/oversized counts and pointer aliases are untested and remain open. | |
| The prior ground helper records39253(trace entity), so these instructions explain that request's candidate list effect. Native contact generation, entity callbacks and subsequent list consumers are not composed here. | |
| ## Validation and next tasks | |
| Eight tests independently verify all576 animation policies/results and nested requests, direct-setter asymmetry/masked continuation, reset-before-type ordering/raw request bits, timed address arithmetic/unconditional duration store,30 contact list/canary outcomes, ten posture request/timer compositions, XOR/local-frame behavior, source hash/complete partitions and scope. Direct posture/ground/scale reports are regenerated unchanged; the new report reproduces twice byte-identically. Full-suite and storage/link/whitespace outcomes are recorded in the ledger. | |
| RE-444 remains open for native collision/resource/semantic/full-state work. RE-448 tracks animation table allocation/loading and real duration/selector/request domains, type/timer/flag producers, frame contact count reset/list consumers/entity effects, invalid-count/alias domains, complete posture/ground/list/animation/movement composition and runtime/macOS/Linux validation before Rust/Bevy/Solari compatibility claims. Packet/entity/player/snapshot/rendering milestones remain open. | |
| Follow-up: [verified animation-table recovery](QVM_ANIMATION_TABLES.md) derives actual registration selectors, source symbol names and152 duration words from both preserved player config variants, then evaluates timed-helper consumers (RE-449–451). Native preprocessing/live table writers/playback and contact consumers remain open under RE-448/452. | |
| Follow-up: [query56639 recovery](QVM_TRAVERSAL_QUERY.md) records torso requests54/55 at acquisition/clearance branches and evaluates39338 with real timer/type guards. Actual collision/clearance/playback and full state remain open under RE-464. | |