package game import ( "fmt" "image/color" "path/filepath" "strings" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/vector" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/buildinfo" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" ) type menuEntry struct { id string name string dest string stars string } // MenuScene listar banorna och låter spelaren välja. type MenuScene struct { entries []menuEntry sel int err error } // NewMenuScene läser in banlistan. func NewMenuScene(a *Assets) (*MenuScene, error) { ids, err := level.List(a.LevelsDir) if err != nil { return nil, err } m := &MenuScene{} for _, id := range ids { l, err := level.LoadFile(filepath.Join(a.LevelsDir, id+".json")) if err != nil { m.err = err continue } m.entries = append(m.entries, menuEntry{ id: id, name: l.Name.Get(UILang) + " " + l.Name.Get("ja"), dest: l.Destination.Get("ja") + " " + l.Destination.Get("romaji"), stars: strings.Repeat("★", l.Difficulty) + strings.Repeat("☆", 5-l.Difficulty), }) } return m, nil } func (m *MenuScene) Update(g *Game) error { if backJustPressed() { return ebiten.Termination } if wordsJustPressed() { g.SetScene(NewWordsScene(g.Assets, m)) return nil } if n := len(m.entries); n > 0 { m.sel = (m.sel + menuMove() + n) % n if confirmJustPressed() { s, err := NewLevelScene(g.Assets, m.entries[m.sel].id, g.Know, g.seed()) if err != nil { m.err = err return nil } g.SetScene(s) } } return nil } func (m *MenuScene) Draw(g *Game, screen *ebiten.Image) { a := g.Assets screen.Fill(color.RGBA{24, 20, 37, 255}) vector.DrawFilledRect(screen, 0, 0, ScreenW, 22, color.RGBA{38, 43, 68, 255}, false) a.DrawBig(screen, a.T("game.title"), 8, 5, colText) a.Draw(screen, a.T("menu.choose_level"), 8, 30, colDim) for i, e := range m.entries { y := 46 + i*14 if i == m.sel { vector.DrawFilledRect(screen, 6, float32(y-2), ScreenW-12, 13, colBar, false) } a.Draw(screen, e.name, 12, y, colText) a.Draw(screen, "→ "+e.dest, 150, y, colKnown) a.Draw(screen, e.stars, ScreenW-62, y, colWarn) } if m.err != nil { a.Draw(screen, "FEL: "+m.err.Error(), 8, ScreenH-40, colBad) } a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s %s %d", a.T("hud.japanese"), g.Know.Level(), g.Know.Count(), a.T("hud.words"), a.T("words.points"), g.Know.Points), 8, ScreenH-38, colDim) a.Draw(screen, a.T("menu.hint"), 8, ScreenH-26, colDim) a.Draw(screen, fmt.Sprintf("%s (%s)", buildinfo.Version, buildinfo.Mode), 8, ScreenH-13, colDim) }