qvm: firing pose dispatch
Browse files- docs/ASSET_PIPELINE_TODO.md +3 -0
- docs/FINDINGS.md +3 -0
- docs/PROVISIONAL_TODO.md +3 -0
- docs/RESEARCH_LEDGER.md +5 -0
- docs/REVERSE_ENGINEERING_TODO.md +3 -0
- docs/research/QVM_FIRE_POSE.md +11 -0
- docs/research/README.md +3 -0
- docs/research/qvm-fire-pose.json +0 -0
- scripts/analyze_qvm_fire_pose.py +24 -0
- scripts/test_qvm_fire_pose.py +26 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -442,3 +442,6 @@ Research progress: RE-584 [report](research/QVM_FIRE_AMMO.md); remaining native/
|
|
| 442 |
|
| 443 |
|
| 444 |
Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 442 |
|
| 443 |
|
| 444 |
Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
|
| 445 |
+
|
| 446 |
+
|
| 447 |
+
Research progress: RE-586 [report](research/QVM_FIRE_POSE.md); remaining native/content/runtime/platform scope stays open.
|
docs/FINDINGS.md
CHANGED
|
@@ -800,3 +800,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
|
|
| 800 |
|
| 801 |
|
| 802 |
**RE-585 — Firing animation priority before class dispatch:** 52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. [Evidence](research/QVM_FIRE_POSE_PRIORITY.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 800 |
|
| 801 |
|
| 802 |
**RE-585 — Firing animation priority before class dispatch:** 52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. [Evidence](research/QVM_FIRE_POSE_PRIORITY.md).
|
| 803 |
+
|
| 804 |
+
|
| 805 |
+
**RE-586 — Complete firing animation class tag and gait dispatch:** 52253..52729 completes firing pose selection: the class jump table combines running-leg membership with tag22/tag25 exceptions, after the recovered earlier priority routes. [Evidence](research/QVM_FIRE_POSE.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -758,3 +758,6 @@ Research progress: RE-584 [report](research/QVM_FIRE_AMMO.md); remaining native/
|
|
| 758 |
|
| 759 |
|
| 760 |
Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 758 |
|
| 759 |
|
| 760 |
Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
|
| 761 |
+
|
| 762 |
+
|
| 763 |
+
Research progress: RE-586 [report](research/QVM_FIRE_POSE.md); remaining native/content/runtime/platform scope stays open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -618,3 +618,8 @@ RE-580 additional regression: all19 reports from RE-560–569 and RE-571–579 r
|
|
| 618 |
## 2026-10-20 — RE-585 Firing animation priority before class dispatch (separate task commit)
|
| 619 |
|
| 620 |
52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. 148 probes independently check toggle-bit aliases, priority conflicts, movement-leg alternatives, positive timers, kind3 and supplied duration0/−1 effects with actual animation children. Full suite: 855 tests pass. Report regenerates byte-identically (980744 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 618 |
## 2026-10-20 — RE-585 Firing animation priority before class dispatch (separate task commit)
|
| 619 |
|
| 620 |
52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. 148 probes independently check toggle-bit aliases, priority conflicts, movement-leg alternatives, positive timers, kind3 and supplied duration0/−1 effects with actual animation children. Full suite: 855 tests pass. Report regenerates byte-identically (980744 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
| 621 |
+
|
| 622 |
+
|
| 623 |
+
## 2026-10-20 — RE-586 Complete firing animation class tag and gait dispatch (separate task commit)
|
| 624 |
+
|
| 625 |
+
52253..52729 completes firing pose selection: the class jump table combines running-leg membership with tag22/tag25 exceptions, after the recovered earlier priority routes. 112 independent probes check classes−1..8, tags22/25/99, masked running legs, weapon/button priority, exact helper kind/timer/duration effects and initialized jump targets. Full suite: 859 tests pass. Report regenerates byte-identically (827171 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -799,3 +799,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 799 |
|
| 800 |
|
| 801 |
- [x] RE-585 Firing animation priority before class dispatch ([report](research/QVM_FIRE_POSE_PRIORITY.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 799 |
|
| 800 |
|
| 801 |
- [x] RE-585 Firing animation priority before class dispatch ([report](research/QVM_FIRE_POSE_PRIORITY.md)).
|
| 802 |
+
|
| 803 |
+
|
| 804 |
+
- [x] RE-586 Complete firing animation class tag and gait dispatch ([report](research/QVM_FIRE_POSE.md)).
|
docs/research/QVM_FIRE_POSE.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Complete firing animation class tag and gait dispatch
|
| 2 |
+
|
| 3 |
+
RE-586. Reproduce with `python3 scripts/analyze_qvm_fire_pose.py`; check with `python3 scripts/test_qvm_fire_pose.py`. The [machine report](qvm-fire-pose.json) retains source identity and bounded fixtures.
|
| 4 |
+
|
| 5 |
+
After priority routes, class table21316..21344 selects timed requests. Classes0/5 and out-of-range request53;1/7 request52. Class2 chooses59 on base legs38/43/24 else47;3 chooses77 else79. Class4 chooses59/47 for tag22, otherwise60/73. Class6 chooses59/47 for tag25, otherwise60/48. Masked legs166 aliases38. All paths reach52730 after exactly one animation helper.
|
| 6 |
+
|
| 7 |
+
112 finite fixtures combine the complete dispatch with earlier legs25, IDs4/24 and button priority. Timed durations are supplied321 with0/−1 boundaries, and actual39552/39338 or39482 helpers run in disjoint frames. Type3 and positive prior timers demonstrate helper-specific behavior. Jump targets are initialized image evidence; tag/class overrides are explicitly synthetic.
|
| 8 |
+
|
| 9 |
+
This recovers numerical animation choice, not skeleton playback or request-to-asset identity. No shot request or counter/delay/resource change has yet occurred; the next slices publish that request and compute its accounting.
|
| 10 |
+
|
| 11 |
+
No original executable/full QVM/native collision/physics/rendering executes. Native responses and legal input domains are supplied or unverified where stated; full runtime/macOS/Linux Rust/Bevy/Solari gameplay remains open.
|
docs/research/README.md
CHANGED
|
@@ -359,3 +359,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 359 |
|
| 360 |
|
| 361 |
[RE-585: Firing animation priority before class dispatch](QVM_FIRE_POSE_PRIORITY.md). Reproduce with `python3 scripts/analyze_qvm_fire_pose_priority.py`; check with `python3 scripts/test_qvm_fire_pose_priority.py`.
|
|
|
|
|
|
|
|
|
|
|
|
| 359 |
|
| 360 |
|
| 361 |
[RE-585: Firing animation priority before class dispatch](QVM_FIRE_POSE_PRIORITY.md). Reproduce with `python3 scripts/analyze_qvm_fire_pose_priority.py`; check with `python3 scripts/test_qvm_fire_pose_priority.py`.
|
| 362 |
+
|
| 363 |
+
|
| 364 |
+
[RE-586: Complete firing animation class tag and gait dispatch](QVM_FIRE_POSE.md). Reproduce with `python3 scripts/analyze_qvm_fire_pose.py`; check with `python3 scripts/test_qvm_fire_pose.py`.
|
docs/research/qvm-fire-pose.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_fire_pose.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Complete52253..52729 firing animation priority/class/tag/legs dispatch."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source,constants
|
| 6 |
+
from qvm_firing_support import seed,segment
|
| 7 |
+
from analyze_qvm_animation_contacts import TABLE
|
| 8 |
+
from analyze_qvm_acceleration import PS,FRAME
|
| 9 |
+
from analyze_qvm import write_json
|
| 10 |
+
REQUESTS=[47,48,49,51,52,53,59,60,61,64,73,77,79]
|
| 11 |
+
|
| 12 |
+
def pose(ins,m,cmd=(0,0,0),preserve_locals=False):
|
| 13 |
+
durations={str(r):m[TABLE+m[FRAME+248]*2560+r*32+28] for r in REQUESTS};m,p=segment(ins,m,52253,[52730],cmd,preserve_locals);p['durations']=durations;return m,p
|
| 14 |
+
|
| 15 |
+
def main():
|
| 16 |
+
q,raw,h,ins=source();rows=[]
|
| 17 |
+
for klass,tag,legs in itertools.product(range(-1,9),[22,25,99],[38,41,166]):
|
| 18 |
+
m=seed(raw,h);m.update({4032+432*22:klass,4196+432*22:tag,PS+76:legs});rows.append(pose(ins,m)[1])
|
| 19 |
+
for ident,legs,buttons in itertools.product([1,4,24],[25,38,41],[0,8192]):
|
| 20 |
+
m=seed(raw,h,ident);m.update({PS+76:legs,FRAME+20:buttons});rows.append(pose(ins,m)[1])
|
| 21 |
+
for changes in [{PS+4:3},{PS+80:999},{TABLE+60*32+28:0},{TABLE+60*32+28:-1}]:
|
| 22 |
+
m=seed(raw,h);m.update({PS+76:38,4196+432*22:99});m.update(changes);rows.append(pose(ins,m)[1])
|
| 23 |
+
write_json(Path('docs/research/qvm-fire-pose.json'),{'source':q['source'],'sha256':q['sha256'],'jump_table':constants(raw,h,range(21316,21348,4)),'probes':rows,'limits':'Complete finite52253..52729 animation consumer with actual helpers. Class/tag overrides and animation durations supplied; request publication52730+ and native skeletal playback excluded.'})
|
| 24 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_fire_pose.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_fire_pose_priority import pose_choice,pose_apply
|
| 4 |
+
|
| 5 |
+
def full_pose_choice(p):
|
| 6 |
+
e,r=pose_choice(p)
|
| 7 |
+
if e:return e,r
|
| 8 |
+
run=p['initial']['legs']&~128 in [38,43,24];klass=p['config']['class'];tag=p['config']['tag']
|
| 9 |
+
if klass==2:r=59 if run else 47
|
| 10 |
+
elif klass==3:r=77 if run else 79
|
| 11 |
+
elif klass==4:r=(59 if tag==22 else 60) if run else (47 if tag==22 else 73)
|
| 12 |
+
elif klass==6:r=(59 if tag==25 else 60) if run else (47 if tag==25 else 48)
|
| 13 |
+
else:r={1:52,7:52}.get(klass,53)
|
| 14 |
+
return 39552,r
|
| 15 |
+
class FirePoseTests(unittest.TestCase):
|
| 16 |
+
@classmethod
|
| 17 |
+
def setUpClass(cls):cls.r=json.loads(Path('docs/research/qvm-fire-pose.json').read_text())
|
| 18 |
+
def test_full_exact_animation_state(self):
|
| 19 |
+
self.assertEqual(len(self.r['probes']),112)
|
| 20 |
+
for p in self.r['probes']:self.assertEqual(p['final'],pose_apply(p,full_pose_choice(p)));self.assertEqual(p['execution']['stop'],52730)
|
| 21 |
+
def test_actual_source_helper_and_request(self):
|
| 22 |
+
for p in self.r['probes']:self.assertEqual([(c['target'],c['args']['8']) for c in p['execution']['calls']],[full_pose_choice(p)])
|
| 23 |
+
def test_initialized_class_table(self):self.assertEqual(list(self.r['jump_table'].values()),[52455,52462,52469,52499,52529,52455,52627,52725])
|
| 24 |
+
def test_class_tag_and_running_leg_variants(self):
|
| 25 |
+
rows=self.r['probes'];self.assertTrue(any(p['config']['class']==4 and p['config']['tag']==99 and full_pose_choice(p)==(39552,73) for p in rows));self.assertTrue(any(p['config']['class']==6 and p['config']['tag']==25 and full_pose_choice(p)==(39552,59) for p in rows))
|
| 26 |
+
if __name__=='__main__':unittest.main()
|