movie_manifest::parse now reads BASE_INFO's positional field keys (the game's own cutscene ids, stage*100 + slot) and follows each to its record, instead of scraping the string pool. The pool stores each distinct string once, so a REPEAT reference produced no token and read as "no binding". That single cause explains every wrong cell: 13 later references to VOICE_D_450..454, two to SUBTITLE_hokyu_LS_s11A.tbl, and MS01A's share of pwterop_s01a.prt. All 18 hokyu movies are bound, not five. Counts, verified independently by me against the disc before recording: 104 cutscene SLOTS binding 101 distinct MOVIES; 99 slots / 96 movies with a voice track, 99 / 96 with a subtitle, 22 / 22 with a telop. The docs' old 94 / 83 / 21 are exactly the counts of DISTINCT POOL STRINGS -- not wrong measurements, measurements of the wrong thing. Three denominators were being conflated; the new test pins all three. Two assertions in movie_manifest_disc.rs were false and are corrected: hokyu_DS_s13A binds VOICE_D_452 and resolves to eng\etc\VOICE_D_452.slb. The in-game verdict that rejected that value tested an INFERENCE from a shared demo id, on a decoder that discards 85-87% of banks in this class -- see voice-bank-leading-region.md, committed earlier today. The ~104 script ids are no longer open: they are literal positional keys, each naming its record, and all 104 resolve. The old "counts differ by three, positional pairing does not work" has a concrete cause -- three resupply movies are bound by TWO slots each. Also corrected: the naming convention has 3 subtitle exceptions (s24A/s27A borrow s11A's track) and 18 voice exceptions, not one and five. The legacy scraper is kept as a fallback for blobs with no record table, so the synthetic unit fixtures still exercise it. Artifacts: examples/movie_map_csv.rs regenerates the CSV, now slot-keyed (104 rows; the movie-keyed version silently dropped one slot of each duplicate). Disc tests green. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
6.2 KiB
6.2 KiB
| 1 | slot | movie | telop | subtitle | voicetrack |
|---|---|---|---|---|---|
| 2 | LOGO1 | logo1.wmv | |||
| 3 | LOGO2 | logo2.wmv | |||
| 4 | LOGO3 | logo3.wmv | |||
| 5 | LOGO4 | logo4.wmv | |||
| 6 | ADVERTISE_MOVIE | ADV.wmv | VOICE_ADV | ||
| 7 | STAFF_ROLL | SYLPH_HD720p_8M-CBR_2ch.wmv | pwterop_s01a.prt | SYLPH_HD720p_8M-CBR_2ch.tbl | |
| 8 | MS00A | S00A.wmv | SUBTITLE_S00A.tbl | VOICE_S00A | |
| 9 | MS01A | S01A.wmv | pwterop_s01a.prt | SUBTITLE_S01A.tbl | VOICE_S01A |
| 10 | STAGE01_PHASE01 | RT01A.wmv | pwrt01.prt | SUBTITLE_RT01A.tbl | VOICE_RT01A |
| 11 | STAGE01_PHASE02 | RT01B.wmv | SUBTITLE_RT01B.tbl | VOICE_RT01B | |
| 12 | STAGE01_PHASE_END_01 | RT01C_1.wmv | SUBTITLE_RT01C_1.tbl | VOICE_RT01C_1 | |
| 13 | STAGE01_PHASE_END_02 | RT01C_2.wmv | SUBTITLE_RT01C_2.tbl | VOICE_RT01C_2 | |
| 14 | MS02A | S02A.wmv | pwterop_s02a.prt | SUBTITLE_S02A.tbl | VOICE_S02A |
| 15 | MS02B | S02B.wmv | SUBTITLE_S02B.tbl | VOICE_S02B | |
| 16 | MS02C | S02C.wmv | SUBTITLE_S02C.tbl | VOICE_S02C | |
| 17 | STAGE02_PHASE01 | RT02A.wmv | pwrt02.prt | SUBTITLE_RT02A.tbl | VOICE_RT02A |
| 18 | STAGE02_PHASE02 | RT02B.wmv | SUBTITLE_RT02B.tbl | VOICE_RT02B | |
| 19 | STAGE02_PHASE03 | RT02C.wmv | SUBTITLE_RT02C.tbl | VOICE_RT02C | |
| 20 | STAGE02_PHASE_END_01 | RT02D_1.wmv | SUBTITLE_RT02D_1.tbl | VOICE_RT02D_1 | |
| 21 | STAGE02_PHASE_END_02 | RT02D_2.wmv | SUBTITLE_RT02D_2.tbl | VOICE_RT02D_2 | |
| 22 | S02_SUPPLY_ACROPOLIS | hokyu_LS_s02A.wmv | SUBTITLE_hokyu_LS_s02A.tbl | VOICE_D_450 | |
| 23 | S02_SUPPLY_TANKER | hokyu_LS_s02H.wmv | SUBTITLE_hokyu_LS_s02H.tbl | VOICE_D_453 | |
| 24 | MS03A | S03A.wmv | SUBTITLE_S03A.tbl | VOICE_S03A | |
| 25 | STAGE03_PHASE01 | RT03A.wmv | pwrt03.prt | SUBTITLE_RT03A.tbl | VOICE_RT03A |
| 26 | STAGE03_PHASE02 | RT03B.wmv | SUBTITLE_RT03B.tbl | VOICE_RT03B | |
| 27 | STAGE03_PHASE03 | RT03C.wmv | SUBTITLE_RT03C.tbl | VOICE_RT03C | |
| 28 | STAGE03_PHASE_END | RT03D.wmv | SUBTITLE_RT03D.tbl | VOICE_RT03D | |
| 29 | S03_SUPPLY_ACROPOLIS | hokyu_LS_s03A.wmv | SUBTITLE_hokyu_LS_s03A.tbl | VOICE_D_450 | |
| 30 | S03_SUPPLY_TANKER | hokyu_LS_s03H.wmv | SUBTITLE_hokyu_LS_s03H.tbl | VOICE_D_453 | |
| 31 | MS04A | S04A.wmv | SUBTITLE_S04A.tbl | VOICE_S04A | |
| 32 | MS04B | S04B.wmv | SUBTITLE_S04B.tbl | VOICE_S04B | |
| 33 | STAGE04_PHASE01 | RT04A.wmv | pwrt04.prt | SUBTITLE_RT04A.tbl | VOICE_RT04A |
| 34 | STAGE04_PHASE02 | RT04B.wmv | SUBTITLE_RT04B.tbl | VOICE_RT04B | |
| 35 | S04_SUPPLY_ACROPOLIS | hokyu_DS_s02A.wmv | SUBTITLE_hokyu_DS_s02A.tbl | VOICE_D_452 | |
| 36 | MS05A | S05A.wmv | SUBTITLE_S05A.tbl | VOICE_S05A | |
| 37 | STAGE05_PHASE01 | RT05A.wmv | pwrt05.prt | SUBTITLE_RT05A.tbl | VOICE_RT05A |
| 38 | STAGE05_PHASE02 | RT05B.wmv | SUBTITLE_RT05B.tbl | VOICE_RT05B | |
| 39 | STAGE05_PHASE_END | RT05C.wmv | SUBTITLE_RT05C.tbl | VOICE_RT05C | |
| 40 | S05_SUPPLY_ACROPOLIS | hokyu_LS_s02A.wmv | SUBTITLE_hokyu_LS_s02A.tbl | VOICE_D_450 | |
| 41 | MS06A | S06A.wmv | pwterop_s06a.prt | SUBTITLE_S06A.tbl | VOICE_S06A |
| 42 | MS06B | S06B.wmv | SUBTITLE_S06B.tbl | VOICE_S06B | |
| 43 | STAGE06_PHASE01 | RT06A.wmv | pwrt06.prt | SUBTITLE_RT06A.tbl | VOICE_RT06A |
| 44 | STAGE06_PHASE02 | RT06B.wmv | SUBTITLE_RT06B.tbl | VOICE_RT06B | |
| 45 | STAGE06_PHASE03 | RT06C.wmv | SUBTITLE_RT06C.tbl | VOICE_RT06C | |
| 46 | STAGE06_PHASE_END | RT06D.wmv | SUBTITLE_RT06D.tbl | VOICE_RT06D | |
| 47 | S06_SUPPLY_ACROPOLIS | hokyu_LS_s06A.wmv | SUBTITLE_hokyu_LS_s06A.tbl | VOICE_D_450 | |
| 48 | S06_SUPPLY_TANKER | hokyu_LS_s06H.wmv | SUBTITLE_hokyu_LS_s06H.tbl | VOICE_D_453 | |
| 49 | MS07A | S07A.wmv | SUBTITLE_S07A.tbl | VOICE_S07A | |
| 50 | MS07B | S07B.wmv | SUBTITLE_S07B.tbl | VOICE_S07B | |
| 51 | STAGE07_PHASE01 | RT07A.wmv | pwrt07.prt | SUBTITLE_RT07A.tbl | VOICE_RT07A |
| 52 | STAGE07_PHASE02 | RT07B.wmv | SUBTITLE_RT07B.tbl | VOICE_RT07B | |
| 53 | STAGE07_PHASE_END | RT07C.wmv | SUBTITLE_RT07C.tbl | VOICE_RT07C | |
| 54 | S07_SUPPLY_ACROPOLIS | hokyu_DS_s07A.wmv | SUBTITLE_hokyu_DS_s07A.tbl | VOICE_D_452 | |
| 55 | S07_SUPPLY_TANKER | hokyu_DS_s07H.wmv | SUBTITLE_hokyu_DS_s07H.tbl | VOICE_D_454 | |
| 56 | STAGE08_PHASE01 | RT08A.wmv | pwrt08.prt | SUBTITLE_RT08A.tbl | VOICE_RT08A |
| 57 | STAGE08_PHASE02 | RT08B.wmv | SUBTITLE_RT08B.tbl | VOICE_RT08B | |
| 58 | STAGE08_PHASE_END | RT08C.wmv | SUBTITLE_RT08C.tbl | VOICE_RT08C | |
| 59 | S08_SUPPLY_ACROPOLIS | hokyu_DS_s08A.wmv | SUBTITLE_hokyu_DS_s08A.tbl | VOICE_D_452 | |
| 60 | MS09B | S09B.wmv | SUBTITLE_S09B.tbl | VOICE_S09B | |
| 61 | STAGE09_PHASE01 | RT09A.wmv | pwrt09.prt | SUBTITLE_RT09A.tbl | VOICE_RT09A |
| 62 | STAGE09_PHASE02 | RT09B.wmv | SUBTITLE_RT09B.tbl | VOICE_RT09B | |
| 63 | STAGE09_PHASE03 | RT09C.wmv | SUBTITLE_RT09C.tbl | VOICE_RT09C | |
| 64 | STAGE09_PHASE_END | RT09D.wmv | SUBTITLE_RT09D.tbl | VOICE_RT09D | |
| 65 | S09_SUPPLY_ACROPOLIS | hokyu_LS_s09A.wmv | SUBTITLE_hokyu_LS_s09A.tbl | VOICE_D_451 | |
| 66 | S09_SUPPLY_TANKER | hokyu_LS_s09H.wmv | SUBTITLE_hokyu_LS_s09H.tbl | VOICE_D_453 | |
| 67 | MS10B | S10B.wmv | SUBTITLE_S10B.tbl | VOICE_S10B | |
| 68 | STAGE10_PHASE01 | RT10A.wmv | pwrt10.prt | SUBTITLE_RT10A.tbl | VOICE_RT10A |
| 69 | STAGE10_PHASE_END | RT10B.wmv | SUBTITLE_RT10B.tbl | VOICE_RT10B | |
| 70 | MS11A | S11A.wmv | SUBTITLE_S11A.tbl | VOICE_S11A | |
| 71 | MS11C | S11C.wmv | SUBTITLE_S11C.tbl | VOICE_S11C | |
| 72 | STAGE11_PHASE01 | RT11A.wmv | pwrt11.prt | SUBTITLE_RT11A.tbl | VOICE_RT11A |
| 73 | STAGE11_PHASE02 | RT11B.wmv | SUBTITLE_RT11B.tbl | VOICE_RT11B | |
| 74 | STAGE11_PHASE_END | RT11C.wmv | SUBTITLE_RT11C.tbl | VOICE_RT11C | |
| 75 | S11_SUPPLY_ACROPOLIS | hokyu_LS_s11A.wmv | SUBTITLE_hokyu_LS_s11A.tbl | VOICE_D_451 | |
| 76 | MS12A | S12A.wmv | SUBTITLE_S12A.tbl | VOICE_S12A | |
| 77 | MS12B | S12B.wmv | SUBTITLE_S12B.tbl | VOICE_S12B | |
| 78 | MS12C | S12C.wmv | SUBTITLE_S12C.tbl | VOICE_S12C | |
| 79 | STAGE12_PHASE01 | RT12A.wmv | pwrt12.prt | SUBTITLE_RT12A.tbl | VOICE_RT12A |
| 80 | STAGE12_PHASE_END_01 | RT12B_1.wmv | SUBTITLE_RT12B_1.tbl | VOICE_RT12B_1 | |
| 81 | STAGE12_PHASE_END_02 | RT12B_2.wmv | SUBTITLE_RT12B_2.tbl | VOICE_RT12B_2 | |
| 82 | S12_SUPPLY_ACROPOLIS | hokyu_DS_s07A.wmv | SUBTITLE_hokyu_DS_s07A.tbl | VOICE_D_452 | |
| 83 | S12_SUPPLY_TANKER | hokyu_DS_s07H.wmv | SUBTITLE_hokyu_DS_s07H.tbl | VOICE_D_454 | |
| 84 | MS13A | S13A.wmv | SUBTITLE_S13A.tbl | VOICE_S13A | |
| 85 | MS13B | S13B.wmv | SUBTITLE_S13B.tbl | VOICE_S13B | |
| 86 | STAGE13_PHASE01 | RT13A.wmv | pwrt13.prt | SUBTITLE_RT13A.tbl | VOICE_RT13A |
| 87 | STAGE13_PHASE_END_01 | RT13B_1.wmv | SUBTITLE_RT13B_1.tbl | VOICE_RT13B_1 | |
| 88 | STAGE13_PHASE_END_02 | RT13B_2.wmv | SUBTITLE_RT13B_2.tbl | VOICE_RT13B_2 | |
| 89 | S13_SUPPLY_ACROPOLIS | hokyu_DS_s13A.wmv | SUBTITLE_hokyu_DS_s13A.tbl | VOICE_D_452 | |
| 90 | MS14A | S14A.wmv | SUBTITLE_S14A.tbl | VOICE_S14A | |
| 91 | STAGE14_PHASE01 | RT14A.wmv | pwrt14.prt | SUBTITLE_RT14A.tbl | VOICE_RT14A |
| 92 | STAGE14_PHASE02 | RT14B.wmv | SUBTITLE_RT14B.tbl | VOICE_RT14B | |
| 93 | STAGE14_PHASE_END | RT14C.wmv | SUBTITLE_RT14C.tbl | VOICE_RT14C | |
| 94 | S14_SUPPLY_TANKER | hokyu_DS_s14H.wmv | SUBTITLE_hokyu_DS_s14H.tbl | VOICE_D_454 | |
| 95 | MS15A | S15A.wmv | pwterop_s15a.prt | SUBTITLE_S15A.tbl | VOICE_S15A |
| 96 | MS15B | S15B.wmv | SUBTITLE_S15B.tbl | VOICE_S15B | |
| 97 | MS15C | S15C.wmv | SUBTITLE_S15C.tbl | VOICE_S15C | |
| 98 | STAGE15_PHASE01 | RT15A.wmv | pwrt15.prt | SUBTITLE_RT15A.tbl | VOICE_RT15A |
| 99 | STAGE15_PHASE02 | RT15B.wmv | SUBTITLE_RT15B.tbl | VOICE_RT15B | |
| 100 | STAGE15_PHASE_END | RT15C.wmv | SUBTITLE_RT15C.tbl | VOICE_RT15C | |
| 101 | S15_SUPPLY_ACROPOLIS | hokyu_LS_s15A.wmv | SUBTITLE_hokyu_LS_s15A.tbl | VOICE_D_451 | |
| 102 | MS16A | S16A.wmv | pwterop_s16a.prt | SUBTITLE_S16A.tbl | VOICE_S16A |
| 103 | STAGE16_PHASE01 | RT16C.wmv | pwrt16.prt | SUBTITLE_RT16C.tbl | VOICE_RT16C |
| 104 | S24_SUPPLY_ACROPOLIS | hokyu_LS_s24A.wmv | SUBTITLE_hokyu_LS_s11A.tbl | VOICE_D_451 | |
| 105 | S27_SUPPLY_ACROPOLIS | hokyu_LS_s27A.wmv | SUBTITLE_hokyu_LS_s11A.tbl | VOICE_D_451 |