diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 1fe1a05..de74c5e 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -23,6 +23,7 @@ Promote to a prose `structures/โ€ฆmd` file when a format needs behavioural notes | Capital-ship part placement | ๐ŸŸก | `sylpheed-formats/src/ship.rs` (static) + [runtime capture](ship-placement-runtime-capture.md) | hull placement static-exact; external parts approximate statically. **Runtime capture** (Canary F10 โ†’ VS-constant WorldView) gives ground truth โ€” validated on `e106` destroyer; not yet baked into the viewer | | Weapon fields defaulted on disc | โœ… | [runtime struct](structures/weapon-struct-runtime.md) ยท [DATA SHEET route](weapon-datasheet-runtime.md) | **Solved.** Canary maps guest RAM into `/dev/shm`, so the parsed `Weapon`/`Shell` objects are readable live; their layout is solved against disc ground truth (zero contradictions over 100+ records). All 126 weapons, exact numbers, no story progress needed โ€” [4 393 values](captures/weapon-runtime-fields.csv) the disc does not carry. Supersedes the letter-bucket limit of the DATA SHEET route, which now serves as the independent cross-check | | Unit (craft/vessel) fields defaulted on disc | โœ…/๐ŸŸก | [runtime struct](structures/unit-struct-runtime.md) | The parsed `unit\UN_*.tbl` definition object, vtable `0x820af844`, โ‰ฅ`0x380` bytes, one per unit โ€” **discovered, not assumed** (`unit_discover.py`), and distinguished from the spawned-entity class `0x820af030` by being one-per-ID and byte-constant within a run. Across runs only pointer words move โ€” `--crosscheck` proves **no reported field offset is run-dependent** (two words, `+0x2c8`/`+0x2d0`, are stage-dependent and remain unidentified). 27 fields โœ… (21 units, 7 runs); the `Maneuver` block is **schema declaration order, 4 bytes/field, base `0x9c` with a two-slot gap after `AA_Roll_Min`** (29 anchors, 0 conflicts), which also pins 5 fields *no* disc record ever values. Angles are **radians at runtime, degrees on disc**. Unlike weapons, unit definitions are instantiated **per stage**, so coverage (21/110) grows by visiting missions โ€” but a defaulted field is **not** a global constant: `Size_Y` provably inherits `Size_X` (7 independent units, 6 distinct values), and three more sibling rules are recorded โ”, recovering 65 values in units never visited โ€” [values](captures/unit-runtime-fields.csv) | +| Arsenal develop economy | โœ…/โ” | [arsenal-develop-economy](arsenal-develop-economy.md) + [conditions](captures/arsenal-develop-conditions.csv) | The Arsenal reads `weapon.tbl` (item ids, in the 8-category display order โ€” the `No_Equipment โ€ฆ Wep_83` run is exactly **54**, the save blob's length) and `strings.tbl` (names, descriptions, and a **"Conditions to obtain"** block per item) out of `GP_HANGAR_ARSENAL.pak`. All **60** conditions are extracted: gates are stage completion, a predecessor item, or an **ace kill**; costs run 3 000โ€“350 000 P and **20 items are free** once gated. `weapon.tbl`'s first record reproduces the in-game DATA SHEET exactly (Range D / Power E / Speed โ€“ / Weight 0.3 = Light / 4000 P) โ€” later records are unreadable from the string pool alone because IDXD **dedupes repeated values**. Used to identify the save blob's index space: **0โ€“31 confirmed** by twelve concordances, tail โ” | | UI screen layout (`.rat`) | โœ…/๐ŸŸก | [ui-rat-layout](structures/ui-rat-layout.md) | One pak per UI screen; each RATC = one (context ร— language) build; every `.t32` sprite has a `.rat` **layout record** (BE u32; 1280ร—720 design space; scale/tint/X/Y, keyframes for animated elements, `opt ` link to the focused state). **The tutorial PAUSE menu and the title main menu both rebuild pixel-accurately from the disc.** `loop1.rat` (screen-level draw order) not yet decoded | | Save file (`savedata`) | โœ…/โ” | [savegame-format](structures/savegame-format.md) + [`tools/re-capture/savegame.py`](../../tools/re-capture/savegame.py) | `GDHA` container, zlib payload, chunk stream (`GDAA` / phase name / `GHAD` 122 B progress block / 16ร—20 B slot table / trailer). **Container and layout read off the title's own serializer `0x822C00E8` and verified by a byte-identical round-trip**; the whole save is 545 B. Payload offsets are also the live save object's offsets (`save+8` GHAD, `save+136` slots). A second save made in-game names **Points** (+24), **flight time in ms** (+4) and **clear ratio %** (+8) off the game's own Details panel; the payload is a **pure function of game state** (same state saved twice = byte-identical, only the header FILETIME and its uninitialised pointer padding move), and the 16 `SHAB` records are **not** the UI's 20 save slots. Difficulty vs stage is undecided โ€” three fields hold 2. **A third save, taken after developing exactly one Arsenal weapon** (Light Machine Gun MG I, 4000 P), moves exactly three things: `+24` Points 4101โ†’101 (which **separates it from `+28`**, that did not move), `+8` clear ratio 5โ†’6 (so the ratio counts *collection*, not only stages), and two entries of the 54-byte blob โ€” `2โ†’4` for the item bought and `0โ†’2` for the successor the game announced as newly developable, giving the blob its alphabet ๐ŸŸก *0 locked / 2 developable / 4 developed*. Which item each index is remains open | diff --git a/docs/re/arsenal-develop-economy.md b/docs/re/arsenal-develop-economy.md new file mode 100644 index 0000000..3d5a0ce --- /dev/null +++ b/docs/re/arsenal-develop-economy.md @@ -0,0 +1,150 @@ +# The Arsenal develop economy, and what the save's blob indexes + +**2026-08-11.** The save file's 54-byte blob was shown to be per-item development +state by [a runtime differential](structures/savegame-format.md#the-develop-differential-one-weapon-three-fields) โ€” +one weapon bought, two entries moved, `2 โ†’ 4` for the item and `0 โ†’ 2` for the +successor. That named the *values*. This note names the *index space*, and in +passing recovers the whole develop economy from the disc. + +## Where the Arsenal gets its data + +`dat/GP_HANGAR_ARSENAL.pak` carries one screen-config record per language whose +fields point at the rest: + +``` +PATH = dat\GP_HANGAR_ARSENAL.pak+eng\ +WEAPON = weapon.tbl STRINGS = strings.tbl +WEAPON_CATEGORIES = 8 Detail_Window_Known / Detail_Window_Unknown +ConditionToDevelop = 757,228 WeaponDesc = 734,502 Range = 891,73 โ€ฆ +``` + +`WEAPON_CATEGORIES = 8` is the eight tabs the screen cycles with LB/RB (GUN, +BEAM, LASER, MULTIPURPOSE MISSILE, ANTI-SHIP MISSILE, BOMB/ROCKET, CANNON, +SPECIAL). The `โ€ฆ= x,y` fields are screen positions for that screen's labels โ€” +`ConditionToDevelop` is *where the conditions text is drawn*, not a condition. + +### `eng\weapon.tbl` โ€” the item table (IDXD, schema `0x03c244b5`, 66 records) + +Its string pool opens with a stage list, then the literal key `WEAPONS` +followed by the item ids **in table order**: + +``` +No_Equipment, Machiene_Cannon_MG1, Machiene_Cannon_MG2H, Machiene_Cannon_MG3, +Machiene_Cannon_MG5H, Broad_Sword_SG1, Swing_Sword_SG2H, Twin_Sword_SG3II, +Frail_GP37, Stiletto_BG1, Dagger_BG2, Rapier_BG4H, Pilum_BP, โ€ฆ , Wep_83, +Wep_84, Wep_85, NullWeapon_Arm1, NullWeapon_Arm2, NullWeapon_Arm3 +``` + +The ids are grouped by the eight categories in the same order the screen shows +them, which is why `No_Equipment โ€ฆ Wep_83` is exactly **54** entries โ€” the blob's +length. + +Each item then has a record: `Size, Weight, Range, Power, Speed, Stage, +MissionObjective, Dependency, Points`. For the **first** record all of it reads +straight out, and it matches the running game exactly: + +| field | disc | in-game DATA SHEET for Light Machine Gun MG I | +|---|---|---| +| Range | `D` | `Range Class D` | +| Power | `E` | `Damage Class E` | +| Speed | `-` | `Speed Class โ€“` | +| Weight | `0.3` | `Weight Class Light` | +| Points | `4000` | `4000 P` on the develop row | + +**Caveat, and it is a real one:** IDXD string pools store each distinct string +*once*, so from the second record onward every value that repeats an earlier +string is absent from the token stream. Record 2 (MG2H) shows only its unique +values โ€” `0.4` and `3000` โ€” and record 6 shows no number at all because its cost +had already been seen. So `weapon.tbl`'s per-item fields cannot be read from the +pool alone; they need the binary node/index region, which is still undecoded +(see the module docs in `idxd.rs`). The prose table below is the practical +substitute. + +### `eng\strings.tbl` โ€” the economy in prose (IXUD, UTF-16BE) + +The same pak's string table holds, per item: the internal id, the display name, +the description, and a **"Conditions to obtain โ€ฆ"** block that spells out the +gate and the price: + +> Conditions to obtain Light Swivel Machine Gun MG2H โ€” Completed development of +> the Light Machine Gun MG1 โ€” Must spend 3000 points to develop + +All 60 of them are extracted to +[`captures/arsenal-develop-conditions.csv`](captures/arsenal-develop-conditions.csv) +with the stage gate, the cost and the prerequisite split out. The shape of the +economy: + +- gates are **stage completion** (`Complete Stage 1 โ€ฆ 15`), **a predecessor + item** (`Completed development of the โ€ฆ`), or **an ace kill** (`Shoot down the + ace pilot in Stage 11/13/14`); +- costs run 3 000 โ†’ 350 000 points, and **twenty items have no cost at all** โ€” + they are granted the moment their gate opens (`Tomahawk Alpha Rail Gun โ€” + Complete Stage 1`), which is why they read as `Developed` in a list the player + never spent points in; +- two items are anomalies worth flagging: `Adhesive Mine B2A` says "Must spend + points to develop" with **no number**, and ten late entries (`Ballista GSH`, + `Designator LH`, `Smoke Marker Launcher`, `Bumble UV`, `Ballista 24 Rocket + Launcher`, `Thrush 220AM`, `Divider L3GP`, `Mace GP25H`, `Thor Gun System`, + `Spitfire BX`) have a conditions *header* and no conditions โ€” โ” cut content or + non-player weapons. + +## What the blob indexes: the first 32 entries, confirmed + +Predicting the save state from the conditions and comparing against the actual +blob is a strong test, because it is made **before** looking at the blob. At the +captured state (Stage 1 complete, Stage 02 at standby, 4101 P) the conditions say +exactly six items are developable โ€” Light Machine Gun MG1, Broad Sword SG1, +Dagger BG2, Pilum BP, Hound SMH, Dart 23 Rocket โ€” and the blob's **six** `2`s sit +at WEAPONS-order indices **1, 5, 10, 12, 27, 31**, which are those six items, in +order. Nothing had to be fitted. + +| blob | value | item (WEAPONS order) | confirmed by | +|---|---|---|---| +| 0 | 4 | `No_Equipment` | always available | +| 1 | 2โ†’4 | `Machiene_Cannon_MG1` | the differential: bought for 4000 P | +| 2 | 0โ†’2 | `Machiene_Cannon_MG2H` | the differential: announced as newly developable | +| 5 | 2 | `Broad_Sword_SG1` | `BROAD SWORD SG1 5000P`, **below the fold** in the GUN list | +| 9 | 4 | `Stiletto_BG1` | `Developed`; "Initially Mounted"; mounted as NOSE WEAPON | +| 10 | 2 | `Dagger_BG2` | `DAGGER BG2 5000P` | +| 12 | 2 | `Pilum_BP` | `PILUM BP 6000P` | +| 21 | 4 | `Falcon_9AM` | `Developed`; "Initially Mounted"; mounted as MAIN WEAPON 1 | +| 22 | 4 | `Buzzard_10AM` | `Developed`; free at Stage 1 | +| 26 | 4 | `Terrier_SMH` | `Developed`; free at Stage 1 | +| 27 | 2 | `Hound_SMH` | `HOUND SMH 10000P` | +| 31 | 2 | `Dirt_23_Rocket` | `DART 23 ROCKET 3500P` ("Dart" is the localised "Dirt") | + +Twelve concordances, no contradiction, over indices 0โ€“31. + +## What the blob does **not** index: the tail is unexplained + +Past index 31 the same alignment fails, and it fails against the screen, not +against a theory: + +- `Tomahawk_a_Rail_Gun` is WEAPONS index **38** and the CANNON list shows it + `Developed` (it is free once Stage 1 is complete) โ€” but **blob[38] = 0**. +- The blob's remaining `4`s are at **33, 39, 45, 46, 47**. In WEAPONS order those + are `EMP_Mine_B8E`, `Sling_75KG`, `Shield_Doubler`, `Booster`, + `FireControlSystem` โ€” and **every one of them is shown as not developed**: + BOMB/ROCKET lists only `DART 23 ROCKET 3500P`, CANNON only the Tomahawk, and + **the SPECIAL tab is entirely empty** (all rows dashed). Their conditions agree + โ€” Shield Doubler needs Stage 12, Booster an ace kill in Stage 11, FCS Stage 6. + +So five `4`s in the tail correspond to nothing the Arsenal reports as owned, and +one genuinely-owned item reads `0`. A single `+1` shift does not repair it +either: `blob[39] = 4` would put the Tomahawk right, but then `blob[33] = 4` +lands on `Arrow_27_Rocket` (Stage 2 + 5000 P, unreachable here) and 45/46/47 +still land on locked SPECIAL items. + +**Status: โ” NEEDS-HUMAN / needs the next differential.** The value alphabet and +the first 32 indices are settled; the tail is not, and should not be written into +the reimplementation as if it were. The cheap way to settle it is a second +development in a **late** category (CANNON or SPECIAL) โ€” whichever index moves +names the tail directly. It needs points: the balance is 101 P, so it waits on a +mission payout. + +## Evidence + +- [`captures/arsenal-develop-conditions.csv`](captures/arsenal-develop-conditions.csv) โ€” all 60 conditions blocks. +- [`captures/arsenal-categories-all.png`](captures/arsenal-categories-all.png) โ€” the eight category tabs. +- [`captures/arsenal-gun-below-fold.png`](captures/arsenal-gun-below-fold.png) โ€” Broad Sword SG1, the entry that is not visible without scrolling. +- [`captures/arsenal-gun-list-predevelop.png`](captures/arsenal-gun-list-predevelop.png) ยท [`captures/arsenal-mg1-developed.png`](captures/arsenal-mg1-developed.png) โ€” the differential itself. diff --git a/docs/re/captures/arsenal-categories-all.png b/docs/re/captures/arsenal-categories-all.png new file mode 100644 index 0000000..d977b87 Binary files /dev/null and b/docs/re/captures/arsenal-categories-all.png differ diff --git a/docs/re/captures/arsenal-develop-conditions.csv b/docs/re/captures/arsenal-develop-conditions.csv new file mode 100644 index 0000000..fdafe8e --- /dev/null +++ b/docs/re/captures/arsenal-develop-conditions.csv @@ -0,0 +1,61 @@ +item,stage_required,points_cost,other_conditions,raw_text +Light Machine Gun MG1,1,4000,,Conditions to obtain Light Machine Gun MG1 - Complete Stage 1 - Must spend 4000 points to develop +Light Swivel Machine Gun MG2H,,3000,Completed development of the Light Machine Gun MG1,Conditions to obtain Light Swivel Machine Gun MG2H - Completed development of the Light Machine Gun MG1 - Must spend 3000 points to develop +Heavy Machine Gun MG3,6,6000,,Conditions to obtain Heavy Machine Gun MG3 - Complete Stage 6 - Must spend 6000 points to develop +Heavy Swivel Machine Gun MG5H,,10000,Completed development of the Heavy Machine Gun MG3,Conditions to obtain Heavy Swivel Machine Gun MG5H - Completed development of the Heavy Machine Gun MG3 - Must spend 10000 points to develop +Broad Sword SG1,1,5000,,Conditions to obtain Broad Sword SG1 - Complete Stage 1 - Must spend 5000 points to develop +Swing Sword SG2H,,10000,Completed development of the Twin Sword SG3II,Conditions to obtain Swing Sword SG2H - Completed development of the Twin Sword SG3II - Must spend 10000 points to develop +Twin Sword SG3II,,8000,Completed development of the Broad Sword SG1,Conditions to obtain Twin Sword SG3II - Completed development of the Broad Sword SG1 - Must spend 8000 points to develop +Flail GP37,6,,,Conditions to obtain Flail GP37 - Complete Stage 6 +Stiletto BG1,,,Initially Mounted,Conditions to obtain Stiletto BG1 - Initially Mounted +Dagger BG2,,5000,Development Possible,Conditions to obtain Dagger BG2 - Development Possible - Must spend 5000 points to develop +Rapier BG4H,,12000,Completed development of the Dagger BG2,Conditions to obtain Rapier BG4H - Completed development of the Dagger BG2 - Must spend 12000 points to develop +Pilum BP,,6000,Development Possible,Conditions to obtain Pilum BP - Development Possible - Must spend 6000 points to develop +Multi Pike BP,,30000,Completed development of the Pilum BP,Conditions to obtain Multi Pike BP - Completed development of the Pilum BP - Must spend 30000 points to develop +Spear HBP,,10000,Completed development of the Multi Pike BP,Conditions to obtain Spear HBP - Completed development of the Multi Pike BP - Must spend 10000 points to develop +Long Spear HBP,7,350000,Completed development of the Gray Head T76H,Conditions to obtain Long Spear HBP - Complete Stage 7 - Completed development of the Gray Head T76H - Must spend 350000 points to develop +Gray Head T76H,,25000,Completed development of the Spear HBP,Conditions to obtain Gray Head T76H - Completed development of the Spear HBP - Must spend 25000 points to develop +Saber LG1,14,,,Conditions to obtain Saber LG1 - Complete Stage 14 +Twin Saber LG2H,15,,,Conditions to obtain Twin Saber LG2H - Complete Stage 15 +Needle L1GP,6,10000,,Conditions to obtain Needle L1GP - Complete Stage 6 - Must spend 10000 points to develop +Fire Arrow L2GP,,20000,Completed development of the Needle L1GP,Conditions to obtain Fire Arrow L2GP - Completed development of the Needle L1GP - Must spend 20000 points to develop +Falcon 9AM,,,Initially Mounted,Conditions to obtain Falcon 9AM - Initially Mounted +Buzzard 10AM,1,,,Conditions to obtain Buzzard 10AM - Complete Stage 1 +Hawk 75AM,6,10000,Possess Buzzard 10AM,Conditions to obtain Hawk 75AM - Complete Stage 6 - Possess Buzzard 10AM - Must spend 10000 points to develop +Condor 105AM,6,,,Conditions to obtain Condor 105AM - Complete Stage 6 +Eagle 120AM,12,15000,Completed development of the Hawk 75AM,Conditions to obtain Eagle 120AM - Complete Stage 12 - Completed development of the Hawk 75AM - Must spend 15000 points to develop +Terrier SMH,1,,,Conditions to obtain Terrier SMH - Complete Stage 1 +Hound SMH,,10000,Development Possible,Conditions to obtain Hound SMH - Development Possible - Must spend 10000 points to develop +Pointer SM,,40000,Completed development of Piranha T53,Conditions to obtain Pointer SM - Completed development of Piranha T53 - Must spend 40000 points to develop +Piranha T53,,25000,Obtain White Shark T53R,Conditions to obtain Piranha T53 - Obtain White Shark T53R - Must spend 25000 points to develop +White Shark T53R,6,,,Conditions to obtain White Shark T53R - Complete Stage 6 +Dart 23 Rocket,1,3500,,Conditions to obtain Dart 23 Rocket - Complete Stage 1 - Must spend 3500 points to develop +Arrow 27 Rocket,2,5000,,Conditions to obtain Arrow 27 Rocket - Complete Stage 2 - Must spend 5000 points to develop +Adhesive Mine B2A,3,MISSING,,Conditions to obtain Adhesive Mine B2A - Complete Stage 3 - Must spend points to develop +EMP Mine B8E,6,50000,,Conditions to obtain EMP Mine B8E - Complete Stage 6 - Must spend 50000 points to develop +Laser Mine B9L,6,15000,,Conditions to obtain Laser Mine B9L - Complete Stage 6 - Must spend 15000 points to develop +Cauldron 50 Rocket,14,,,Conditions to obtain Cauldron 50 Rocket - Complete Stage 14 +Cluster Mine B10,6,5000,,Conditions to obtain Cluster Mine B10 - Complete Stage 6 - Must spend 5000 points to develop +Maelstrom Bomb,6,200000,,Conditions to obtain Maelstrom Bomb - Complete Stage 6 - Must spend 200000 points to develop +Tomahawk Alpha Rail Gun,1,,,Conditions to obtain Tomahawk Alpha Rail Gun - Complete Stage 1 +Sling 75KG,2,5000,,Conditions to obtain Sling 75KG - Complete Stage 2 - Must spend 5000 points to develop +Glaive 120mm Cannon,6,,,Conditions to obtain Glaive 120mm Cannon - Complete Stage 6 +Arbalest 155KG,6,25000,,Conditions to obtain Arbalest 155KG - Complete Stage 6 - Must spend 25000 points to develop +Monoceros Long Cannon,,,Shoot down the ace pilot in Stage 14,Conditions to obtain Monoceros Long Cannon - Shoot down the ace pilot in Stage 14 +Grav Cannon XGS,12,60000,,Conditions to obtain Grav Cannon XGS - Complete Stage 12 - Must spend 60000 points to develop +Ballista GSH,,,,Conditions to obtain Ballista GSH +Designator LH,,,,Conditions to obtain Designator LH +Smoke Marker Launcher,,,,Conditions to obtain Smoke Marker Launcher +Bumble UV,,,,Conditions to obtain Bumble UV +Jamming System,3,15000,,Conditions to obtain Jamming System - Complete Stage 3 - Must spend 15000 points to develop +Shield Doubler,12,50000,,Conditions to obtain Shield Doubler - Complete Stage 12 - Must spend 50000 points to develop +Booster,,,Shoot down the ace pilot in Stage 11,Conditions to obtain Booster - Shoot down the ace pilot in Stage 11 +Fire Control System,6,15000,,Conditions to obtain Fire Control System - Complete Stage 6 - Must spend 15000 points to develop +Regenerator,12,100000,,Conditions to obtain Regenerator - Complete Stage 12 - Must spend 100000 points to develop +Cartridge Holder,,,Shoot down the ace pilot in Stage 13,Conditions to obtain Cartridge Holder - Shoot down the ace pilot in Stage 13 +Ballista 24 Rocket Launcher,,,,Conditions to obtain Ballista 24 Rocket Launcher +Thrush 220AM,,,,Conditions to obtain Thrush 220AM +Divider L3GP,,,,Conditions to obtain Divider L3GP +Mace GP25H,,,,Conditions to obtain Mace GP25H +Thor Gun System,,,,Conditions to obtain Thor Gun System +Spitfire BX,,,,Conditions to obtain Spitfire BX diff --git a/docs/re/captures/arsenal-gun-below-fold.png b/docs/re/captures/arsenal-gun-below-fold.png new file mode 100644 index 0000000..c07cd7d Binary files /dev/null and b/docs/re/captures/arsenal-gun-below-fold.png differ diff --git a/docs/re/structures/savegame-format.md b/docs/re/structures/savegame-format.md index 856b723..880856b 100644 --- a/docs/re/structures/savegame-format.md +++ b/docs/re/structures/savegame-format.md @@ -131,15 +131,16 @@ three-state progression *locked โ†’ developable โ†’ developed*, and the blob is Arsenal's development state, not a bitmask of owned weapons (a bitmask could not represent the middle state). -Two things this does **not** settle, and should not be written as if it did: +**Which item each index is** was chased separately and is **half settled** โ€” see +[the Arsenal develop economy](../arsenal-develop-economy.md). In short: the index +space is the `WEAPONS` id list in `GP_HANGAR_ARSENAL.pak :: eng\weapon.tbl`, whose +`No_Equipment โ€ฆ Wep_83` run is exactly 54 long; twelve independent concordances +confirm indices **0โ€“31** (including all six `2`s, predicted from the disc's own +"Conditions to obtain" text before the blob was looked at), while the tail from +index 33 on contradicts the screen and is left โ”. + +One more thing this does **not** settle, and should not be written as if it did: -- **Which item each index is.** The index space is 54 wide; the player-arsenal id - lists in `GP_HANGAR_ARSENAL.pak` union to 35 distinct weapon ids, so the blob is - not indexed by that list. MG I is at index **1**, not 0, even though it is the - first row of the first weapon type โ€” so index 0 is something already developed - that the GUN list does not show first. **NEEDS-HUMAN / needs another - differential**: develop a second item in a *different* category and see which - index moves. - **Whether the +1 on the clear ratio is per item.** One data point. If it is per item, the ratio is a *collection* metric and not a stage metric, which matters because it is one of the three numbers the Details panel shows and it