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 kkOut, goOut string ) flag.StringVar(&mdb, "mdb", os.ExpandEnv(`$USERPROFILE\AppData\LocalLow\Cygames\Umamusume\master\master.mdb`), "`path` to Umamusume master.mdb") flag.StringVar(&kkOut, "kk", `.\horse`, "existing `dir`ectory for output Koka files") flag.StringVar(&goOut, "go", `.`, "existing `dir`ectory for output Go 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] skills []Skill ) 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 }) eg.Go(func() error { slog.Info("get skills") r, err := Skills(ctx, db) skills = 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(kkOut, "character.kk")) if err != nil { return err } gf, err := os.Create(filepath.Join(goOut, "character.go")) if err != nil { return err } slog.Info("write characters") return ExecCharacter(t, cf, gf, charas, pairs, trios) }) eg.Go(func() error { sf, err := os.Create(filepath.Join(kkOut, "skill.kk")) if err != nil { return err } gf, err := os.Create(filepath.Join(goOut, "skill_data.go")) slog.Info("write skills") return ExecSkill(t, sf, gf, sg, skills) }) eg.Go(func() error { sf, err := os.Create(filepath.Join(kkOut, "skill-group.kk")) if err != nil { return err } slog.Info("write skill groups") return ExecSkillGroupKK(t, sf, sg, skills) }) if err := eg.Wait(); err != nil { slog.Error("generate", slog.Any("err", err)) } else { slog.Info("done") } }