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)) } } }