74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
// package idx parses the Idx/WarHammer.idx file.
|
|
//
|
|
// No, I don't know what it's for yet.
|
|
package idx
|
|
|
|
import (
|
|
"encoding/binary"
|
|
//"fmt"
|
|
"log"
|
|
"os"
|
|
//"strings"
|
|
)
|
|
|
|
type Type1Record struct {
|
|
Offset1 uint32 // Where the type2 for this type1 is to be found
|
|
Unknown1 uint32 // ???
|
|
Offset2 uint32 // Another offset? But what to?
|
|
}
|
|
|
|
type Type2Record struct {
|
|
Unknown1 [4]byte // ???
|
|
Offset uint32 // Where the type3 for this type2 is to be found
|
|
Unknown2 [4]byte // ??
|
|
}
|
|
|
|
type Type3Record struct {
|
|
First20 [20]byte
|
|
Last78 [78]byte
|
|
}
|
|
|
|
type Idx struct {
|
|
Filename string
|
|
|
|
Type1Records [512]Type1Record // Experimentally, there seem to be 512 of these
|
|
Type2Records []Type2Record
|
|
Type3Records []Type3Record
|
|
}
|
|
|
|
func Load(filename string) (*Idx, error) {
|
|
f, err := os.Open(filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
out := &Idx{Filename: filename}
|
|
|
|
if err := binary.Read(f, binary.LittleEndian, &out.Type1Records); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for i, rec := range out.Type1Records {
|
|
var off1diff uint32
|
|
var off2diff uint32
|
|
|
|
if i > 0 && rec.Offset1 > 0 {
|
|
lastRec := out.Type1Records[i-1]
|
|
off1diff = rec.Offset1 - lastRec.Offset1
|
|
off2diff = rec.Offset2 - lastRec.Offset2
|
|
}
|
|
|
|
log.Printf(
|
|
"%.3d: 0x%.6x diff=%.6d %.4d 0x%.6x diff=%.6d",
|
|
i, rec.Offset1, off1diff, rec.Unknown1, rec.Offset2, off2diff,
|
|
// i,
|
|
// rec.Unknown1[0], rec.Unknown1[1], rec.Unknown1[2], rec.Unknown1[3],
|
|
// rec.Unknown1[4], rec.Unknown1[5], rec.Unknown1[6], rec.Unknown1[7],
|
|
)
|
|
}
|
|
|
|
return out, nil
|
|
}
|