At a glance

The disc scenes, monsters, attacks, casts, modules, screens The retail corpus every state's RAM, no engine run Census held: a state shows it scored: the corpus scores it Ranked worklist uncovered items, most valuable first Capture probes walk, fight, save
A new state joins the corpus, and the next census counts it. The census and the report carry monster and spell names read off the disc, so both stay under the gitignored captures/.
scripts/ci/capture-coverage.py                # build, census, report under captures/capture-coverage/
scripts/ci/capture-coverage.py --no-build     # reuse target/release-test/legaia-engine
scripts/ci/capture-coverage.py --census F     # report from an existing census JSON
scripts/ci/capture-coverage.py --summary      # the headline table only

The census itself is legaia-engine retail-compare --census <json>. Like the corpus driver, the script exits cleanly with a [skip] line when the save library or the extracted disc is missing.

What counts as covered

Two tiers per item. Held: some corpus state made on a retail disc shows it (a state that replays a patched executable never covers anything). Scored: that state also carries an image score in the corpus baseline. A held item that is not scored is a capture the corpus cannot yet seed, or one whose frame is a fade.

DimensionDenominatorA state covers an item when
Scenesevery town, field and world-map block of the scene tableits loaded scene is the block (walked: a field or world-map state stands in it)
Monstersevery populated record of the monster archivethe formation holds the id
Enemy attackseach monster's physical attack and every magic id its record carriesthat monster is acting with that attack, on screen
Player caststhe named summon-band spells of the spell tablea party seat acts with that spell queued
Cast modulesthe 64 slot-B imagesan acting cast pages the module
Menu screensevery reachable sub-screen, the title family and the map displaya menu state stands on it
Battle screensthe command flow's surfaces and the results windowa battle state stands on it
  • An action counts only while it is on screen: the action state sits in the attack chain, the magic or item flow, the summon flow or the module sequence. A prompt or the clean-up after the hit covers the monsters but no attack.
  • A boss's scripted cast names an id its record does not carry, so the census is its only witness: a seen scripted cast joins the denominator as its own item. The record-carried items are fixed by the disc.
  • Which module a cast pages follows the two loader paths of the cast module page: the summon band by id, a capture-class record by its own index.

Ranking the worklist

  • Monsters and enemy attacks by how many formation rows across all scenes hold the monster, with the scenes it is met in - the places to walk to capture it. A monster no row holds is a scripted fight.
  • Enemy magic attacks by how many monster records carry the id.
  • Cast modules by how many spells share the module.
  • Scenes towns first, then fields, then the overworlds.

The report closes with every held item and the states that hold it.

Filling the worklist

Every new state is made by playing the retail game under PCSX-Redux, pad only where possible, and every poke a probe does make is recorded with the state.

ProbeWhat it captures
autorun_battle_harvest.luaWalks from a field state until an encounter, plays rounds with Spirit so the monsters act, and saves a state whenever a monster's action is mid-way. LEGAIA_WANT names a formation by its monster ids and lets retail's own encounter roll pick it; knobs keep a low-level party alive, wound the monsters so a heal has a patient, or keep the pre-pick state for the cast-sequence oracle.
plan_walk_route.py + autorun_walk_route.luaA planned walk for scenes a random walk never reaches: the planner searches each scene's collision grid with the teleports as edges and writes a route; the probe walks it on the pad, fights what it meets, and saves a state in every scene it enters. ACT and TALK lines work cabinets, counters and the conversations a route must have.
autorun_door_hop.luaCrosses a chain of doors by holding the player on each door's walk-on tile; the door's own record runs with its story gates, so a closed door ends the run.
autorun_screen_walk.luaA list of waits, presses and saves gated on the game mode or the sub-screen word, for screens behind a conversation or a menu path, such as a shop's lists.

A harvested state is a candidate until its census row shows the seat, category and id its label claims, its retail frame shows that attacker (and the spell's name banner, for a cast), and it is backed up with its scenario block naming the source state, the probe, the vsync and any poke it inherits. The scores of that scratch run are what it adds to the corpus at the next reviewed baseline update.

See also