package main import ( "context" "flag" "log/slog" "os" "os/signal" "path/filepath" "golang.org/x/sync/errgroup" "zombiezen.com/go/sqlite" "zombiezen.com/go/sqlite/sqlitex" ) func main() { var ( mdb string out string ) flag.StringVar(&mdb, "mdb", os.ExpandEnv(`$USERPROFILE\AppData\LocalLow\Cygames\Umamusume\master\master.mdb`), "`path` to Umamusume master.mdb") flag.StringVar(&out, "kk", `.\horse`, "existing `dir`ectory for output Koka files") flag.Parse() pctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) go func() { <-pctx.Done() stop() }() t, err := LoadTemplates() if err != nil { slog.Error("loading templates", slog.Any("err", err)) os.Exit(2) } slog.Info("open", slog.String("mdb", mdb)) db, err := sqlitex.NewPool(mdb, sqlitex.PoolOptions{Flags: sqlite.OpenReadOnly}) if err != nil { slog.Error("opening mdb", slog.String("mdb", mdb), slog.Any("err", err)) os.Exit(1) } eg, ctx := errgroup.WithContext(pctx) var ( charas []NamedID[Character] pairs []AffinityRelation trios []AffinityRelation sg []NamedID[SkillGroup] ) eg.Go(func() error { slog.Info("get characters") r, err := Characters(ctx, db) charas = r return err }) eg.Go(func() error { slog.Info("get pairs") r, err := CharacterPairs(ctx, db) pairs = r return err }) eg.Go(func() error { slog.Info("get trios") r, err := CharacterTrios(ctx, db) trios = r return err }) eg.Go(func() error { slog.Info("get skill groups") r, err := SkillGroups(ctx, db) sg = r return err }) if err := eg.Wait(); err != nil { slog.Error("load", slog.Any("err", err)) os.Exit(1) } eg, ctx = errgroup.WithContext(pctx) eg.Go(func() error { cf, err := os.Create(filepath.Join(out, "character.kk")) if err != nil { return err } slog.Info("write characters") return ExecCharacterKK(t, cf, charas, pairs, trios) }) eg.Go(func() error { sf, err := os.Create(filepath.Join(out, "skill.kk")) if err != nil { return err } slog.Info("write skills") return ExecSkillKK(t, sf, sg) }) if err := eg.Wait(); err != nil { slog.Error("generate", slog.Any("err", err)) } else { slog.Info("done") } }