re: built-in 15 takes a craft-class scalar — but "set_speed" does not survive

15 is the biggest unnamed built-in: 1360 sites across 27 of 28 stages, with
an invariant (unit, double) operand shape. Joining every call site's unit to
its craft type through stage\UnitGroup_S<NN>.tbl resolves 1360 of 1360, none
unknown, and the values stratify hard:

  capital hulls (Destroyer, Carrier, CruiserEX, Cruiser, Acropolis,
                 BattleshipEX, ASFrigate)                        0-100
  mobile craft  (Elan 500, ArrowHead 400, DeltaSaber_T 400,
                 DeltaSaber_W 600, Attacker_S 250-400,
                 Phantom 300)                                  250-600
  asteroid      (mn040_Asteroid_Big, 74 sites)                  0, only 0

Capital ships crawl, fighters run, the player's craft is fastest at 600, and
a rock never moves. That is a speed's signature.

Except turrets break it. UN_e007_ADAN_Turret carries 400 x89 / 280 x17 /
380 x4 / 250 x2 and UN_e008_ADAN_TurretPlus 450 x62 / 500 x2 -- 176 of the
1360 sites, 13%, at fighter-class values on something that does not move.

The asteroid is what makes this sharp rather than dismissible: a genuinely
immobile object gets 0 every single time, so "immobile things get junk" does
not explain the turrets.

So the operand is a craft-class-dependent scalar with speed's range and
ordering, but set_speed is not a sound reading of it. Left UNNAMED. The
handler writes [unit+196], initialised from [unit+192] at spawn; reading its
consumer is what would settle it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Sylpheed RE agent
2026-08-26 00:56:28 +00:00
parent fa20db3db8
commit dd3c27f288

View File

@@ -140,6 +140,44 @@ and spread checks but its maximum *exceeds* the table — flag indices run 0..31
against symbol tables as small as 40 — so it is excluded, and the disassembler
now declines to resolve it rather than printing an invented name.
### 🟡 Built-in 15 takes a craft-class scalar — but "speed" does not survive intact
`15` is the biggest unnamed built-in: **1360 sites across 27 of 28 stages**. Its
operand shape is invariant — `(unit, double)` — and joining every call site's
unit to its craft type through `stage\UnitGroup_S<NN>.tbl` resolves **1360 of
1360, none unknown**. The values stratify hard by class:
| class | craft (sites) | values |
|---|---|---|
| capital hulls | `e106_Destroyer` (159), `e104_Carrier` (62), `e105_CruiserEX` (53), `f105_Cruiser` (40), `f101_Acropolis` (30), `e102_BattleshipEX` (27), `e108_ASFrigate` (33) | **0100** |
| mobile craft | `e001_Elan` (73) 500, `f003_ArrowHead` (54) 400, `f001_DeltaSaber_T` (28) 400, `f002_DeltaSaber_W` (36) **600**, `e010_Attacker_S` (54) 250400, `e009_Phantom` (16) 300 | **250600** |
| asteroid | `mn040_Asteroid_Big` (74) | **0, and only 0** |
Capital ships crawl, fighters run, the player's own craft is fastest at 600, and
a rock never moves. That is a speed's signature and it is hard to explain any
other way.
#### ❌ Except that turrets break it
| craft | sites | values |
|---|---|---|
| `UN_e007_ADAN_Turret` | 112 | 400 ×89, 280 ×17, 380 ×4, 250 ×2 |
| `UN_e008_ADAN_TurretPlus` | 64 | 450 ×62, 500 ×2 |
**176 of the 1360 sites — 13 % — are turrets, and they carry fighter-class
values.** A turret does not move, so a literal hull speed cannot be what this
sets for them. Either the field means something else (a projectile speed, a
tracking rate, an FCS target-speed cap), or it means different things by class.
The asteroid is the control that makes this sharp: a genuinely immobile object
gets **0 every time**, so "immobile things get a meaningless value" does not
explain the turrets either.
So: ✅ a craft-class-dependent scalar in speed's range and with speed's ordering;
❌ not `set_speed` as a plain reading. **Left unnamed.** The handler writes
`[unit+196]`, initialised from `[unit+192]` at spawn — reading its consumer is
what would settle it.
### ✅ Four built-ins are TUTORIAL-ONLY — 85 sites, every one in S18S23
`96`, `97`, `98` and `104` were unnamed. Measured over all 28 stages, they form a