package main import ( "bspviz/internal/app" "bspviz/internal/geom" "flag" "fmt" "log" "os" "strings" ) func usageAndExit(msg string, code int) { fmt.Fprintf(os.Stderr, "Fehler: %s\n\n", msg) fmt.Fprintf(os.Stderr, "Beispiel:\n go run ./main.go -wad MYMAP.wad -map MAP01 -info\n\n") fmt.Fprintf(os.Stderr, "Verfügbare Flags:\n") flag.PrintDefaults() os.Exit(code) } 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") geomtest := flag.Bool("geomtest", false, "Geometrie-Check: Segmente/AABB/Probe-Split ausgeben") buildbsp := flag.Bool("buildbsp", false, "BSP bauen und Metriken ausgeben") alpha := flag.Float64("alpha", 10, "Kosten: Gewicht für Splits") beta := flag.Float64("beta", 1, "Kosten: Gewicht für Balance") eps := flag.Float64("eps", geom.EPS, "Epsilon für Geometrie") leaf := flag.Int("leafmax", 12, "max. Segmente pro Leaf") depth := flag.Int("maxdepth", 32, "max. Rekursionstiefe") cands := flag.Int("cands", 16, "Anzahl Kandidaten (Subsample)") seed := flag.Int64("seed", 0, "RNG-Seed (0 = default)") dotOut := flag.String("dot", "", "DOT-Export-Datei (optional)") treePNG := flag.String("treepng", "", "Graphviz-Baum als PNG (optional, benötigt -dot)") overlay := flag.String("overlay", "", "Map-Overlay als PNG (optional)") flag.Parse() if strings.TrimSpace(*wadPath) == "" { usageAndExit("Flag -wad fehlt. Bitte Pfad zu einer Doom-kompatiblen WAD-Datei angeben.", 2) } var extractLumps []string if strings.TrimSpace(*extract) != "" { want := strings.Split(*extract, ",") extractLumps = make([]string, 0, len(want)) for _, name := range want { n := strings.ToUpper(strings.TrimSpace(name)) if n == "" { continue } extractLumps = append(extractLumps, n) } } opts := app.Options{ WadPath: *wadPath, MapMarker: *mapMarker, ListOnly: *listOnly, Info: *info, Extract: extractLumps, OutDir: *outdir, GeomTest: *geomtest, BuildBSP: *buildbsp, Alpha: *alpha, Beta: *beta, Eps: *eps, LeafMax: *leaf, MaxDepth: *depth, Cands: *cands, Seed: *seed, DotOut: *dotOut, TreePNG: *treePNG, Overlay: *overlay, Out: os.Stdout, } if err := app.Run(opts); err != nil { log.Fatal(err) } }