From bcf0d1f0cc02c71f50f27f65f6079928451f45fb Mon Sep 17 00:00:00 2001 From: ReaperOfVeriod Date: Sat, 10 Oct 2026 03:27:52 +0200 Subject: [PATCH] Decompress the gameplay extent: the level light bank now parses gameplay is a WAD stream, exactly like core_data. The extractor was writing it compressed, so the light bank framing read the WAD header's stream length as a light count: level 0's offset at +0x04 was 0xa0d and the "count" there was 698810368. The file says so in its first six bytes: 57 41 44 79 0d 0a -- "WADy". Decompressed, level 0's gameplay extent is 1,872,256 bytes, the offset at +0x04 is 0xc2b20, and the count there is 5. Five directional light sets. All 80,274 vertices of level 0 now go through LightTfrags, and the renderer's fallback line no longer appears. The frame's colour distribution goes from 295 to 737 distinct sampled colours and takes on the level's warm cast. This corrects a recorded negative result that was simply wrong. docs/roadmap.md carried "gameplay does not decode with the WAD LZ77 decoder, all 27 levels fail identically, so the input is wrong rather than the decoder", with bit order and header length also ruled out. That was true of the data being parsed and wrong about the cause: the decoder was never the problem, it was being handed a file that had not been through it. Same lesson as the origin bug, from the other direction. A recorded failure without a positive control is easy to record and easy to leave; the control here is trivial and should have been run first -- decompress and look. The renderer keeps counting and reporting how many vertices it lit, because a silent fallback to stored colours looks plausible and is wrong. Lighting magnitudes remain unverified: that needs comparison against reference frames via the PCSX2 loop, which is still to come. --- crates/gc-extract/data/gc-files.tsv | 48 ++++++++++++++--------------- crates/gc-extract/src/unpack.rs | 37 ++++++++++++++++++---- docs/roadmap.md | 26 +++++++++------- 3 files changed, 70 insertions(+), 41 deletions(-) diff --git a/crates/gc-extract/data/gc-files.tsv b/crates/gc-extract/data/gc-files.tsv index d5d4f28..76354bd 100644 --- a/crates/gc-extract/data/gc-files.tsv +++ b/crates/gc-extract/data/gc-files.tsv @@ -2492,7 +2492,7 @@ e1baca5f8178da95e7dc496305a36f984be542aa 15 hud/0780.bin 67c9e91fd44677f27d1b58b66967455a2d2bff12 9738678 level0/core_data.wad 89496a7b1cf67a2fc88ad99cc72fc46807c95dfe 31600 level0/core_index.bin 4a8f9d6608b776a86fb15420acadea4c2b749a9f 13279232 level0/data.bin -133206d28cd25c39f1b6a760e345c0f0f409b7bf 659456 level0/gameplay.bin +5e0a1887a07879299d4072aa77f3070a34c9e983 1872256 level0/gameplay.bin acef5e387c8051229eecf70a64fd6daa077b34b3 518656 level0/gs_ram.bin d7045d6c1256a9ffa241acca76e3761c34da3341 2751268 level0/overlay.bin 7ec9566aeae513fe272bc97899a4dbe15a2a74ff 1503232 level0/sound_bank.bin @@ -2500,7 +2500,7 @@ d7045d6c1256a9ffa241acca76e3761c34da3341 2751268 level0/overlay.bin 96b33cef1ac3c9bab5283ccf11bd86b0aa20ebcb 12165629 level1/core_data.wad 7cae5c7c2258f391ef72a8503183e36747214fbd 34016 level1/core_index.bin 60a9070e5668ff8f5bf560318968811c1ee38c71 15769600 level1/data.bin -a07364ccac5fb6dc3d1fb1c859fca13b205e6a1f 811008 level1/gameplay.bin +3d657ac24e2cb024810e4f546b5940c4f326955b 2006400 level1/gameplay.bin afc39fac19d1a66aba56c4509c55977229dcb3cf 569344 level1/gs_ram.bin 1318041a43acca46fb4f2348b2f4fa81bd810948 18432 level1/occlusion.bin 54c0247eb3b0a08da2c6c87c5a23fc06bbe3fa50 2763668 level1/overlay.bin @@ -2516,7 +2516,7 @@ da253d8b4dc4f8fc482880c54cd832c53bfd4aa0 20717584 level11/core_data.bin a0173c7577180d32e9bfed67464eecf3bc12c033 11414905 level11/core_data.wad 0e0d5289451a3bffa376992d0b6a288421a7a55d 36000 level11/core_index.bin 49116fede92a6846bbbb0c3951f3314cbc770f80 15378432 level11/data.bin -ff6811c08f3fe034bae54ab066e3051d4cbb39cc 1034240 level11/gameplay.bin +53a6637e3bf8d323f0709ebb6f5fcc1a454295fd 2366656 level11/gameplay.bin 472e916feae6b88e5028e48e9d2e4d1a433a8ed7 538624 level11/gs_ram.bin e91c93e8af747ce8c0802c3c96cd88acc126a5c3 51200 level11/occlusion.bin 4502a46e00bbbb3a0a59aa4d5899fd3b3ca44948 3151128 level11/overlay.bin @@ -2525,7 +2525,7 @@ d13c8eb4f2ab552e330a119bf1e14d55f9921220 20995456 level12/core_data.bin 9d8355548c0d5c911e18124e83a04f3c58d604de 11510373 level12/core_data.wad 7b3ab93650bd82117b2b8ff596f95799123ff6e8 34864 level12/core_index.bin a134bad90883ad15ff7b52d909da461a491d253b 15136768 level12/data.bin -b058a1f7858198be55a90bf70d81db1f8039e132 813056 level12/gameplay.bin +fc6f73cb737c67fa7202e33aa39ff8d333789123 2461824 level12/gameplay.bin cbccba141d2efe7b4165dd81a265532465106def 510464 level12/gs_ram.bin c47b9490cf2a0145331d2b2229234fd1e1b2e172 2843328 level12/overlay.bin 709e185927a11b846e6b1d66c2fa770cf284ea65 1568768 level12/sound_bank.bin @@ -2533,7 +2533,7 @@ c47b9490cf2a0145331d2b2229234fd1e1b2e172 2843328 level12/overlay.bin 7c4b8c7fd086de66e19bd440a5e63fea4729e0bb 12037495 level13/core_data.wad c7a99c3252427f11a202a907df605b3d43baaae0 35744 level13/core_index.bin 29c09e0877c62ba4dee1325cf00c944f9ad78ceb 15702016 level13/data.bin -ab5e7bd921f3973e3d15052838ec87676d35928a 854016 level13/gameplay.bin +1e057c6aae96baad273107ca6609e91c9a2fedbd 2378112 level13/gameplay.bin 0554fcecd5cbe57f3b90a97bd75edba4ea438752 555520 level13/gs_ram.bin 3fbaf06d37e5ffc64dd7fa3f37e3fe20d3ea8037 2833444 level13/overlay.bin 2793ed3153f9f8ace889b855dbfc53f29c94c0bc 1406976 level13/sound_bank.bin @@ -2541,7 +2541,7 @@ ab5e7bd921f3973e3d15052838ec87676d35928a 854016 level13/gameplay.bin b34bf0528e2c753ce9fd65791e89ba6ec8491358 11217244 level14/core_data.wad cc03cc08cc55f27d57bcdc6c9c435e28479a65e3 34848 level14/core_index.bin fb30c8c10944377af4a76e2804209be630dba993 14948352 level14/data.bin -95157d87f0c5e76a38daead9e07d01281b65ebf0 692224 level14/gameplay.bin +0b571e07605051a0dd58492cdedf52456f02593f 2164992 level14/gameplay.bin 0d8c49b2b405df331f859a077a6dfbb6aa922b3d 582656 level14/gs_ram.bin bdcd73fb41d07da3ce35f60a2fd48af3d8ffe96b 2874964 level14/overlay.bin 28a70e7880794f94a76e2b340373d1dc40484fee 1689600 level14/sound_bank.bin @@ -2549,7 +2549,7 @@ bdcd73fb41d07da3ce35f60a2fd48af3d8ffe96b 2874964 level14/overlay.bin 3c7f4291ff09cdfb0c1cd2e435fb4c039faf7572 8538458 level15/core_data.wad cda9e44cee8b5ac58f9abd97dfcdbbe14e76d490 21792 level15/core_index.bin 39e2c8e15375dae4c73f61a7be980dccf4a85aa9 12122112 level15/data.bin -9b13d67b1276d25937cab21344fa8a6687cc0882 491520 level15/gameplay.bin +230b984e982e786589354c6ead979fb7ec15064d 1214144 level15/gameplay.bin d1437c7d2106f6e9cdb54f66cea4f1a714dc8867 407552 level15/gs_ram.bin 76b9c880945039ece6e51762b8dd76ffc680da7c 2915968 level15/overlay.bin f89c334b887f377f341fc9232d474affa89fc544 1476608 level15/sound_bank.bin @@ -2557,7 +2557,7 @@ f89c334b887f377f341fc9232d474affa89fc544 1476608 level15/sound_bank.bin 9c9291257d21ac62dff3ac4090f9d2f9b6c5c3e8 12442996 level16/core_data.wad 5a57d24086355cb7fb2410ac9b5daff4bf2d63a5 34080 level16/core_index.bin 8e58f79a35fbe78382065bdce0f53d2cc9f1ccf1 16091136 level16/data.bin -af60ee961ab3c4508f6fc7f7e5db32d1bbe08769 595968 level16/gameplay.bin +1c2dde817d0e2c1f7eeabc1e73d5cfa664cb4472 1660800 level16/gameplay.bin 9b85cc208f66ffbbdff60d979597e1e2c47bc593 577024 level16/gs_ram.bin 2bdb86a7a4c69af80eb5f30d62ed58f337961f3f 2798992 level16/overlay.bin 84723c80beedd7e55143a424a1b2f6255a200ab0 1654784 level16/sound_bank.bin @@ -2565,7 +2565,7 @@ af60ee961ab3c4508f6fc7f7e5db32d1bbe08769 595968 level16/gameplay.bin fc90583b7560be17115f57c8ecf6fc14ec2e59d8 10922651 level17/core_data.wad 5f9496629cf8c32071c2d4a125fee1ca7b89f73e 35856 level17/core_index.bin d7669eec9eb3cf36bf4f649333ae79864c1a7043 14575616 level17/data.bin -10a5f5e2862f7364a9bbe886dadb9ebca8ab0381 796672 level17/gameplay.bin +6dce2d758ec40a96f962b52acf55ac7dcd93691e 2422528 level17/gameplay.bin 899d4e61f032af4c66419d3a286a25d1e97e5644 574464 level17/gs_ram.bin f76912e7914400cc5ceeca59f6780bc5143997c8 2803324 level17/overlay.bin 37c76a37d9e3cbbed6dfc324b0b90d3498ecb0e7 1347584 level17/sound_bank.bin @@ -2573,7 +2573,7 @@ f9240e2bd6406f206e155b09cc5c914b6574e41e 20268640 level18/core_data.bin f44add8374224a84070995ecb4b1be8cfb58aa9f 11721139 level18/core_data.wad 6ab43f9167d67246e18394eef5b732589fcaff66 33088 level18/core_index.bin d0f931677cb6589a564937c3d15c13344b923969 15501312 level18/data.bin -2adc53f721fca95dd1012994d243e0704edd034c 675840 level18/gameplay.bin +70899683fa5621fa2e4a4ef994795e404ca3b0f2 2280576 level18/gameplay.bin 7f6a823c4b47fdfb58e29237b680d03e946329db 571136 level18/gs_ram.bin e5370c97b9a2ccdb00678e57f9e18042eab6735d 2937576 level18/overlay.bin b26483cc29ecb8b6d2c71919ff7cd56b09522bc1 1492992 level18/sound_bank.bin @@ -2581,7 +2581,7 @@ b26483cc29ecb8b6d2c71919ff7cd56b09522bc1 1492992 level18/sound_bank.bin b79df8e074db7d3c75bc2b3b9c2a4de61e5dd9cd 11797811 level19/core_data.wad b0ea377a39a616dbd2b15224a9996925c7b28f4d 31536 level19/core_index.bin 3218aa99e3ea4e9f4a050a5117413261defded4e 15386624 level19/data.bin -8700a93086450328f2693b553e1df447a79fcd83 825344 level19/gameplay.bin +aa600c3214020bdbbb12c2aea1b4bf9b6f3d34da 2827200 level19/gameplay.bin d5061a551eb354ddf7952c4bfd62767c6e074c3f 497920 level19/gs_ram.bin 877ca7fb8e80d810d6c37fb993795aa10b5b1033 47104 level19/occlusion.bin 428ea51a157b35cdf831f2a6908647d8ffe6a91b 2821856 level19/overlay.bin @@ -2590,7 +2590,7 @@ d5061a551eb354ddf7952c4bfd62767c6e074c3f 497920 level19/gs_ram.bin f0eb5c033e84092748cf3457818b0d4c85da7a0a 11372886 level2/core_data.wad 73411362c1cfa8faec733705d93e953f1381ef30 33808 level2/core_index.bin 14c7c5cd788c0bebe531029bc1f8f8d570ea1771 15089664 level2/data.bin -bfc9f6bc73edfa7deb46505f187c274dcf7b863a 790528 level2/gameplay.bin +714b8df748571ed69e952a8c3ebb57d946110c0d 2158976 level2/gameplay.bin 164f775e33d9325b3e4c5ce4cbf8c515ed311fd2 513024 level2/gs_ram.bin 01c7d4c7b0ecb44a91694ffde796ff941057191a 28672 level2/occlusion.bin d7182afdf4a986c9c781a9658373281bfc37df22 2928424 level2/overlay.bin @@ -2599,7 +2599,7 @@ daf162b58756e2661f3ec891c8736a1611b4dc52 19637472 level20/core_data.bin 7e7203ac3a2dbf578546573a34fa6dce4c336d35 10449039 level20/core_data.wad b12e8599d211addc85cbe138e58157ade380a575 37360 level20/core_index.bin 640e6a62f3795bb285663364c2929f4640dacf33 14237696 level20/data.bin -7368af71bc6c070fc6422fd69a354b2f3518ed2b 833536 level20/gameplay.bin +c303773c9c4d470f01221f112473bb0c40ac2de9 2325952 level20/gameplay.bin 4c7325cfdde68fc9160ec9a2cd18da3d327dcd9a 534272 level20/gs_ram.bin 61ae37031d1df746bffb4a0bddeaee85558c894e 36864 level20/occlusion.bin a5235e8ce98aa3cfbb499ae988c419a05a0bcf55 2976888 level20/overlay.bin @@ -2608,7 +2608,7 @@ abce77e8841c0ed0fa006db81840b35ea4c75afd 1335296 level20/sound_bank.bin f10321014e7ccd61a65f294baefaf35875d6294b 8178784 level21/core_data.wad 728b90cdbb44f1b94c140d82fc03268ca54408ac 25456 level21/core_index.bin 4a3ebd058fe62df17ed4d74fe190442ff2993474 11722752 level21/data.bin -6c2b9faaef23c142a61316190852251404734c39 448512 level21/gameplay.bin +48c4f865c1992ad773c70e53a674a3f46773d7b3 1027264 level21/gameplay.bin 43a953d770cd4c5833eda5c1ecae26d7ce127be1 512256 level21/gs_ram.bin 384f39176ccbd107924eacc05d6330dda4be523f 2766612 level21/overlay.bin 8fbcb2360d5244e92bfd7c2ccd453eec44cd042b 1167360 level21/sound_bank.bin @@ -2616,7 +2616,7 @@ f10321014e7ccd61a65f294baefaf35875d6294b 8178784 level21/core_data.wad 34a2d1ac57f13cacdf46cd7d73f356951f87dd43 8186976 level22/core_data.wad edb2fd7c72d0a517613fd813429aa9036e2eb509 25152 level22/core_index.bin 3519cac29e6371802b40e3d8234ef7064abee336 11683840 level22/data.bin -a8760bb193082c5e85faeb5f799ab8585f366805 557056 level22/gameplay.bin +0a16b7a2de494ccb24ae7c28373e81a7d96d5b50 2424768 level22/gameplay.bin 9c3af51d0b3ad2b786a428a49a8ee9d30886d636 482048 level22/gs_ram.bin ae40d45a6605d5929f54e63b531919cb6ab093a9 2753704 level22/overlay.bin dba3b2b5856efbd28a8aeaa15fbee6f4fb479895 1363968 level22/sound_bank.bin @@ -2624,7 +2624,7 @@ c6b6f4087f4c9cd374a587b13777f9575953838a 12647664 level23/core_data.bin dbdca886def506bd2e6fd189c0fc4ca8d2834b97 6900832 level23/core_data.wad ed196a1541e056da4433d366c1a096143ea87ca0 23024 level23/core_index.bin 9a26194ba7d5930279a62113b1377ffeb1294269 10414080 level23/data.bin -336b3c864d1aa317003499e7d1d2d5a8cee13d58 505856 level23/gameplay.bin +06cd4cb58131a529bab16eea5ee09bf51858c08f 2157312 level23/gameplay.bin bcc4a8508f14af07ee85dd5f06dff7a910d73b6a 411136 level23/gs_ram.bin 38f7544efa497b26e494e31169fa057ce2a1b62c 2841396 level23/overlay.bin e254322f1d87d2650c21ec2c118546df1a56d9e8 1675264 level23/sound_bank.bin @@ -2646,7 +2646,7 @@ e9d246c13a7198b42a71f081d767b9e9598d01a1 1370112 level25/sound_bank.bin 6140efd9a7ebbcd81bfddf1ce0a5395ffb136d2e 5894651 level26/core_data.wad d71c13701f26cd0a4bbcb9508fb0387ba54d2d62 20704 level26/core_index.bin 4fdd7d88a5d3db63418c968f8a5f53ac370b86be 9224192 level26/data.bin -0d63ad0bc2edcd958b1c7dbec303c256ed8850e1 679936 level26/gameplay.bin +bc2c863d19fa6b2e166a49a6b9fab4377648c870 1275776 level26/gameplay.bin abb3fb6a4175cf6b41eff1d7178d59ce7affb84f 378880 level26/gs_ram.bin 518bb5c68f2d028c7c5934f878abbd3ba9d6c63f 2695436 level26/overlay.bin 8f6a74b8008a9ebc9e92853d0b339a8e725c9992 1073152 level26/sound_bank.bin @@ -2654,7 +2654,7 @@ f5d3cd4480fe6a52a019d04401a360018b279b81 21148480 level3/core_data.bin 690209848c64647194548d5e81f329d471392a8e 11383592 level3/core_data.wad 351819059a5b74d8e17f50ee87974e5c30504c3e 37568 level3/core_index.bin eb8366046b5643cc54d42d800c06bf66ccd4ef36 15157248 level3/data.bin -55cc4acecac6ba19232e6505fdc06a22b0633a45 749568 level3/gameplay.bin +2d2f535fde47866271e14c9eaf3459615029814b 2590336 level3/gameplay.bin ed1f77cd35e2572adc51f4f43de030f31b8c6ed9 675840 level3/gs_ram.bin 6fb6a7e7a64afd2f1e897f23640866f28154aa1d 2820776 level3/overlay.bin d986825dfc2bed713eb9699504536346658aaa3f 1705984 level3/sound_bank.bin @@ -2662,7 +2662,7 @@ f8c0aa3778b5bcb1995e516045b28ca6ac35502f 21107088 level4/core_data.bin ec75f324670188af581c4fceaa4cb285353f95b8 12171908 level4/core_data.wad cc4997acbdc0a6ac85d427227c04e6af6e34cd46 38080 level4/core_index.bin 67a114e12f840f4c01e3f96b48c504f93b839b03 15998976 level4/data.bin -eeee7ebf8d9980f9afc6d9c2bc2156bcca015ddd 960512 level4/gameplay.bin +39a58f337656bb31dc7557392857819e72f37444 2801088 level4/gameplay.bin 5a9a603e46e2008df02e60dce2c66ae9368d9993 522496 level4/gs_ram.bin fed269c2d706a2ba11cab965e090fd41d434055c 49152 level4/occlusion.bin 6941b8cb87a7ff14f53b2a2511bfa2d43f25ba47 3027588 level4/overlay.bin @@ -2671,7 +2671,7 @@ cb07a102a92b887d06d9314c07ce1db50e14c1fb 16715440 level5/core_data.bin e5cc08e39cb6883b391605bdcff8ba3bb8423699 11205994 level5/core_data.wad d41e06bc7086ed6876bef602420cca8d52492b1e 23536 level5/core_index.bin b241ea9d8fe18dd5bdbc8a4255ba8450a66b3c6a 14772224 level5/data.bin -c71539e0f8b0e2d666d9382475539c7a590fee04 514048 level5/gameplay.bin +51e1ecf2f6eeac2f3933a97d7349c9ec4371b805 1287488 level5/gameplay.bin ad4318ac2d601a2b1b0b9b444325082e0fc50ffc 434176 level5/gs_ram.bin c5f6b22d88d8b9eab711872337fc358bcd4051a8 2863676 level5/overlay.bin 5c2fd4470dd8c892af7686770af8cf3e2396373c 1390592 level5/sound_bank.bin @@ -2679,7 +2679,7 @@ c5f6b22d88d8b9eab711872337fc358bcd4051a8 2863676 level5/overlay.bin f2962a73cfb15ab1bef23253d863d2433b264383 12810673 level6/core_data.wad 29284ba33a151cb45df0b4d074fa7ccc9d2c0667 38080 level6/core_index.bin ccb0a4e8c51be81fbcd8ad325ab8d521bbdb7604 16777216 level6/data.bin -b9ff3b4b8fb6308aac7f5ddba1c4b1099d484dd5 929792 level6/gameplay.bin +d5874f71309fb750d37a08977653a4fe1b48672a 2617984 level6/gameplay.bin c404dfa08cab9603e5deeeed9778e4d29b755d88 604160 level6/gs_ram.bin 4d981fd750196894f96f0a24437bc76210a1663a 3086372 level6/overlay.bin 82fcce964396eb508768933d092a557bc1b05c89 1669120 level6/sound_bank.bin @@ -2687,7 +2687,7 @@ c404dfa08cab9603e5deeeed9778e4d29b755d88 604160 level6/gs_ram.bin f1cae801f1050c57258f93a7035148b3094ece03 10780010 level7/core_data.wad 79e3957d149ce3b00f713eb1757fec89d7db86c4 32736 level7/core_index.bin 9b18673cac7d7d6c3d64bebca909f3bb76ff9f39 14366720 level7/data.bin -bc8f542a56d4795c77774201903e25b01962c039 636928 level7/gameplay.bin +cc78412e868725caa8e9736653749e4b7eeacba4 2147328 level7/gameplay.bin 9671dd66d0a20ef778bbd76f0e8517792646467c 580352 level7/gs_ram.bin e02d1b0d2339d72ed5d07abfe105f41e2288f59f 16384 level7/occlusion.bin 82f26617c99f502324fb556006f8f859fda1b5f1 2733840 level7/overlay.bin @@ -2696,7 +2696,7 @@ e02d1b0d2339d72ed5d07abfe105f41e2288f59f 16384 level7/occlusion.bin 0a96094edd63dc4dd940894b007f85b21874cfeb 9700660 level8/core_data.wad 8d1b6c3a05e9b2140c056df3e538ed537b9d3a33 30624 level8/core_index.bin ee6f0ca2c15e1e0828d63547a8c19d2c45b8c0e2 13375488 level8/data.bin -ff4c7dd1924165ddc7dbb9494a166eb3e140c95c 899072 level8/gameplay.bin +43274d780e2338bbafdc0c9d591520aecbe88d3c 2504768 level8/gameplay.bin 2d0d9a2d6092d0172bf50a3716d03b3631580e8b 541184 level8/gs_ram.bin afeb717c151befdabfcf6297b0dbb1772ac13fdb 22528 level8/occlusion.bin 3dc31bcd468b9e2eae2325a64d8da466f4de228b 2865764 level8/overlay.bin @@ -2705,7 +2705,7 @@ fd39207fd776cb3ba6b8d5f6d3b10d61610c5e49 21592016 level9/core_data.bin 314f79d0a1d9ae630d67da9e3259a658c3c5642b 12578171 level9/core_data.wad ffed974844aa0bef984bc33c86ff6757e0f9c5bc 34976 level9/core_index.bin db530147f5d900e5a85294070a0a5e707c086213 16232448 level9/data.bin -3839c295b0408460f50032ff166cac27c0bdf411 864256 level9/gameplay.bin +1eccbfd96e88d1842c4c47e576d1791abca596fc 1994304 level9/gameplay.bin e117d8deddac4a05f917a218e7583859397ad4d9 568320 level9/gs_ram.bin 6756cf309ec79cc8de37a266f4c9a6d098a96ccf 2811948 level9/overlay.bin bc38b5983d8717ff4c7a35fac3cd1042ef7bd675 1697792 level9/sound_bank.bin diff --git a/crates/gc-extract/src/unpack.rs b/crates/gc-extract/src/unpack.rs index f72c54f..080035e 100644 --- a/crates/gc-extract/src/unpack.rs +++ b/crates/gc-extract/src/unpack.rs @@ -104,12 +104,37 @@ pub fn unpack(iso_path: &Path, out_dir: &Path) -> Result, String> ); continue; } - write_file( - out_dir, - &format!("{stem}/{}.bin", part.name()), - &raw[offset as usize..offset as usize + len], - &mut written, - ); + let slice = &raw[offset as usize..offset as usize + len]; + // `gameplay` is a WAD stream, like `core_data`. It was + // being written compressed, which is why the light bank + // inside it did not parse: a WAD header where a count + // was expected. + if matches!(part, gc_formats::level_wad::LevelPart::Gameplay) + && gc_formats::wad::is_wad(slice) + { + match gc_formats::wad::decompress(slice) { + Ok(decoded) => { + write_file( + out_dir, + &format!("{stem}/{}.bin", part.name()), + &decoded, + &mut written, + ); + } + Err(e) => eprintln!( + " {stem}/{}: WAD did not decompress ({e}); the compressed \ + form was kept", + part.name() + ), + } + } else { + write_file( + out_dir, + &format!("{stem}/{}.bin", part.name()), + slice, + &mut written, + ); + } parts += 1; } // The `data` extent is itself a container of byte ranges. diff --git a/docs/roadmap.md b/docs/roadmap.md index cf992dd..053a1f1 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -14,7 +14,7 @@ early, while they are still cheap to retire. - [x] Repository hygiene in place (pre-commit guard, `.gitignore`, licence record) - [x] **Phase 1 complete.** The disc pipeline runs end to end and is verified - against a committed hash table: 5,213 files, 5,762,497,559 bytes, every + against a committed hash table: 5,213 files, 5,795,847,447 bytes, every one of the 92 asset containers parsing. - [x] **Phase 2 in progress.** Level containers are parsed through their typed header, and the `data` extent is parsed as a container of byte ranges. The @@ -50,12 +50,14 @@ early, while they are still cheap to retire. - [x] **The `LightTfrags` pass** is written and unit-tested against the PS2 model: PEXT5 base colour, `select` set blending, re-normalised blended directions, and `base + A*max(dA, dA*wA) + B*max(dB, dB*wB)`. -- [ ] **The level light bank does not parse on RAC2.** The reference's framing - (u32 offset at +0x04, i32 count there) yields offset `0xa0d` and a - nonsense count on level 0. The renderer now reports how many vertices it - actually lit, which is currently 0 of 80,274 -- so the frame falls back - to the stored colours and says so rather than looking plausibly lit. - Detail in `plan/level-assets.md`. +- [x] **The level light bank parses and level 0 is fully lit.** `gameplay` is a + WAD stream; the extractor had been writing it compressed, which is why + the bank framing found garbage. All 80,274 vertices of level 0 now go + through `LightTfrags`. The renderer still counts and reports how many + vertices it lit, because a silent fallback to stored colours would look + plausible and be wrong. +- [ ] Lighting *magnitudes* are unverified: they need comparison against + reference frames, which needs the PCSX2 comparison loop. - [ ] Then the GS register set and the guard-band clip test. The disc being the exact build the reference projects pin is the single @@ -189,10 +191,12 @@ Phase 1 hands over the extents; this phase works out what each one contains. `unk_06`/`unk_0a` suppressing absent tiers, all 370,349 LOD entries across the 27 levels resolve: 29,043 LOD-01 and 341,306 LOD-0, zero failures. See `plan/level-assets.md` for the two corrections. -- [ ] `gameplay` — begins `WAD` + a per-level byte, and does *not* decode with - the WAD LZ77 decoder. All 27 levels fail identically, so the input is - wrong rather than the decoder. Ruled out: bit order, header length, the - LZ77 framing. Hypotheses queued in `plan/level-assets.md`. +- [x] `gameplay` — **it is a WAD stream**, exactly like `core_data`; the + extractor was writing it compressed. Decompressed, level 0 is 1,872,256 + bytes and holds 5 directional light sets. The earlier "does not decode + with the WAD LZ77 decoder, bit order and header length ruled out" note + was wrong about the cause: the decoder was right and the input was not + what it looked like. Corrected in `plan/level-assets.md`. - [ ] `occlusion` — 2 to 25 sectors, small enough to read whole. - [ ] `sound_bank` — `SBlk` and `DAW` signatures found in all 27. - [ ] `data` — the large one: 4.2 to 21.9 MB of geometry per level.