M9a: stationer i flera våningar med trappor
All checks were successful
release / build-release (push) Successful in 1m34s

- level: Point har Z; banor kan ha floors (lika stora rutnät med namn),
  gamla grid-banor läses som en våning; trappor U/D på samma x,y en våning
  upp/ner valideras parvis; Neighbors ger grannar över våningar så att
  Path, lösbarhet, spärregel och Unreachable fungerar; skyltar har z
- sim: att kliva på en trappa flyttar spelaren till andra änden
  (FloorChanges); dimman är per våning och avslöjar trappans andra ände;
  tåg hörs/syns bara på egen våning
- game: bara spelarens våning ritas (följare på andra våningar döljs),
  HUD och minikarta visar våningens namn, trappgrafik i genart och färg på
  minikartan
- bana 004 Tokyo (svårighet 3, tre i sällskapet): start under mark på B1,
  trappa upp till 1F med perronger; generatorn gör våningar med trappor
  som flaskhalsar; ordboken utökad
- testbotar och tools/shots förstår trappor; två våningsbilder
- docs/README/wiki uppdaterade

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 11:54:07 +02:00
parent ef6cfaccc8
commit 8fca14e42d
23 changed files with 704 additions and 152 deletions

View File

@@ -401,22 +401,32 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
- **Klar när:** sparfil round-trip-test grön; "< 33 %" kontrolleras mot
itemlistan; skillkrav, upplåsningar och belöningar testade. ✓
### M9a – Flera våningar (Björns tillägg 2026-10-24)
### M9a – Flera våningar ✓ (klar 2026-10-24)
- **Mål:** stationer i flera plan – ännu en svårighetsvariabel.
- Banformatet får **flera rutnät** (`floors`), ett per våning, med
**trappor** (och rulltrappor/hissar) som kopplar en ruta på en våning
till en ruta på en annan. Start kan ligga på en trappa upp eller ner:
under mark, ovan mark eller marknivå.
- Kamera, dimma, minikarta (en flik per våning eller stapel) och BFS-vägar
(`level.Path`, lösbarhetstestet, botarna) blir våningsmedvetna; skyltar
kan peka "↑ 2F / ↓ B1".
- **Teknik:** `level.Level.Floors []Grid` med `Stairs []Link`, `Point`
får `Z`; `sim.Mover` byter våning vid trappa; `tools/genart` får
trappruta; generatorn placerar trappor som flaskhalsar.
- **Klar när:** en bana med två våningar går att klara av boten headless,
minikartan visar rätt våning, och alla gamla banor fungerar oförändrat
(en våning).
- **Banformat:** `floors: [{name, grid}, …]` med lika stora rutnät; gamla
banor med `grid` läses som en våning ("1F"). Rutkoordinaten `Point` fick
`Z`. **Trappor** är rutor: `U` (upp) på en våning kräver `D` (ner) på
samma x,y en våning upp och tvärtom (valideras). Går man in på en trappa
hamnar man i andra änden i samma steg. Skyltar har `z`.
- **Logik:** `Neighbors` ger grannarna inkl. trappans andra ände, så
`Path`, lösbarhetstestet, spärregeln och `Unreachable` fungerar över
våningar. Dimman är per våning och avslöjar trappans andra ände. Man
ser/hör bara tågen på sin egen våning.
- **Spel:** bara spelarens våning ritas (följare på andra våningar syns
inte förrän de kommer upp), HUD och minikartan visar våningens namn,
trappor har egen grafik och färg på minikartan.
- **Bana 004 Tokyo** (svårighet 3, tre i sällskapet): start under mark på
B1 (Marunouchi-linjen), trappan upp till 1F där perronger, spärrar,
automat, kiosk och toalett finns. Generatorn gör våningar: labyrint per
våning, trappor på gemensamma öppna rutor nära mitten, start på en våning
och perronger på en annan.
- **Teknik:** `level` (Storey, Point.Z, Neighbors, FloorAt), `sim.Run`
(trappbyte, FloorChanges), `sim.Fog` 3D, spelet ritar per våning;
testbotarna och `tools/shots` förstår trappor.
- **Klar när:** en bana med två våningar går att klara av boten headless
(`TestStairsMoveBetweenFloors`, `TestFloorsStairsAndPaths`), 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)