Files
bspviz/internal/mapfmt/map.go
2025-08-18 12:49:15 +02:00

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
}