package game import ( "fmt" "strings" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/vector" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/sim" ) // ResultScene visas när banan är avgjord (rätt eller fel tåg). type ResultScene struct { from *LevelScene } // NewResultScene bygger resultatet för banan som just spelades. func NewResultScene(from *LevelScene) *ResultScene { return &ResultScene{from: from} } func (r *ResultScene) Update(g *Game) error { switch { case wordsJustPressed(): g.SetScene(NewWordsScene(g.Assets, r)) case inpututil_R(): s, err := NewLevelScene(g.Assets, r.from.id, g.Know, g.seed()) if err != nil { return err } g.SetScene(s) case confirmJustPressed() || backJustPressed(): m, err := NewMenuScene(g.Assets) if err != nil { return err } g.SetScene(m) } return nil } func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { r.from.Draw(g, screen) // banan i bakgrunden run := r.from.run a := g.Assets vector.DrawFilledRect(screen, 20, 36, ScreenW-40, 120, colPanel, false) accent, headline := colBad, a.T("level.wrong_train") if run.Outcome == sim.Won { accent, headline = colGood, a.T("level.cleared") } vector.DrawFilledRect(screen, 20, 36, ScreenW-40, 3, accent, false) a.DrawBig(screen, headline, 28, 44, accent) if run.Outcome == sim.Won { stars := strings.Repeat("★", run.Stars) + strings.Repeat("☆", 3-run.Stars) a.DrawBig(screen, stars, ScreenW-28-a.Width(stars)-8, 44, colWarn) } y := 62 if tr := run.Boarded; tr != nil { a.Draw(screen, fmt.Sprintf("%s%s %s %s%s", tr.Track, a.T("hud.track_suffix_ja"), tr.Line.Get("ja"), tr.Destination.Get("ja"), a.T("hud.for_ja")), 28, y, colKnown) y += LineH a.Draw(screen, fmt.Sprintf("%s %s %s → %s", a.T("hud.track"), tr.Track, tr.Line.Get("romaji"), tr.Destination.Get("romaji")), 28, y, colDim) y += LineH if run.Outcome == sim.Lost { for _, l := range a.wrapLine(plainLine(fmt.Sprintf(a.T("result.wrong_detail"), tr.Destination.Get("romaji"), run.Level.Destination.Get("romaji")), colText), ScreenW-56) { a.drawLines(screen, []line{l}, 28, y) y += LineH } } } y += 4 a.Draw(screen, fmt.Sprintf("%s %.1fs (%s %.0fs) %s %d %s %.0f %%", a.T("hud.time"), run.Time, a.T("result.par"), run.ParSec(), a.T("hud.steps"), run.Steps, a.T("result.explored"), 100*run.Fog.Explored(run.Level)), 28, y, colText) y += LineH a.Draw(screen, fmt.Sprintf("%s %d %s %d¥ %s %d", a.T("result.gates"), run.GatePasses, a.T("result.card"), run.Card.Balance, a.T("result.served"), run.Served), 28, y, colText) y += LineH if run.Outcome == sim.Won { msg := fmt.Sprintf("+%d %s", run.PointsEarned, a.T("words.points")) if len(run.LearnedDest) > 0 { msg += " " + a.T("hud.learned") + ": " + strings.Join(run.LearnedDest, " ") + " (" + a.T("result.destination") + ")" } a.Draw(screen, msg, 28, y, colKnown) y += LineH } a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s %s %d (%d %s)", a.T("hud.japanese"), run.Know.Level(), run.Know.Count(), a.T("hud.words"), a.T("words.points"), run.Know.Points, run.Know.Helps, a.T("result.helps")), 28, y, colDim) a.Draw(screen, a.T("result.hint"), 28, 141, colDim) }