M2: tåg med tidtabell, spärrar med kort, skyltar, vinst/förlust
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>
This commit is contained in:
2026-10-23 19:36:45 +02:00
parent 3c00c7f356
commit a5a660b32f
26 changed files with 1031 additions and 135 deletions

View File

@@ -58,7 +58,7 @@ metro-puzzle-jp/
│ ├── res/ hittar och läser resources/ (ren Go)
│ ├── rng/ seedad slump (ren Go)
│ ├── level/ banformat, validering, BFS (ren Go)
│ ├── sim/ rutbaserad rörelse, kollision, kamera (ren Go)
│ ├── sim/ rutbaserad rörelse, kollision, kamera, banomgång (Run: klocka, kort, spärrar, tåg) – ren Go
│ ├── game/ Ebitengine-loop, scener, input, rendering, skriptläge ← får använda Ebitengine
│ ├── archtest/ beroenderegler
│ └── … kommande: lang/, nav/, score/, save/, minigame/, ui/, audio/
@@ -140,18 +140,27 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
det naturliga slutet på en bana; tidtabell, spärrar och väntan på tåg
kommer i M2 som planerat.
### M2 – Stationen: tåg, spärrar och vinst/förlust → första spelbara banan
### M2 – Stationen: tåg, spärrar och vinst/förlust ✓ (klar 2026-10-23)
- **Mål:** bana 001 går att klara och misslyckas.
- Tåg med tidtabell som står vid perrongen en stund och avgår; nästa avgång
visas vid perrongen.
- Spärrar som kräver kort (kortet finns och har alltid saldo i M2).
- Vinst när rätt tåg tas; förlust när fel tåg tas. Resultatskärm.
- Interaktion med skyltar (visar text, än så länge på svenska/engelska).
- **Teknik:** `internal/sim/schedule`, `internal/level` utökas med
tidtabell + skyltinnehåll.
- **Klar när:** en simuleringstest låter en bot klara bana 001 headless;
manuellt spel från start till mål fungerar.
- Tåg med tidtabell per perrong (`schedule`: första ankomst, intervall,
uppehåll). Tågvagnen ritas bortom perrongkanten när tåget är inne; HUD:en
visar spår, linje, resmål och "avgår om / nästa tåg om".
- Ombordstigning är ett aktivt val: stå på perrongen och tryck Enter medan
tåget är inne. Rätt tåg = vinst, fel tåg = förlust, resultatskärm med tid,
steg, spärrpassager och kortsaldo.
- Spärrar kräver kort med saldo (startsaldo 2000 ¥, avgift per bana, dras
när man går in i en spärr från en vanlig ruta). Tomt kort stoppas med
meddelande. Riktig ekonomi och påfyllning kommer i M6.
- Skyltar har text (`signs` i bandatan, sv/en/ja) som visas när man står
stilla på skyltrutan. Japanskan ritas först i M3.
- **Regel för banor:** alla perronger ska ligga innanför spärrar.
`level.UngatedPlatforms` kontrolleras i det datadrivna testet; bana 001
byggdes om när regeln avslöjade två genvägar.
- **Teknik:** `internal/sim.Run` (klocka, kort, spärrlogik, ombordstigning –
ren Go), `level.Schedule`, `level.Path` (BFS), skriptkommandot `waittrain`.
- **Klar när:** `TestBotWinsLevel001` låter en bot gå kortaste vägen,
passera spärren, vänta in tåget och kliva på – headless. ✓
### M3 – Japanska och skyltsystemet