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