package main import ( "context" "flag" "log/slog" "os" "os/signal" "path/filepath" "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() ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) go func() { <-ctx.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) } slog.Info("get characters") charas, err := Characters(ctx, db) if err != nil { slog.Error("getting characters", slog.Any("err", err)) os.Exit(1) } slog.Info("get pairs") pairs, err := CharacterPairs(ctx, db) if err != nil { slog.Error("getting pairs", slog.Any("err", err)) os.Exit(1) } slog.Info("get trios") trios, err := CharacterTrios(ctx, db) if err != nil { slog.Error("getting trios", slog.Any("err", err)) os.Exit(1) } slog.Info("get skill groups") sg, err := SkillGroups(ctx, db) if err != nil { slog.Error("getting skill groups", slog.Any("err", err)) os.Exit(1) } cf, err := os.Create(filepath.Join(out, "character.kk")) if err != nil { slog.Error("creating character.kk", slog.Any("err", err)) os.Exit(1) } slog.Info("write characters") if err := ExecCharacterKK(t, cf, charas, pairs, trios); err != nil { slog.Error("writing character.kk", slog.Any("err", err)) // continue on } sf, err := os.Create(filepath.Join(out, "skill.kk")) if err != nil { slog.Error("creating skill.kk", slog.Any("err", err)) os.Exit(1) } slog.Info("write skills") if err := ExecSkillKK(t, sf, sg); err != nil { slog.Error("writing skill.kk", slog.Any("err", err)) // continue on } }