1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-19 21:55:24 +00:00

ds1: splited loading function

This commit is contained in:
M. Sz 2021-02-06 18:58:15 +01:00
parent 32570d6ae5
commit 215ac8cfc5

View File

@ -9,22 +9,21 @@ import (
) )
const ( const (
maxActNumber = 5 subType1 = 1
subType1 = 1 subType2 = 2
subType2 = 2 v2 = 2
v2 = 2 v3 = 3
v3 = 3 v4 = 4
v4 = 4 v7 = 7
v7 = 7 v8 = 8
v8 = 8 v9 = 9
v9 = 9 v10 = 10
v10 = 10 v12 = 12
v12 = 12 v13 = 13
v13 = 13 v14 = 14
v14 = 14 v15 = 15
v15 = 15 v16 = 16
v16 = 16 v18 = 18
v18 = 18
) )
const ( const (
@ -34,6 +33,10 @@ const (
wallTypeBitmask = 0x000000FF wallTypeBitmask = 0x000000FF
) )
const (
unknown1BytesCount = 8
)
// DS1 represents the "stamp" data that is used to build up maps. // DS1 represents the "stamp" data that is used to build up maps.
type DS1 struct { type DS1 struct {
Files []string // FilePtr table of file string pointers Files []string // FilePtr table of file string pointers
@ -57,7 +60,6 @@ type DS1 struct {
} }
// LoadDS1 loads the specified DS1 file // LoadDS1 loads the specified DS1 file
//nolint:funlen,gocognit,gocyclo // will refactor later
func LoadDS1(fileData []byte) (*DS1, error) { func LoadDS1(fileData []byte) (*DS1, error) {
ds1 := &DS1{ ds1 := &DS1{
Act: 1, Act: 1,
@ -71,74 +73,14 @@ func LoadDS1(fileData []byte) (*DS1, error) {
var err error var err error
ds1.Version, err = br.ReadInt32() err = ds1.loadHeader(br)
if err != nil { if err != nil {
return nil, err return nil, err
} }
ds1.Width, err = br.ReadInt32()
if err != nil {
return nil, err
}
ds1.Height, err = br.ReadInt32()
if err != nil {
return nil, err
}
ds1.Width++
ds1.Height++
if ds1.Version >= v8 {
ds1.Act, err = br.ReadInt32()
if err != nil {
return nil, err
}
ds1.Act = d2math.MinInt32(maxActNumber, ds1.Act+1)
}
if ds1.Version >= v10 {
ds1.SubstitutionType, err = br.ReadInt32()
if err != nil {
return nil, err
}
if ds1.SubstitutionType == 1 || ds1.SubstitutionType == 2 {
ds1.NumberOfSubstitutionLayers = 1
}
}
if ds1.Version >= v3 {
// These files reference things that don't exist anymore :-?
numberOfFiles, err := br.ReadInt32() //nolint:govet // i want to re-use the err variable...
if err != nil {
return nil, err
}
ds1.Files = make([]string, numberOfFiles)
for i := 0; i < int(numberOfFiles); i++ {
ds1.Files[i] = ""
for {
ch, err := br.ReadByte()
if err != nil {
return nil, err
}
if ch == 0 {
break
}
ds1.Files[i] += string(ch)
}
}
}
if ds1.Version >= v9 && ds1.Version <= v13 { if ds1.Version >= v9 && ds1.Version <= v13 {
// Skipping two dwords because they are "meaningless"? // Skipping two dwords because they are "meaningless"?
ds1.unknown1, err = br.ReadBytes(8) //nolint:gomnd // We don't know what's here ds1.unknown1, err = br.ReadBytes(unknown1BytesCount)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -197,6 +139,86 @@ func LoadDS1(fileData []byte) (*DS1, error) {
return ds1, nil return ds1, nil
} }
func (ds1 *DS1) loadHeader(br *d2datautils.StreamReader) error {
var err error
ds1.Version, err = br.ReadInt32()
if err != nil {
return err
}
ds1.Width, err = br.ReadInt32()
if err != nil {
return err
}
ds1.Height, err = br.ReadInt32()
if err != nil {
return err
}
ds1.Width++
ds1.Height++
if ds1.Version >= v8 {
ds1.Act, err = br.ReadInt32()
if err != nil {
return err
}
ds1.Act = d2math.MinInt32(d2enum.ActsNumber, ds1.Act+1)
}
if ds1.Version >= v10 {
ds1.SubstitutionType, err = br.ReadInt32()
if err != nil {
return err
}
if ds1.SubstitutionType == 1 || ds1.SubstitutionType == 2 {
ds1.NumberOfSubstitutionLayers = 1
}
}
err = ds1.loadFileList(br)
if err != nil {
return err
}
return nil
}
func (ds1 *DS1) loadFileList(br *d2datautils.StreamReader) error {
if ds1.Version >= v3 {
// These files reference things that don't exist anymore :-?
numberOfFiles, err := br.ReadInt32() //nolint:govet // i want to re-use the err variable...
if err != nil {
return err
}
ds1.Files = make([]string, numberOfFiles)
for i := 0; i < int(numberOfFiles); i++ {
ds1.Files[i] = ""
for {
ch, err := br.ReadByte()
if err != nil {
return err
}
if ch == 0 {
break
}
ds1.Files[i] += string(ch)
}
}
}
return nil
}
func (ds1 *DS1) loadObjects(br *d2datautils.StreamReader) error { func (ds1 *DS1) loadObjects(br *d2datautils.StreamReader) error {
if ds1.Version < v2 { if ds1.Version < v2 {
ds1.Objects = make([]Object, 0) ds1.Objects = make([]Object, 0)