diff --git a/evrtools b/evrtools index 3956aef..200ceb9 100755 Binary files a/evrtools and b/evrtools differ diff --git a/pkg/manifest/benchmark_test.go b/pkg/manifest/benchmark_test.go index 7758f38..4169848 100644 --- a/pkg/manifest/benchmark_test.go +++ b/pkg/manifest/benchmark_test.go @@ -30,8 +30,8 @@ func BenchmarkManifest(b *testing.B) { // Fill with test data for i := range manifest.FrameContents { manifest.FrameContents[i] = FrameContent{ - TypeSymbol: int64(i % 100), - FileSymbol: int64(i), + TypeSymbol: uint64(i % 100), + FileSymbol: uint64(i), FrameIndex: uint32(i % 500), DataOffset: uint32(i * 1024), Size: 1024, @@ -41,8 +41,8 @@ func BenchmarkManifest(b *testing.B) { for i := range manifest.Metadata { manifest.Metadata[i] = FileMetadata{ - TypeSymbol: int64(i % 100), - FileSymbol: int64(i), + TypeSymbol: uint64(i % 100), + FileSymbol: uint64(i), } } @@ -136,8 +136,8 @@ func BenchmarkFrameIndex(b *testing.B) { frameContents := make([]FrameContent, 10000) for i := range frameContents { frameContents[i] = FrameContent{ - TypeSymbol: int64(i % 100), - FileSymbol: int64(i), + TypeSymbol: uint64(i % 100), + FileSymbol: uint64(i), FrameIndex: uint32(i % 500), } } diff --git a/pkg/manifest/manifest.go b/pkg/manifest/manifest.go index 1f28443..54a3b93 100644 --- a/pkg/manifest/manifest.go +++ b/pkg/manifest/manifest.go @@ -54,8 +54,8 @@ type Section struct { // FrameContent describes a file within a frame. type FrameContent struct { - TypeSymbol int64 // File type identifier - FileSymbol int64 // File identifier + TypeSymbol uint64 // File type identifier + FileSymbol uint64 // File identifier FrameIndex uint32 // Index into Frames array DataOffset uint32 // Byte offset within decompressed frame Size uint32 // File size in bytes @@ -64,11 +64,11 @@ type FrameContent struct { // FileMetadata contains additional file metadata. type FileMetadata struct { - TypeSymbol int64 // File type identifier - FileSymbol int64 // File identifier - Unk1 int64 // Unknown - game launches with 0 - Unk2 int64 // Unknown - game launches with 0 - AssetType int64 // Asset type identifier + TypeSymbol uint64 // File type identifier + FileSymbol uint64 // File identifier + Unk1 int64 // Unknown - game launches with 0 + Unk2 int64 // Unknown - game launches with 0 + AssetType int64 // Asset type identifier } // Frame describes a compressed data frame within a package. @@ -121,8 +121,8 @@ func (m *Manifest) UnmarshalBinary(data []byte) error { count := int(m.Header.FrameContents.ElementCount) m.FrameContents = make([]FrameContent, count) for i := 0; i < count; i++ { - m.FrameContents[i].TypeSymbol = int64(binary.LittleEndian.Uint64(data[offset:])) - m.FrameContents[i].FileSymbol = int64(binary.LittleEndian.Uint64(data[offset+8:])) + m.FrameContents[i].TypeSymbol = binary.LittleEndian.Uint64(data[offset:]) + m.FrameContents[i].FileSymbol = binary.LittleEndian.Uint64(data[offset+8:]) m.FrameContents[i].FrameIndex = binary.LittleEndian.Uint32(data[offset+16:]) m.FrameContents[i].DataOffset = binary.LittleEndian.Uint32(data[offset+20:]) m.FrameContents[i].Size = binary.LittleEndian.Uint32(data[offset+24:]) @@ -134,8 +134,8 @@ func (m *Manifest) UnmarshalBinary(data []byte) error { count = int(m.Header.Metadata.ElementCount) m.Metadata = make([]FileMetadata, count) for i := 0; i < count; i++ { - m.Metadata[i].TypeSymbol = int64(binary.LittleEndian.Uint64(data[offset:])) - m.Metadata[i].FileSymbol = int64(binary.LittleEndian.Uint64(data[offset+8:])) + m.Metadata[i].TypeSymbol = binary.LittleEndian.Uint64(data[offset:]) + m.Metadata[i].FileSymbol = binary.LittleEndian.Uint64(data[offset+8:]) m.Metadata[i].Unk1 = int64(binary.LittleEndian.Uint64(data[offset+16:])) m.Metadata[i].Unk2 = int64(binary.LittleEndian.Uint64(data[offset+24:])) m.Metadata[i].AssetType = int64(binary.LittleEndian.Uint64(data[offset+32:])) @@ -208,8 +208,8 @@ func (m *Manifest) EncodeTo(buf []byte) { // Encode FrameContents for i := range m.FrameContents { - binary.LittleEndian.PutUint64(buf[offset:], uint64(m.FrameContents[i].TypeSymbol)) - binary.LittleEndian.PutUint64(buf[offset+8:], uint64(m.FrameContents[i].FileSymbol)) + binary.LittleEndian.PutUint64(buf[offset:], m.FrameContents[i].TypeSymbol) + binary.LittleEndian.PutUint64(buf[offset+8:], m.FrameContents[i].FileSymbol) binary.LittleEndian.PutUint32(buf[offset+16:], m.FrameContents[i].FrameIndex) binary.LittleEndian.PutUint32(buf[offset+20:], m.FrameContents[i].DataOffset) binary.LittleEndian.PutUint32(buf[offset+24:], m.FrameContents[i].Size) @@ -219,8 +219,8 @@ func (m *Manifest) EncodeTo(buf []byte) { // Encode Metadata for i := range m.Metadata { - binary.LittleEndian.PutUint64(buf[offset:], uint64(m.Metadata[i].TypeSymbol)) - binary.LittleEndian.PutUint64(buf[offset+8:], uint64(m.Metadata[i].FileSymbol)) + binary.LittleEndian.PutUint64(buf[offset:], m.Metadata[i].TypeSymbol) + binary.LittleEndian.PutUint64(buf[offset+8:], m.Metadata[i].FileSymbol) binary.LittleEndian.PutUint64(buf[offset+16:], uint64(m.Metadata[i].Unk1)) binary.LittleEndian.PutUint64(buf[offset+24:], uint64(m.Metadata[i].Unk2)) binary.LittleEndian.PutUint64(buf[offset+32:], uint64(m.Metadata[i].AssetType)) diff --git a/pkg/manifest/package.go b/pkg/manifest/package.go index de00e26..dc25023 100644 --- a/pkg/manifest/package.go +++ b/pkg/manifest/package.go @@ -119,11 +119,11 @@ func (p *Package) Extract(outputDir string, opts ...ExtractOption) error { for _, fc := range contents { var fileName string if cfg.decimalNames { - fileName = strconv.FormatInt(fc.FileSymbol, 10) + fileName = strconv.FormatUint(fc.FileSymbol, 10) } else { - fileName = strconv.FormatUint(uint64(fc.FileSymbol), 16) + fileName = strconv.FormatUint(fc.FileSymbol, 16) } - fileType := strconv.FormatUint(uint64(fc.TypeSymbol), 16) + fileType := strconv.FormatUint(fc.TypeSymbol, 16) var basePath string if cfg.preserveGroups { diff --git a/pkg/manifest/scanner.go b/pkg/manifest/scanner.go index 5e7ceaa..52c0145 100644 --- a/pkg/manifest/scanner.go +++ b/pkg/manifest/scanner.go @@ -10,8 +10,8 @@ import ( // ScannedFile represents a file scanned from an input directory for building packages. type ScannedFile struct { - TypeSymbol int64 - FileSymbol int64 + TypeSymbol uint64 + FileSymbol uint64 Path string Size uint32 } @@ -36,17 +36,17 @@ func ScanFiles(inputDir string) ([][]ScannedFile, error) { return fmt.Errorf("invalid path structure: %s", path) } - chunkNum, err := strconv.ParseInt(parts[len(parts)-3], 10, 64) + chunkNum, err := strconv.ParseUint(parts[len(parts)-3], 10, 64) if err != nil { return fmt.Errorf("parse chunk number: %w", err) } - typeSymbol, err := strconv.ParseInt(parts[len(parts)-2], 10, 64) + typeSymbol, err := strconv.ParseUint(parts[len(parts)-2], 10, 64) if err != nil { return fmt.Errorf("parse type symbol: %w", err) } - fileSymbol, err := strconv.ParseInt(filepath.Base(path), 10, 64) + fileSymbol, err := strconv.ParseUint(filepath.Base(path), 10, 64) if err != nil { return fmt.Errorf("parse file symbol: %w", err) } @@ -65,7 +65,7 @@ func ScanFiles(inputDir string) ([][]ScannedFile, error) { } // Grow slice if needed - for int(chunkNum) >= len(files) { + for uint64(len(files)) <= chunkNum { files = append(files, nil) }