104 lines
3.0 KiB
Go
104 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bspviz/internal/mapfmt"
|
|
"bspviz/internal/wad"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
// Flags
|
|
wadPath := flag.String("wad", "", "Pfad zur WAD (required)")
|
|
mapMarker := flag.String("map", "MAP01", "Map-Marker (z.B. MAP01, E1M1, MYMAP)")
|
|
listOnly := flag.Bool("list", false, "Nur Directory auflisten und beenden")
|
|
info := flag.Bool("info", false, "Roh-Infos zur Map (Counts von VERTEXES/LINEDEFS)")
|
|
extract := flag.String("extract", "", "Kommagetrennte Lump-Namen aus der Map extrahieren (z.B. VERTEXES,LINEDEFS)")
|
|
outdir := flag.String("out", ".", "Zielordner für -extract")
|
|
flag.Parse()
|
|
|
|
if *wadPath == "" {
|
|
fmt.Fprintf(os.Stderr, "Usage:\n")
|
|
fmt.Fprintf(os.Stderr, " go run ./cmd/bspviz -wad MYMAP.wad -list\n")
|
|
fmt.Fprintf(os.Stderr, " go run ./cmd/bspviz -wad MYMAP.wad -map MYMAP -info\n")
|
|
fmt.Fprintf(os.Stderr, " go run ./cmd/bspviz -wad MYMAP.wad -map MYMAP -extract VERTEXES,LINEDEFS -out dumps/\n")
|
|
os.Exit(2)
|
|
}
|
|
|
|
w, err := wad.Open(*wadPath)
|
|
if err != nil {
|
|
log.Fatalf("open wad: %v", err)
|
|
}
|
|
defer w.Close()
|
|
|
|
if *listOnly {
|
|
fmt.Printf("WAD: %s\n", *wadPath)
|
|
for i, d := range w.Dir() {
|
|
fmt.Printf("%3d: %-8s size=%-7d pos=%-8d\n", i, d.Name(), d.Size, d.FilePos)
|
|
}
|
|
return
|
|
}
|
|
|
|
start, end, err := w.FindMap(*mapMarker)
|
|
if err != nil {
|
|
log.Fatalf("find map: %v", err)
|
|
}
|
|
fmt.Printf("Map %s: Directory [%d, %d)\n", strings.ToUpper(*mapMarker), start, end)
|
|
|
|
//info über die daten in WAD
|
|
if *info {
|
|
lumps, err := w.LoadMapLumps(*mapMarker, "VERTEXES", "LINEDEFS")
|
|
if err != nil {
|
|
log.Fatalf("load map lumps: %v", err)
|
|
}
|
|
vb := lumps["VERTEXES"]
|
|
lb := lumps["LINEDEFS"]
|
|
m, err := mapfmt.LoadMap(lumps)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
verts := len(vb) / 4
|
|
lines := len(lb) / 14
|
|
fmt.Printf("VERTEXES: bytes=%d count=%d\n", len(vb), verts)
|
|
fmt.Printf("LINEDEFS: bytes=%d count=%d\n", len(lb), lines)
|
|
|
|
fmt.Printf("Map has %d vertices and %d linedefs\n", len(m.Vertices), len(m.Linedefs))
|
|
fmt.Printf("First vertex: %+v\n", m.Vertices[0])
|
|
fmt.Printf("First linedef: %+v\n", m.Linedefs[0])
|
|
|
|
if len(vb)%4 != 0 {
|
|
fmt.Println("WARN: VERTEXES size ist kein Vielfaches von 4 → Format prüfen")
|
|
}
|
|
if len(lb)%14 != 0 {
|
|
fmt.Println("WARN: LINEDEFS size ist kein Vielfaches von 14 → Format prüfen")
|
|
}
|
|
}
|
|
|
|
// Generiert einzelne Lump Dateien zum Debugen
|
|
if *extract != "" {
|
|
want := strings.Split(*extract, ",")
|
|
for i := range want {
|
|
want[i] = strings.ToUpper(strings.TrimSpace(want[i]))
|
|
}
|
|
lumps, err := w.LoadMapLumps(*mapMarker, want...)
|
|
if err != nil {
|
|
log.Fatalf("extract: %v", err)
|
|
}
|
|
if err := os.MkdirAll(*outdir, 0o755); err != nil {
|
|
log.Fatalf("mkdir %s: %v", *outdir, err)
|
|
}
|
|
for name, data := range lumps {
|
|
dst := filepath.Join(*outdir, fmt.Sprintf("%s.lmp", name))
|
|
if err := os.WriteFile(dst, data, 0o644); err != nil {
|
|
log.Fatalf("write %s: %v", dst, err)
|
|
}
|
|
fmt.Printf("wrote %s (%d bytes)\n", dst, len(data))
|
|
}
|
|
}
|
|
}
|