1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-09-25 20:55:55 -04:00
OpenDiablo2/d2common/d2fileformats/d2ds1/layer.go

132 lines
2.1 KiB
Go
Raw Normal View History

2021-03-01 05:03:03 -05:00
package d2ds1
// layerStreamType represents a layer stream type
type layerStreamType int
// Layer stream types
const (
layerStreamWall1 layerStreamType = iota
layerStreamWall2
layerStreamWall3
layerStreamWall4
layerStreamOrientation1
layerStreamOrientation2
layerStreamOrientation3
layerStreamOrientation4
layerStreamFloor1
layerStreamFloor2
layerStreamShadow1
layerStreamSubstitute1
)
2021-03-31 07:50:40 -04:00
type (
tileRow []Tile // index is x coordinate
tileGrid []tileRow // index is y coordinate
)
2021-03-01 05:03:03 -05:00
2021-03-31 07:50:40 -04:00
type Layer struct {
2021-03-01 05:03:03 -05:00
tiles tileGrid
}
2021-03-31 07:50:40 -04:00
func (l *Layer) Tile(x, y int) *Tile {
2021-03-01 05:03:03 -05:00
if l.Width() < x || l.Height() < y {
return nil
}
return &l.tiles[y][x]
}
2021-03-31 07:50:40 -04:00
func (l *Layer) SetTile(x, y int, t *Tile) {
2021-03-01 05:03:03 -05:00
if l.Width() > x || l.Height() > y {
return
}
l.tiles[y][x] = *t
}
2021-03-31 07:50:40 -04:00
func (l *Layer) Width() int {
2021-03-01 05:03:03 -05:00
if len(l.tiles[0]) < 1 {
l.SetWidth(1)
}
return len(l.tiles[0])
}
2021-03-31 07:50:40 -04:00
func (l *Layer) SetWidth(w int) *Layer {
2021-03-01 05:03:03 -05:00
if w < 1 {
w = 1
}
// ensure at least one row
if len(l.tiles) < 1 {
l.tiles = make(tileGrid, 1)
}
// create/copy tiles as required to satisfy width
for y := range l.tiles {
if (w - len(l.tiles[y])) == 0 { // if requested width same as row width
continue
}
tmpRow := make(tileRow, w)
for x := range tmpRow {
if x < len(l.tiles[y]) { // if tile exists
tmpRow[x] = l.tiles[y][x] // copy it
}
}
l.tiles[y] = tmpRow
}
return l
}
2021-03-31 07:50:40 -04:00
func (l *Layer) Height() int {
2021-03-01 05:03:03 -05:00
if len(l.tiles) < 1 {
l.SetHeight(1)
}
return len(l.tiles)
}
2021-03-31 07:50:40 -04:00
func (l *Layer) SetHeight(h int) *Layer {
2021-03-01 05:03:03 -05:00
if h < 1 {
h = 1
}
// make tmpGrid to move existing tiles into
tmpGrid := make(tileGrid, h)
for y := range tmpGrid {
tmpGrid[y] = make(tileRow, l.Width())
}
// move existing tiles over
for y := range l.tiles {
if y >= len(tmpGrid) {
continue
}
for x := range l.tiles[y] {
if x >= len(tmpGrid[y]) {
continue
}
tmpGrid[y][x] = l.tiles[y][x]
}
}
l.tiles = tmpGrid
return l
}
2021-03-31 07:50:40 -04:00
func (l *Layer) Size() (w, h int) {
2021-03-01 05:03:03 -05:00
return l.Width(), l.Height()
}
2021-03-31 07:50:40 -04:00
func (l *Layer) SetSize(w, h int) *Layer {
2021-03-01 05:03:03 -05:00
return l.SetWidth(w).SetHeight(h)
}