M7b: tågfaser, räls, in-/utkörning, vind, ankomstindikator och melodier
All checks were successful
release / build-release (push) Successful in 1m42s

- level.Schedule.Phase: away/approaching/arriving/dwelling/closing/leaving
  ur tidtabellen med progress; Boardable (öppna dörrar) och Present;
  validering av minsta uppehåll/borta-tid; TrackTile för rälsen
- sim.Run: ombordstigning bara med öppna dörrar, TrainVisible via Present,
  PlatformPhase och NearTrack (närmaste perrong inom två rutor)
- game/trains.go: rälsrutor längs kantraden (roterade för vertikala spår),
  tre vagnar som bromsar in och accelererar ut längs rälsen, strålkastare
  under inrullningen, blinkande lampor vid kanten för den som står nära,
  dammpartiklar längs perrongen; kameran får en rutas marginal så att
  kanträlsen syns
- game/audio.go: ebiten/v2/audio med avgångsmelodi (approaching) och
  dörrsignal (closing), volym efter avstånd, -mute; tools/gensound
  syntetiserar placeholder-WAV:ar
- HUD: fasberoende perrongtext och "tåg på väg in" nära rälsen;
  skriptkommandot waitphase; skärmdump av ankomsten
- plan (Björn 2026-10-24): räls/väg-grafik och melodierna i M7b; folk/NPC:er,
  vänster-/högertrafik, bredare gångar, reklam- och ljudröra som nytt steg
  M9b – i spelbeskrivning, roadmap, testplan
- docs/README/wiki uppdaterade

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 11:03:12 +02:00
parent b2995d4ca9
commit d466333f01
42 changed files with 855 additions and 82 deletions

View File

