dt1: added New method and mad unknownX bytes as an constant variable

This commit is contained in:
M. Sz 2021-03-29 08:30:10 +02:00
parent 435fd1a61b
commit db89a09f9d
3 changed files with 53 additions and 34 deletions

View File

@ -2,8 +2,6 @@ package d2dt1
// Block represents a DT1 block
type Block struct {
unknown1 []byte
unknown2 []byte
X int16
Y int16
GridX byte
@ -22,3 +20,11 @@ func (b *Block) Format() BlockDataFormat {
return BlockFormatRLE
}
func (b *Block) unknown1() []byte {
return make([]byte, numUnknownBlockBytes)
}
func (b *Block) unknown2() []byte {
return make([]byte, numUnknownBlockBytes)
}

View File

@ -26,16 +26,26 @@ const (
numUnknownTileBytes2 = 4
numUnknownTileBytes3 = 7
numUnknownTileBytes4 = 12
numUnknownBlockBytes = 2
)
// DT1 represents a DT1 file.
type DT1 struct {
majorVersion int32
minorVersion int32
unknownHeaderBytes []byte
numberOfTiles int32
bodyPosition int32
Tiles []Tile
majorVersion int32
minorVersion int32
numberOfTiles int32
bodyPosition int32
Tiles []Tile
}
// New creates a new DT1
func New() *DT1 {
result := &DT1{
majorVersion: knownMajorVersion,
minorVersion: knownMinorVersion,
}
return result
}
// LoadDT1 loads a DT1 record
@ -61,10 +71,7 @@ func LoadDT1(fileData []byte) (*DT1, error) {
return nil, fmt.Errorf(fmtErr, result.majorVersion, result.minorVersion)
}
result.unknownHeaderBytes, err = br.ReadBytes(numUnknownHeaderBytes)
if err != nil {
return nil, err
}
br.SkipBytes(numUnknownHeaderBytes)
result.numberOfTiles, err = br.ReadInt32()
if err != nil {
@ -112,10 +119,7 @@ func LoadDT1(fileData []byte) (*DT1, error) {
return nil, err
}
tile.unknown1, err = br.ReadBytes(numUnknownTileBytes1)
if err != nil {
return nil, err
}
br.SkipBytes(numUnknownTileBytes1)
tile.Type, err = br.ReadInt32()
if err != nil {
@ -153,10 +157,7 @@ func LoadDT1(fileData []byte) (*DT1, error) {
tile.SubTileFlags[i] = NewSubTileFlags(subtileFlagBytes)
}
tile.unknown3, err = br.ReadBytes(numUnknownTileBytes3)
if err != nil {
return nil, err
}
br.SkipBytes(numUnknownTileBytes3)
tile.blockHeaderPointer, err = br.ReadInt32()
if err != nil {
@ -177,7 +178,7 @@ func LoadDT1(fileData []byte) (*DT1, error) {
tile.Blocks = make([]Block, numBlocks)
tile.unknown4, err = br.ReadBytes(numUnknownTileBytes4)
br.SkipBytes(numUnknownTileBytes4)
if err != nil {
return nil, err
}
@ -200,8 +201,7 @@ func LoadDT1(fileData []byte) (*DT1, error) {
return nil, err
}
//nolint:gomnd // Unknown data
result.Tiles[tileIdx].Blocks[blockIdx].unknown1, err = br.ReadBytes(2)
br.SkipBytes(numUnknownBlockBytes)
if err != nil {
return nil, err
}
@ -226,8 +226,7 @@ func LoadDT1(fileData []byte) (*DT1, error) {
return nil, err
}
//nolint:gomnd // Unknown data
result.Tiles[tileIdx].Blocks[blockIdx].unknown2, err = br.ReadBytes(2)
br.SkipBytes(numUnknownBlockBytes)
if err != nil {
return nil, err
}
@ -260,7 +259,7 @@ func (d *DT1) Marshal() []byte {
// header
sw.PushInt32(d.majorVersion)
sw.PushInt32(d.minorVersion)
sw.PushBytes(d.unknownHeaderBytes...)
sw.PushBytes(d.unknownHeaderBytes()...)
sw.PushInt32(d.numberOfTiles)
sw.PushInt32(d.bodyPosition)
@ -271,7 +270,7 @@ func (d *DT1) Marshal() []byte {
sw.PushUint16(d.Tiles[i].MaterialFlags.Encode())
sw.PushInt32(d.Tiles[i].Height)
sw.PushInt32(d.Tiles[i].Width)
sw.PushBytes(d.Tiles[i].unknown1...)
sw.PushBytes(d.Tiles[i].unknown1()...)
sw.PushInt32(d.Tiles[i].Type)
sw.PushInt32(d.Tiles[i].Style)
sw.PushInt32(d.Tiles[i].Sequence)
@ -282,11 +281,11 @@ func (d *DT1) Marshal() []byte {
sw.PushBytes(j.Encode())
}
sw.PushBytes(d.Tiles[i].unknown3...)
sw.PushBytes(d.Tiles[i].unknown3()...)
sw.PushInt32(d.Tiles[i].blockHeaderPointer)
sw.PushInt32(d.Tiles[i].blockHeaderSize)
sw.PushInt32(int32(len(d.Tiles[i].Blocks)))
sw.PushBytes(d.Tiles[i].unknown4...)
sw.PushBytes(d.Tiles[i].unknown4()...)
}
// we must sort blocks first
@ -308,12 +307,12 @@ func (d *DT1) Marshal() []byte {
for j := range blocks[keys[i]] {
sw.PushInt16(blocks[keys[i]][j].X)
sw.PushInt16(blocks[keys[i]][j].Y)
sw.PushBytes(blocks[keys[i]][j].unknown1...)
sw.PushBytes(blocks[keys[i]][j].unknown1()...)
sw.PushBytes(blocks[keys[i]][j].GridX)
sw.PushBytes(blocks[keys[i]][j].GridY)
sw.PushInt16(blocks[keys[i]][j].format)
sw.PushInt32(blocks[keys[i]][j].Length)
sw.PushBytes(blocks[keys[i]][j].unknown2...)
sw.PushBytes(blocks[keys[i]][j].unknown2()...)
sw.PushInt32(blocks[keys[i]][j].FileOffset)
}
@ -325,3 +324,8 @@ func (d *DT1) Marshal() []byte {
return sw.GetBytes()
}
func (d *DT1) unknownHeaderBytes() []byte {
result := make([]byte, numUnknownHeaderBytes)
return result
}

View File

@ -2,10 +2,7 @@ package d2dt1
// Tile is a representation of a map tile
type Tile struct {
unknown1 []byte
unknown2 []byte
unknown3 []byte
unknown4 []byte
Direction int32
RoofHeight int16
MaterialFlags MaterialFlags
@ -20,3 +17,15 @@ type Tile struct {
blockHeaderSize int32
Blocks []Block
}
func (t *Tile) unknown1() []byte {
return make([]byte, numUnknownTileBytes1)
}
func (t *Tile) unknown3() []byte {
return make([]byte, numUnknownTileBytes3)
}
func (t *Tile) unknown4() []byte {
return make([]byte, numUnknownTileBytes4)
}