mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-11-18 02:16:23 -05:00
72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
package d2dt1
|
|
|
|
const (
|
|
blockDataLength = 256
|
|
)
|
|
|
|
// DecodeTileGfxData decodes tile graphics data for a slice of dt1 blocks
|
|
func DecodeTileGfxData(blocks []Block, pixels *[]byte, tileYOffset, tileWidth int32) {
|
|
for _, block := range blocks {
|
|
if block.Format == BlockFormatIsometric {
|
|
// 3D isometric decoding
|
|
xjump := []int32{14, 12, 10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10, 12, 14}
|
|
nbpix := []int32{4, 8, 12, 16, 20, 24, 28, 32, 28, 24, 20, 16, 12, 8, 4}
|
|
blockX := int32(block.X)
|
|
blockY := int32(block.Y)
|
|
length := int32(blockDataLength)
|
|
x := int32(0)
|
|
y := int32(0)
|
|
idx := 0
|
|
|
|
for length > 0 {
|
|
x = xjump[y]
|
|
n := nbpix[y]
|
|
length -= n
|
|
|
|
for n > 0 {
|
|
offset := ((blockY + y + tileYOffset) * tileWidth) + (blockX + x)
|
|
(*pixels)[offset] = block.EncodedData[idx]
|
|
x++
|
|
n--
|
|
idx++
|
|
}
|
|
y++
|
|
}
|
|
|
|
continue
|
|
}
|
|
// RLE Encoding
|
|
blockX := int32(block.X)
|
|
blockY := int32(block.Y)
|
|
x := int32(0)
|
|
y := int32(0)
|
|
idx := 0
|
|
length := block.Length
|
|
|
|
for length > 0 {
|
|
b1 := block.EncodedData[idx]
|
|
b2 := block.EncodedData[idx+1]
|
|
idx += 2
|
|
length -= 2
|
|
|
|
if (b1 | b2) == 0 {
|
|
x = 0
|
|
y++
|
|
|
|
continue
|
|
}
|
|
|
|
x += int32(b1)
|
|
length -= int32(b2)
|
|
|
|
for b2 > 0 {
|
|
offset := ((blockY + y + tileYOffset) * tileWidth) + (blockX + x)
|
|
(*pixels)[offset] = block.EncodedData[idx]
|
|
idx++
|
|
x++
|
|
b2--
|
|
}
|
|
}
|
|
}
|
|
}
|