@@ -328,24 +328,32 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
`TestIndividualCardsAtGateAndMachine`, `TestLevel003Flow`,
`TestSeatSelectionPreferences`); bana 003 använder dem. ✓
### M7b – Tåg som kommer och går (Björns tillägg 2026-10-24)
### M7b – Tåg som kommer och går ✓ (klar 2026-10-24)
- **Mål:** tågen ska kännas – man ska se och förstå när de kommer och går,
särskilt när missade tåg kostar (M7).
- **Ankomstindikator nära rälsen:** några sekunder före ankomst (från
tidtabellen) tänds lampor vid perrongkanten och strålkastare syns i
tunneln/vid kartkanten, bara för den som står nära rälsen.
- **Vind:** när tåget kör in eller avgår blåser det längs perrongen –
partiklar (damm, papper) och fladdrande kläder/hår på alla som står vid
kanten. Kan senare påverka items (hattar som blåser av, M8).
- **In- och utkörningsanimation:** tågvagnarna rullar in från kartkanten,
bromsar, står (dörrar öppna) och accelererar ut – samma för bussar. Ersätter
dagens "dyker upp/försvinner".
- **Teknik:** ren logik i `sim` (`TrainPhase(t)`: approaching/arriving/
dwelling/departing/away med fas 0–1 ur `level.Schedule`), partiklar och
tweening i `internal/game`. Ljudet (M12) hakar på samma faser.
- **Klar när:** faserna beräknas rätt ur tidtabellen (testat), indikatorn
syns bara nära rälsen, tåget rullar in/ut i stället för att blinka till.
- **Mål:** tågen ska synas, höras och kännas – man ska förstå när de kommer
och går, särskilt när missade tåg kostar (M7).
- **Tågfaser** ur tidtabellen (`level.Schedule.Phase`): på väg in
(approaching, 5 s före), kör in (arriving, 1,5 s), står inne (dwelling,
dörrar öppna), strax avgång (closing, sista 3 s, dörrsignal), kör ut
(leaving, 1,5 s), borta. Man kan bara kliva på när dörrarna är öppna.
- **Räls** ritas längs perrongkanten (egen ruta i `tools/genart`); tågen
rullar in längs rälsen i tre vagnar, står, och accelererar ut – inte
"dyker upp/försvinner". Vägrutor för bussar kommer med bussarna (M10).
- **Ankomstindikator nära rälsen:** står man inom två rutor från perrongen
när tåget är på väg in blinkar lampor vid kanten, strålkastare syns från
det håll tåget kommer och inforutan säger "tåg på väg in".
- **Vind:** dammpartiklar längs perrongen när tåget kör in och ut.
- **Ljud:** ljudsystemet (`ebiten/v2/audio`) införs här med två placeholder-
jinglar genererade av `tools/gensound` (pentatonisk avgångsmelodi när
tåget är på väg in, dörrsignal strax före avgång), med volym efter avstånd
till perrongen och `-mute`. Riktiga inspelningar/kompositioner i M12.
- **Teknik:** faser i `level` (ren Go, testade), `sim.Run.NearTrack`,
partiklar/tweening/ljud i `internal/game`, skriptkommandot `waitphase`.
- **Klar när:** faserna beräknas rätt ur tidtabellen (testat:
`TestSchedulePhases`, `TestNearTrackAndPhases`), indikatorn syns bara
nära rälsen, tåget rullar in/ut och melodierna spelas i rätt fas. ✓
- **Konsekvens för banorna:** uppehållet måste vara minst 5,5 s och tiden
borta minst 7,5 s (valideras), så att faserna får plats.
### M8 – Progression, items och sparfiler
@@ -377,6 +385,27 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
minikartan visar rätt våning, och alla gamla banor fungerar oförändrat
(en våning).
### M9b – Folk, reklam och ljudröra (Björns tillägg 2026-10-24)
- **Mål:** stationen lever och överstimulerar – tre nya svårighetsvariabler.
- **Folk (NPC:er):** passagerare som går på och av tågen när dörrarna är
öppna, rör sig mellan kiosker, toaletter och utgångar, och in och ut från
stationen. De tar plats i rutnätet: man måste runda dem, och att gå in i
någon saktar ned (`crowd`-nivå per bana styr hur många).
- **Vänster-/högertrafik:** gångar och trappor kan markeras med en sida
(pilar i golvet); går man på fel sida möter man strömmen och bromsas.
- **Bredare gångar:** generatorn kan göra gångar två rutor breda där det
ska gå att passera folk; följarna går då i bredd när det får plats.
- **Visuell röra** (`clutter`-nivå): dekorationslager med reklam, affischer
och blinkande skyltar på väggarna, lockskyltar som liknar riktiga.
- **Ljudröra** (`noise`-nivå): japanskt prat, utrop och reklam i bakgrunden
som konkurrerar med melodierna; på de svåraste nivåerna överlappar de.
- **Teknik:** `sim.NPC` med enkla mål och BFS-vägar (ren Go, seedade),
dekorationslager i banformatet, `tools/genart` för folk/reklam,
`tools/gensound` för brusplaceholders; generatorn får bredd och sidor.
- **Klar när:** en bana med folk spelas av boten headless utan att fastna,
fler NPC:er ger mätbart längre tid, och röra/ljud styrs per bana.
### M9 – Navigeringslägen: lista och skyltläge
- **Mål:** de två sätten att spela story.
@@ -389,9 +418,9 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
### M10 – Story-innehåll och flerbytesbanor
- **Mål:** hela resan från flygplats till flygplats.
- Alla huvudbanor och sidobanor; banor med flera stopp och byten; buss;
stationer i flera våningar (M9a) och svårighetsinställningarna från M7
i stigande kombinationer.
- Alla huvudbanor och sidobanor; banor med flera stopp och byten; buss (med
vägrutor och hållplatser); stationer i flera våningar (M9a), folk och röra
(M9b) och svårighetsinställningarna från M7 i stigande kombinationer.
- Slutanimation (karaktärerna flyger iväg, items och poäng visas) och
eftertexter.
- Överstimulerande UI/banor som extra svårighet.
@@ -405,7 +434,8 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
### M12 – Ljud, polish och release
- Avgångsmelodier/ankomstjinglar, effekter, musik.
- Riktiga avgångsmelodier/ankomstjinglar (ersätter placeholders från M7b),
utrop, effekter, musik; mixning och volyminställningar.
- Inställningar (ljudnivåer, språk sv/en, skala, tangenter).
- Windows-test på riktig maskin, ikon i exe:n, eventuell Gitea-CI med
releaser enligt playbooken.