From 2e9903d0fcf5c7a8548d681e83c536ac1988eb28 Mon Sep 17 00:00:00 2001 From: "Claude (auto-RE)" Date: Thu, 30 Jul 2026 05:38:00 +0000 Subject: [PATCH] re: the autopilot now survives, and kills Three measurements, then a pilot built on them. * Hull is position+0x154. Found by anchoring on a field the definition already had solved (HP = 1500) rather than scanning for a value that falls: an undamaged craft must contain its own definition's number. Confirmed by the trace across a death -- 30/60/90 per hit, negative at 0, GAME OVER on screen. * RT accelerates, LT brakes, and the throttle is a persistent setting (488 -> 1510 -> 174 units/s, measured as displacement per second of the craft's own position, so no speed field was needed). This overturns the earlier "RT is not the throttle", which came from assuming the control and hunting for a field. * Shield is probably position+0x430 (== definition MaxValue 400), not yet confirmed live -- nothing had damaged it. pilot.py is a state machine on damage (ENGAGE / EVADE / RETIRE) that treats turrets as keep-out zones instead of targets. It flew Stage 02 for 300 s with the hull untouched at 1500/1500 and took the first confirmed kill (WARPLANES 0001); every run the day before was dead inside 35 s. Two bugs the live run exposed and this fixes: gating the guns on the commanded direction keeps them cold whenever avoidance is steering (gate on the target instead), and an orbit-plus-brake rule made it circle one attacker for 40 s outside its own firing cone. Also: boot to in-flight is now ~100 s unattended, because wait_flight.sh waits for the HUD's own shield bar instead of a fixed 75 s sleep that lavapipe does not honour; entities2.py picks the attitude block by matching the measured flight path (taking the first orthonormal block gave a bone/camera frame); and the entity-heap scan is numpy instead of a per-word Python loop. Co-Authored-By: Claude Opus 5 (1M context) --- docs/re/INDEX.md | 2 + docs/re/autopilot-memory-driven.md | 140 +- .../autopilot-300s-undamaged-stage02.png | Bin 0 -> 1830546 bytes .../captures/autopilot-first-kill-stage02.png | Bin 0 -> 1388673 bytes docs/re/captures/ctrl-probe-stage02.csv | 1781 +++++++++++++++++ tools/re-capture/binq.py | 144 ++ tools/re-capture/ctrl_probe.py | 272 +++ tools/re-capture/ctrl_session.sh | 31 + tools/re-capture/entities2.py | 35 +- tools/re-capture/fly_session.sh | 27 + tools/re-capture/launch_mission.sh | 6 +- tools/re-capture/navigator.py | 397 ++++ tools/re-capture/own_state.py | 117 ++ tools/re-capture/pilot.py | 319 +++ tools/re-capture/wait_flight.sh | 33 + 15 files changed, 3280 insertions(+), 24 deletions(-) create mode 100644 docs/re/captures/autopilot-300s-undamaged-stage02.png create mode 100644 docs/re/captures/autopilot-first-kill-stage02.png create mode 100644 docs/re/captures/ctrl-probe-stage02.csv create mode 100644 tools/re-capture/binq.py create mode 100644 tools/re-capture/ctrl_probe.py create mode 100755 tools/re-capture/ctrl_session.sh create mode 100755 tools/re-capture/fly_session.sh create mode 100644 tools/re-capture/navigator.py create mode 100644 tools/re-capture/own_state.py create mode 100644 tools/re-capture/pilot.py create mode 100755 tools/re-capture/wait_flight.sh diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index f3aba3e..b7e3b47 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -31,6 +31,8 @@ Promote to a prose `structures/…md` file when a format needs behavioural notes |-----------|-------|------|-------| | Live guest-memory read | ✅ | [`tools/re-capture/gmem.py`](../../tools/re-capture/gmem.py) | Canary backs the guest address space with `/dev/shm/xenia_memory_*`; guest VAs map in through Xenia's fixed table. Full-RAM search ~0.2 s (sparse, `SEEK_DATA`). No debugger, no emulator patch, game keeps running | | IDXD object layout solver | ✅ | [`tools/re-capture/weapon_runtime.py`](../../tools/re-capture/weapon_runtime.py) | Scan RAM for a class's vtable → enumerate its objects → brute-force `(field, offset, encoding)` against the disc records. Accepts a binding only on **zero** contradictions. Generalizes to any IDXD-backed definition | +| Live entity state, anchored on the definition | ✅ | [`tools/re-capture/own_state.py`](../../tools/re-capture/own_state.py) · [autopilot](autopilot-memory-driven.md) | An undamaged craft holds its definition's own numbers, so a *solved definition field* locates the matching live field without a value scan: definition `HP` (1500) → **hull at `position+0x154`**, confirmed by a trace across a death (30/60/90 per hit, negative at 0). Reusable for any live counter whose maximum the definition carries | +| Input → dynamics calibration | ✅ | [`tools/re-capture/ctrl_probe.py`](../../tools/re-capture/ctrl_probe.py) · [`binq.py`](../../tools/re-capture/binq.py) | Hold each pad input in turn and measure the craft's speed as displacement/s of its own position triple — no speed field needed first. Settled the throttle: **`RT` accelerates, `LT` brakes, and the setting persists** (488 → 1510 → 174 units/s), overturning an earlier field-scan conclusion | ## Functions / code paths diff --git a/docs/re/autopilot-memory-driven.md b/docs/re/autopilot-memory-driven.md index 4b699b2..9551d65 100644 --- a/docs/re/autopilot-memory-driven.md +++ b/docs/re/autopilot-memory-driven.md @@ -1,12 +1,99 @@ # Memory-driven autopilot — build log and current state -**Status: 🟢 IT FLIES AND SHOOTS — it does not yet survive.** -Updated 2026-07-29 (second pass). The autopilot reads the live world, picks -hostile targets, pursues them and opens fire. What it cannot do is stay alive: -there is no evasion or shield management, so it dies before a mission ends. -This is the honest state, not a plan. +**Status: 🟢 IT FLIES, KILLS AND SURVIVES — it has not yet finished a mission.** +Updated 2026-07-30. `pilot.py` flew Stage 02 for **300 s with the hull untouched +at 1500/1500** and scored the first confirmed autopilot kill (`YOU KILLED +WARPLANES 0001` on the HUD, screenshots `shots/pilot1-*.png`); the scene's +hostile count fell from 134 to 111 over the run. The day before, every run was +dead inside 35 s. What is still missing is the *end* of a mission: the objective +counter (`REMAINING OB`) rises as new waves spawn, and nothing yet tracks which +targets actually close it out. -## What the loop does now, observed +## 2026-07-30 — the numbers survival needs + +Three things the loop was missing were measured this session, each by +consequence rather than by reading a field and hoping. + +### Hull is `position + 0x154` ✅ CONFIRMED + +The unit definition already had `HP` solved at `+0x054` +([unit-struct-runtime](structures/unit-struct-runtime.md)); the Delta Saber's is +**1500**. A craft that has taken no damage must therefore *contain that number*, +which turns "find the HP field" into a two-float lookup rather than a value scan +(`own_state.py`). It appears once in the entity object, at `pos+0x154`, and the +trace across a death settles it (`ctrl_probe.py` capture, `binq.py trace`): + +``` + t phase hull + 0.00 base 1500.00 <- == definition HP + 23.25 rest_A 1380.00 <- first hit, -120 + 26.68 … 27.18 B 1320 … 930 <- seven hits in 0.5 s + 31.93 X 150.00 + 35.21 Y -30.00 <- goes negative + 35.26 Y -180.00 -> GAME OVER on screen +``` + +Damage arrives in 30/60/90-point steps and the field goes *negative* at death, +so it is the raw hull counter, not a clamped display value. **1500 hull lost in +12 s** of sitting in a turret's line of fire is the whole reason every earlier +run died. + +### Shield is `position + 0x430` 🟡 PROBABLE — not yet confirmed live + +Same anchor trick: the definition's shield `MaxValue` is **400** and +`ChargeSpeed` **25**, and the entity object holds `400.0` at `+0x430`, `+0x434` +and `+0x438`, with `25.0` at `+0x448`. Which of the three is the *current* value +is unproven — the capture that spanned the death used a ±0x400 window and +cropped them out. `ctrl_probe.py` now samples ±0x800. + +### `RT` accelerates, `LT` brakes, and the throttle is a *setting* ✅ CONFIRMED + +`ctrl_probe.py` holds each input in turn and measures the craft's own speed as +displacement per second from the position triple, so no speed field is needed. +Distance flown / phase duration, one 3 s hold each, sticks neutral: + +| phase | speed (units/s) | | phase | speed (units/s) | +|---|---|---|---|---| +| base (no input) | 488 | | A | 287 | +| **RT** | **1510** | | B | 139 | +| rest after RT | 1056 | | X | 125 | +| **LT** | **174** | | Y | (dying) | +| rest after LT | 428 | | LB / LS / RS / RY / RX / dpad | no effect | + +RT triples the speed, LT cuts it to a third, and **the braked state persists**: +after the LT phase the craft sat at 125–140 units/s with the sticks and triggers +neutral for the remaining 40 s, and nothing but RT brought it back. So these are +a throttle setting, not a momentary boost — which also means a control loop must +send only the *changes*. + +This **corrects** the earlier note in this file ("`RT` is *not* the throttle, +and no button tested is"). That conclusion came from `findspeed.py`, which +assumed the control and went looking for a *field* that rose; measuring the +speed directly reverses it. + +### Two method corrections + +* **Pick the attitude block by the flight path, not by address order.** The + player object contains **20** orthonormal 3×3 blocks (identity frames, bone + or camera frames), and `pos-0x70` and `pos-0x30` hold the *same* matrix. + Taking `found[0]` wrote a config with `rot_delta = -0x764` and a nonsense + forward axis; `entities2.py self` now scores every block against the measured + direction of travel and picks the best (`cos = +1.000`, row 2, sign +1). +* **The entity-heap scan has to be numpy.** A per-word Python loop over the + 16 MB entity region costs seconds per scan, which is the whole budget of a + 10 Hz control loop; `np.isin` over a `>u4` view is milliseconds. + +### Stage 02 as an autopilot testbed (from the in-flight HUD) + +`OBJECTIVE: shoot down all invading enemy fighters while watching out for +attacks on the ACROPOLIS` · `DEFEAT: your fighter is shot down, or the ACROPOLIS +is sunk` · `HINT: you can resupply at the ACROPOLIS`. The HUD shows +**`REMAINING OB 004`** — only four objective targets — so this mission is +winnable by an autopilot that survives. It also shows separate **SHIELD** and +**ARMOR** bars (matching a 400-point shield over 1500 hull), `A/B 7,635` +afterburner, and `NOSE BM 06000` / `MAIN MPM 00300` ammo. + +## What the loop did before that, observed ``` [ 82.5] tgt=e007_ADAN_Turret d=3384 yaw= -7.3 pit=+14.6 stick=(-0.13,-0.34) fire=0 @@ -33,8 +120,8 @@ rescan reports the scene as e.g. `136 entities {'TCAF': 16, 'ADAN': 120}`. direction of travel with **cos = +1.000**. 3. **The fire button is RB** — established by consequence, not by guessing: of RB/LB/A/B/X/Y/RT/LT, pressing RB is the only one that makes the nose-ammo - counter in RAM fall (5958 → 5940). `RT` is *not* the throttle, and no button - tested is. + counter in RAM fall (5958 → 5940). (This entry also claimed `RT` is *not* the + throttle — **wrong**, see the 2026-07-30 measurement above.) 4. **Control.** PD on the aiming error with the derivative taken from the craft's own body angular velocity (from two consecutive rotation matrices), and target selection weighted by off-boresight angle @@ -113,7 +200,36 @@ statements about `0x820af030`, which is *not* the live entity — (6 Hz) and re-check orthonormality on every read — blocks found by a scan get overwritten between the scan and the read. -## The next step that unblocks the most +## After survival, the blocker is lethality (2026-07-30) + +The 300 s run took **no damage at all** and killed **one** warplane, spending +~800 rounds of nose ammo (`06000` → `05193`) to do it, while `REMAINING OB` rose +from `004` to `011` as fresh waves spawned. So attrition at this rate never +finishes the mission, and the ranking of open problems has changed: + +1. **Hit rate.** It opens fire at 2–5 km with a 9° cone and a crude lead + (`p + v·d/speed`, no projectile speed). The `Shell` records in + [weapon-struct-runtime](structures/weapon-struct-runtime.md) carry the real + projectile speed and `MaximumRange` per weapon — the lead and the firing + range should come from *those*, not from constants. +2. **Which targets count.** `REMAINING OB` is the mission's own objective + counter and it is on screen, so it is in RAM; finding it turns "shoot + whatever is nearest" into "shoot what closes the mission". Objective-marked + entities also draw an `OB` badge in the HUD, so the flag is likely a word in + the entity object. +3. **Confirming the shield word** — needs a run that actually takes damage; the + pilot is now good enough at avoiding that to make it awkward, so drive + straight at a turret on purpose with `--dry` steering disabled. +4. **Does the ACROPOLIS repair?** RETIRE mode has never triggered (the hull + never fell), so the resupply hint is still untested. + +## The next step that unblocks the most (superseded — kept for the reasoning) + +**Update 2026-07-30: this is no longer the blocker.** Entity typing via the +definition pointer already solved target selection, so the game's own target +pointer is now a convenience rather than a prerequisite. It would still be the +cheapest route to problem 2 above (objective targets), because whatever the HUD +locks on to is what the game itself considers a target. **Find the game's own target pointer instead of typing entities ourselves.** The HUD has a lock-on system (a `TARGET` marker and a target-cycle button), so @@ -143,6 +259,12 @@ with the pad and watch which pointer-shaped global changes in step. ## Files +`pilot.py` (**the survival loop**) · `ctrl_probe.py` (input → speed calibration, +plus a per-tick window of the player object) · `binq.py` (query that capture) · +`own_state.py` (definition-anchored hull/shield lookup) · `fly_session.sh` +(boot → mission → bind → fly, one task) · `wait_flight.sh` (wait for the real +HUD instead of a fixed sleep) · `navigator.py` (drift-aware steering + CPA +avoidance, reused by the pilot) · `gworld.py` (live reader + entity list) · `flight_probe.py` (scripted inputs + sampling, and the `Pad` FIFO client) · `flight_analyze.py` · `whatchanges.py` (encoding-agnostic "which words are live") · `findplayer.py` · `findself.py` · diff --git a/docs/re/captures/autopilot-300s-undamaged-stage02.png b/docs/re/captures/autopilot-300s-undamaged-stage02.png new file mode 100644 index 0000000000000000000000000000000000000000..765a896ac9642fdb78c9dee2ddbb87a007c6d9cc GIT binary patch literal 1830546 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