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>
89 lines
3.0 KiB
Go
89 lines
3.0 KiB
Go
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, 112, 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 %d %s %d¥", a.T("hud.time"), run.Time, a.T("result.par"), run.ParSec(),
|
|
a.T("hud.steps"), run.Steps, a.T("result.gates"), run.GatePasses, a.T("result.card"), run.Card.Balance), 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, 130, colDim)
|
|
}
|