// Genererar dokumentationens skärmdumpar deterministiskt: // // go run ./tools/shots // // Bygger debug-binären, kör den med -script för varje bild och skriver // PNG:er till doc/img/. Kör om detta när grafik eller UI ändrats, och // committa bilderna – README och wikin pekar på dem. package main import ( "fmt" "os" "os/exec" "path/filepath" "runtime" ) type shot struct { file string level string script string } var shots = []shot{ {"menu.png", "", "wait 10; shot %s; quit"}, {"level-001.png", "001-flygplatsen", "move right 4; move down 2; wait 5; shot %s; quit"}, {"level-002.png", "002-shinjuku", "move down 6; move right 4; wait 5; shot %s; quit"}, {"result.png", "001-flygplatsen", "move down 2; move right 2; move down 2; move left 2; move down 4; move right 17; move down 1; move left 1; wait 15; shot %s; quit"}, } func main() { root := repoRoot() out := filepath.Join(root, "doc", "img") must(os.MkdirAll(out, 0o755)) build := exec.Command("go", "run", "./tools/build", "-mode", "debug") build.Dir, build.Stdout, build.Stderr = root, os.Stdout, os.Stderr must(build.Run()) exe := filepath.Join(root, "build", "debug", "metro-puzzle-jp") if runtime.GOOS == "windows" { exe += ".exe" } for _, s := range shots { args := []string{"-script", fmt.Sprintf(s.script, filepath.Join(out, s.file))} if s.level != "" { args = append(args, "-level", s.level) } run := exec.Command(exe, args...) run.Dir, run.Stdout, run.Stderr = filepath.Dir(exe), os.Stdout, os.Stderr if err := run.Run(); err != nil { fail(fmt.Errorf("%s: %w", s.file, err)) } } fmt.Println("klart:", out) } func repoRoot() string { dir, _ := os.Getwd() for { if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil { return dir } parent := filepath.Dir(dir) if parent == dir { fail(fmt.Errorf("hittade ingen go.mod")) } dir = parent } } func must(err error) { if err != nil { fail(err) } } func fail(err error) { fmt.Fprintln(os.Stderr, "shots:", err) os.Exit(1) }