Fix read_resource returning empty bytes for uncompressed resources#4
Open
Wawax007 wants to merge 1 commit into
Open
Fix read_resource returning empty bytes for uncompressed resources#4Wawax007 wants to merge 1 commit into
Wawax007 wants to merge 1 commit into
Conversation
When sizeField's low 30 bits are 0 the resource is stored uncompressed (dsz bytes on disk, still XOR-scrambled when bit31 is set), but read_resource passed comp=0 to f.read() and returned 0 bytes. TEXT/TEXD resources are stored this way in both retail chunks.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
rpkg.read_resource()returns empty bytes (b"") for any resource stored uncompressed in the chunks. When the low 30 bits of table1's sizeField are 0, the resource is stored uncompressed on disk (dszbytes from table2, possibly still XOR-scrambled when bit 31 is set), but the function passescomp = 0straight tof.read().All TEXT/TEXD texture resources in both retail chunks are stored this way, so texture extraction is currently impossible through the library.
Fix
Read
dszbytes whencomp == 0. One-line change inread_resource, keeps the existing XOR + LZ4 paths untouched.Validation
Used this fix to extract, edit and re-inject several TEXT/TEXD pairs (BC1/BC3/BC7, full mip chains) on retail chunk0/chunk1 — round-trips verified byte-exact and the textures render fine in-game. LOCR/DLGE extraction (compressed path) is unaffected.