All checks were successful
release / build-release (push) Successful in 1m49s
Inlärning enligt Björns regler: - lang.Knowledge: framsteg per ord (3 läsningar = känt), språkpoäng, köp av valfria ord (kostnad = tier), Award per stjärna - sim.Run: RunOptions med seed; stjärnor 1–3 mot par (parSec eller kortaste vägen × 0,5 s + 20 s); ≥2 stjärnor lär resmålets ord; att stanna på skylt/perrong ger seedad 35 % chans till framsteg per okänt ord - game: ordlista (L) med kända ord, framsteg och kostnad; stjärnor, poäng och inlärt resmål på resultatskärmen; framstegsnotis; flaggor -points/-seed M4 lämmeltåget: - sim.Party: medlemmar med mat/dryck/toa-mätare, behov under tröskel, seedade händelser var 45 s / antal (toa, törst, hunger, distraktion), fartstraff, toalett (W, 3 s/person) och kiosk (K, 150 ¥/person), följare på ledarens spår - level: rutor W och K, party och parSec i bandatan; banor med sällskap måste ha toalett och kiosk (testas); 001 har 2, 002 har 3 i sällskapet - game: följare med färgton, behovsmarkering över huvudet, mätarpanel, facilitetsrutor med förlopp; genart ritar toalett och kiosk - skriptläget: move stannar exakt på målrutan även när farten inte är bildruteexakt (sällskapets fartstraff), stall-skydd mot väggar - docs/README/wiki/spelbeskrivning uppdaterade Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
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)
|
|
}
|