All checks were successful
release / build-release (push) Successful in 1m35s
- level: Schedule (ankomst/intervall/uppehåll) med Status(t), spårnummer, avgift, skylttexter per i-ruta, Path (BFS) och UngatedPlatforms – regeln att perronger bara nås via spärrar testas för alla banor - sim.Run: klocka, tågkort (saldo dras vid spärr, tomt kort stoppas), ombordstigning med Enter när tåget är inne, vinst/förlust; headless bot-test klarar bana 001 och förlorar på fel tåg - game: perronginfo (avgår om / nästa tåg om), skyltruta, nekad spärr, tågvagn som ritas när tåget är inne, inforutan flyttas upp när spelaren står nära nederkanten; resultat med spärrpassager och saldo - bana 001 ombyggd så spärrarna är flaskhalsar; bana 002 omgenererad med spärrar runt perrongerna och skylttexter - tools/shots räknar ut vägar med BFS; skriptkommandot waittrain - docs/README/wiki uppdaterade med nya bilder Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
72 lines
2.1 KiB
Go
72 lines
2.1 KiB
Go
package game
|
|
|
|
import (
|
|
"fmt"
|
|
"image/color"
|
|
|
|
"github.com/hajimehoshi/ebiten/v2"
|
|
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
|
|
"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 inpututil_R():
|
|
s, err := NewLevelScene(g.Assets, r.from.id)
|
|
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, 112, color.RGBA{24, 20, 37, 235}, false)
|
|
|
|
accent, headline := color.RGBA{228, 59, 68, 255}, a.T("level.wrong_train")
|
|
if run.Outcome == sim.Won {
|
|
accent, headline = color.RGBA{99, 199, 77, 255}, a.T("level.cleared")
|
|
}
|
|
vector.DrawFilledRect(screen, 20, 36, ScreenW-40, 3, accent, false)
|
|
ebitenutil.DebugPrintAt(screen, headline, 28, 46)
|
|
|
|
y := 62
|
|
if tr := run.Boarded; tr != nil {
|
|
// TODO(M3): japanska när fonten finns
|
|
ebitenutil.DebugPrintAt(screen, fmt.Sprintf("%s %s %s -> %s", a.T("hud.track"), tr.Track,
|
|
tr.Line.Get("romaji"), tr.Destination.Get("romaji")), 28, y)
|
|
y += 12
|
|
if run.Outcome == sim.Lost {
|
|
for _, l := range wrap(fmt.Sprintf(a.T("result.wrong_detail"), tr.Destination.Get("romaji"),
|
|
run.Level.Destination.Get("romaji")), 44) {
|
|
ebitenutil.DebugPrintAt(screen, l, 28, y)
|
|
y += 12
|
|
}
|
|
}
|
|
}
|
|
y += 6
|
|
ebitenutil.DebugPrintAt(screen, fmt.Sprintf("%s %.1fs %s %d %s %d %s %d¥", a.T("hud.time"), run.Time,
|
|
a.T("hud.steps"), run.Steps, a.T("result.gates"), run.GatePasses, a.T("result.card"), run.Card.Balance), 28, y)
|
|
ebitenutil.DebugPrintAt(screen, a.T("result.hint"), 28, 128)
|
|
}
|