mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-09-30 07:06:18 -04:00
Ds1 refactor - tests (#10)
* ds1 refactor test: example data * added loader check * ds1 refactor: fixed bug, with loading substitutions; added descriptive error message in engine.go:118 and changed Logger.Error with Logger.Fatal * ds1 refactor: fixed loading bug * ds1 refactor: fixed bug when walls wasn't rendered (now we can see only walls :-) Co-authored-by: M. Sz <mszeptuch@protonmail.com>
This commit is contained in:
parent
5dfca5e9f3
commit
6f41387e30
@ -42,7 +42,7 @@ type DS1 struct {
|
|||||||
const (
|
const (
|
||||||
defaultNumFloors = 1
|
defaultNumFloors = 1
|
||||||
defaultNumShadows = maxShadowLayers
|
defaultNumShadows = maxShadowLayers
|
||||||
defaultNumSubstitutions = maxSubstitutionLayers
|
defaultNumSubstitutions = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
// Unmarshal the given bytes to a DS1 struct
|
// Unmarshal the given bytes to a DS1 struct
|
||||||
@ -154,8 +154,8 @@ func (ds1 *DS1) loadHeader(br *d2datautils.StreamReader) error {
|
|||||||
return fmt.Errorf("reading height: %v", err)
|
return fmt.Errorf("reading height: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//width++
|
width++
|
||||||
//height++
|
height++
|
||||||
|
|
||||||
ds1.SetSize(int(width), int(height))
|
ds1.SetSize(int(width), int(height))
|
||||||
|
|
||||||
@ -506,7 +506,7 @@ func (ds1 *DS1) loadLayerStreams(br *d2datautils.StreamReader) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tile := ds1.Orientations[wallIndex].Tile(x, y)
|
tile := ds1.Walls[wallIndex].Tile(x, y)
|
||||||
tile.Type = d2enum.TileType(c)
|
tile.Type = d2enum.TileType(c)
|
||||||
tile.Zero = byte((dw & wallZeroBitmask) >> wallZeroOffset)
|
tile.Zero = byte((dw & wallZeroBitmask) >> wallZeroOffset)
|
||||||
case layerStreamFloor1, layerStreamFloor2:
|
case layerStreamFloor1, layerStreamFloor2:
|
||||||
|
@ -1 +1,222 @@
|
|||||||
package d2ds1
|
package d2ds1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||||||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2path"
|
||||||
|
)
|
||||||
|
|
||||||
|
func exampleData() *DS1 {
|
||||||
|
exampleFloor1 := Tile{
|
||||||
|
// common fields
|
||||||
|
tileCommonFields: tileCommonFields{
|
||||||
|
Prop1: 2,
|
||||||
|
Sequence: 89,
|
||||||
|
Unknown1: 123,
|
||||||
|
Style: 20,
|
||||||
|
Unknown2: 53,
|
||||||
|
HiddenBytes: 1,
|
||||||
|
RandomIndex: 2,
|
||||||
|
YAdjust: 21,
|
||||||
|
},
|
||||||
|
tileFloorShadowFields: tileFloorShadowFields{
|
||||||
|
Animated: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleFloor2 := Tile{
|
||||||
|
// common fields
|
||||||
|
tileCommonFields: tileCommonFields{
|
||||||
|
Prop1: 3,
|
||||||
|
Sequence: 89,
|
||||||
|
Unknown1: 213,
|
||||||
|
Style: 28,
|
||||||
|
Unknown2: 53,
|
||||||
|
HiddenBytes: 7,
|
||||||
|
RandomIndex: 3,
|
||||||
|
YAdjust: 28,
|
||||||
|
},
|
||||||
|
tileFloorShadowFields: tileFloorShadowFields{
|
||||||
|
Animated: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleWall1 := Tile{
|
||||||
|
// common fields
|
||||||
|
tileCommonFields: tileCommonFields{
|
||||||
|
Prop1: 3,
|
||||||
|
Sequence: 89,
|
||||||
|
Unknown1: 213,
|
||||||
|
Style: 28,
|
||||||
|
Unknown2: 53,
|
||||||
|
HiddenBytes: 7,
|
||||||
|
RandomIndex: 3,
|
||||||
|
YAdjust: 28,
|
||||||
|
},
|
||||||
|
tileWallFields: tileWallFields{
|
||||||
|
Type: d2enum.TileRightWall,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleWall2 := Tile{
|
||||||
|
// common fields
|
||||||
|
tileCommonFields: tileCommonFields{
|
||||||
|
Prop1: 3,
|
||||||
|
Sequence: 93,
|
||||||
|
Unknown1: 193,
|
||||||
|
Style: 17,
|
||||||
|
Unknown2: 13,
|
||||||
|
HiddenBytes: 1,
|
||||||
|
RandomIndex: 1,
|
||||||
|
YAdjust: 22,
|
||||||
|
},
|
||||||
|
tileWallFields: tileWallFields{
|
||||||
|
Type: d2enum.TileLeftWall,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleShadow := Tile{
|
||||||
|
// common fields
|
||||||
|
tileCommonFields: tileCommonFields{
|
||||||
|
Prop1: 3,
|
||||||
|
Sequence: 93,
|
||||||
|
Unknown1: 173,
|
||||||
|
Style: 17,
|
||||||
|
Unknown2: 12,
|
||||||
|
HiddenBytes: 1,
|
||||||
|
RandomIndex: 1,
|
||||||
|
YAdjust: 22,
|
||||||
|
},
|
||||||
|
tileFloorShadowFields: tileFloorShadowFields{
|
||||||
|
Animated: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
result := &DS1{
|
||||||
|
ds1Layers: &ds1Layers{
|
||||||
|
width: 20,
|
||||||
|
height: 80,
|
||||||
|
Floors: layerGroup{
|
||||||
|
// number of floors (one floor)
|
||||||
|
{
|
||||||
|
// tile grid = []tileRow
|
||||||
|
tiles: tileGrid{
|
||||||
|
// tile rows = []Tile
|
||||||
|
// 2x2 tiles
|
||||||
|
{
|
||||||
|
exampleFloor1,
|
||||||
|
exampleFloor2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
exampleFloor2,
|
||||||
|
exampleFloor1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Walls: layerGroup{
|
||||||
|
// number of walls (two floors)
|
||||||
|
{
|
||||||
|
// tile grid = []tileRow
|
||||||
|
tiles: tileGrid{
|
||||||
|
// tile rows = []Tile
|
||||||
|
// 2x2 tiles
|
||||||
|
{
|
||||||
|
exampleWall1,
|
||||||
|
exampleWall2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
exampleWall2,
|
||||||
|
exampleWall1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// tile grid = []tileRow
|
||||||
|
tiles: tileGrid{
|
||||||
|
// tile rows = []Tile
|
||||||
|
// 2x2 tiles
|
||||||
|
{
|
||||||
|
exampleWall1,
|
||||||
|
exampleWall2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
exampleWall2,
|
||||||
|
exampleWall1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Shadows: layerGroup{
|
||||||
|
// number of shadows (always 1)
|
||||||
|
{
|
||||||
|
// tile grid = []tileRow
|
||||||
|
tiles: tileGrid{
|
||||||
|
// tile rows = []Tile
|
||||||
|
// 2x2 tiles
|
||||||
|
{
|
||||||
|
exampleShadow,
|
||||||
|
exampleShadow,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
exampleShadow,
|
||||||
|
exampleShadow,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Files: []string{"a.dt1", "bfile.dt1"},
|
||||||
|
Objects: []Object{
|
||||||
|
{0, 0, 0, 0, 0, nil},
|
||||||
|
{0, 1, 0, 0, 0, []d2path.Path{{}}},
|
||||||
|
{0, 2, 0, 0, 0, nil},
|
||||||
|
{0, 3, 0, 0, 0, nil},
|
||||||
|
},
|
||||||
|
substitutionGroups: nil,
|
||||||
|
version: 17,
|
||||||
|
Act: 1,
|
||||||
|
substitutionType: 0,
|
||||||
|
unknown1: make([]byte, 8),
|
||||||
|
unknown2: 20,
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDS1_Load(t *testing.T) {
|
||||||
|
testFile, fileErr := os.Open("testdata/testdata.ds1")
|
||||||
|
if fileErr != nil {
|
||||||
|
t.Error("cannot open test data file")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data := make([]byte, 0)
|
||||||
|
buf := make([]byte, 16)
|
||||||
|
|
||||||
|
for {
|
||||||
|
numRead, err := testFile.Read(buf)
|
||||||
|
|
||||||
|
data = append(data, buf[:numRead]...)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, loadErr := Unmarshal(data)
|
||||||
|
if loadErr != nil {
|
||||||
|
t.Error(loadErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := testFile.Close()
|
||||||
|
if err != nil {
|
||||||
|
t.Fail()
|
||||||
|
log.Print(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -32,8 +32,6 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type tileCommonFields struct {
|
type tileCommonFields struct {
|
||||||
Type d2enum.TileType
|
|
||||||
Zero byte
|
|
||||||
Prop1 byte
|
Prop1 byte
|
||||||
Sequence byte
|
Sequence byte
|
||||||
Unknown1 byte
|
Unknown1 byte
|
||||||
@ -52,11 +50,17 @@ type tileSubstitutionFields struct {
|
|||||||
Substitution uint32 // unknown
|
Substitution uint32 // unknown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type tileWallFields struct {
|
||||||
|
Type d2enum.TileType
|
||||||
|
Zero byte
|
||||||
|
}
|
||||||
|
|
||||||
// Tile represents a tile record in a DS1 file.
|
// Tile represents a tile record in a DS1 file.
|
||||||
type Tile struct {
|
type Tile struct {
|
||||||
tileCommonFields
|
tileCommonFields
|
||||||
tileFloorShadowFields
|
tileFloorShadowFields
|
||||||
tileSubstitutionFields
|
tileSubstitutionFields
|
||||||
|
tileWallFields
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hidden returns if wall is hidden
|
// Hidden returns if wall is hidden
|
||||||
|
@ -519,7 +519,7 @@ func (am *AssetManager) LoadDS1(ds1Path string) (*d2ds1.DS1, error) {
|
|||||||
|
|
||||||
ds1, err := d2ds1.Unmarshal(fileData)
|
ds1, err := d2ds1.Unmarshal(fileData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("loading ds1 file %s: %v", "/data/global/tiles"+ds1Path, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := am.dt1s.Insert(ds1Path, ds1, defaultCacheEntryWeight); err != nil {
|
if err := am.dt1s.Insert(ds1Path, ds1, defaultCacheEntryWeight); err != nil {
|
||||||
|
@ -115,7 +115,7 @@ func (m *MapEngine) AddDS1(fileName string) {
|
|||||||
|
|
||||||
ds1, err := m.asset.LoadDS1(fileName)
|
ds1, err := m.asset.LoadDS1(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.Error(err.Error())
|
m.Fatalf("Loading ds1: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx := range ds1.Files {
|
for idx := range ds1.Files {
|
||||||
|
Loading…
Reference in New Issue
Block a user