74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
// Parsen der Lump aus wad.go zu go structs
|
|
package mapfmt
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
)
|
|
|
|
type Vertex struct {
|
|
X int16
|
|
Y int16
|
|
}
|
|
|
|
type Linedef struct {
|
|
V1, V2 uint16
|
|
Flags uint16
|
|
Special uint16
|
|
Tag uint16
|
|
RightSide int16
|
|
LeftSide int16
|
|
}
|
|
|
|
type MapData struct {
|
|
Vertices []Vertex
|
|
Linedefs []Linedef
|
|
}
|
|
|
|
// Parsen der Vertices Lumps
|
|
func ParseVertices(data []byte) ([]Vertex, error) {
|
|
if len(data)%4 != 0 {
|
|
return nil, fmt.Errorf("VERTEXES size %d not multiple of 4", len(data))
|
|
}
|
|
n := len(data) / 4
|
|
verts := make([]Vertex, n)
|
|
for i := 0; i < n; i++ {
|
|
verts[i].X = int16(binary.LittleEndian.Uint16(data[i*4:]))
|
|
verts[i].Y = int16(binary.LittleEndian.Uint16(data[i*4+2:]))
|
|
}
|
|
return verts, nil
|
|
}
|
|
|
|
// Parsen der Linedef Lumps
|
|
func ParseLinedefs(data []byte) ([]Linedef, error) {
|
|
if len(data)%14 != 0 {
|
|
return nil, fmt.Errorf("LINEDEFS size %d not multiple of 14", len(data))
|
|
}
|
|
n := len(data) / 14
|
|
lines := make([]Linedef, n)
|
|
for i := 0; i < n; i++ {
|
|
base := i * 14
|
|
lines[i].V1 = binary.LittleEndian.Uint16(data[base:])
|
|
lines[i].V2 = binary.LittleEndian.Uint16(data[base+2:])
|
|
lines[i].Flags = binary.LittleEndian.Uint16(data[base+4:])
|
|
lines[i].Special = binary.LittleEndian.Uint16(data[base+6:])
|
|
lines[i].Tag = binary.LittleEndian.Uint16(data[base+8:])
|
|
lines[i].RightSide = int16(binary.LittleEndian.Uint16(data[base+10:]))
|
|
lines[i].LeftSide = int16(binary.LittleEndian.Uint16(data[base+12:]))
|
|
}
|
|
return lines, nil
|
|
}
|
|
|
|
// Generieren der MapData aus den von LoadMapLumps geliferten Daten und Parsen per funcs
|
|
func LoadMap(raw map[string][]byte) (*MapData, error) {
|
|
v, err := ParseVertices(raw["VERTEXES"])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
l, err := ParseLinedefs(raw["LINEDEFS"])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &MapData{Vertices: v, Linedefs: l}, nil
|
|
}
|