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

BIN
doc/img/floors-1f.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
doc/img/floors-b1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -34,7 +34,7 @@ att bygga på Linux som på Windows.
| Inkrementellt debug-bygge | < 10 s | 4,7 s |
| Release-binär | < 20 MB | 10,2 MB (Linux), 10,8 MB (Windows) |
| Testsviten | `go test ./...` grön på < 30 s | ~0,1 s |
| Banor | 100 % passerar det automatiska lösbarhetstestet | 4 av 4 |
| Banor | 100 % passerar det automatiska lösbarhetstestet | 5 av 5 |
| Windows-korsbygge från Linux | fungerar utan extra verktyg | ✓ (CGO_ENABLED=0) |
| Linux-binärens länkade bibliotek | bara libc | ✓ (GL/X11 laddas dynamiskt vid körning) |
| Bildfrekvens | 60 fps vid 4× skala på integrerad grafik | ej mätt |
@@ -124,6 +124,8 @@ att bygga på Linux som på Windows.
| `internal/save` | `TestRoundTrip`, `TestCorruptAndFutureVersions`, `TestDefaultPath` | Skriv → läs ger samma tillstånd inkl. seed; trasig/nyare fil ger fel; version 0 migreras |
| `internal/sim` | `TestRunOptionsFromProgression` | Extra stats, sikt, landmärken, gratis spärrar, hela kartan, powerbank |
| `internal/minigame` | `TestCrowdLuckWidensZone` | Tur gör zonen bredare, otur smalare, klampat |
| `internal/level` | `TestFloorsStairsAndPaths`, `TestFloorsValidation` | **M9a:** flera våningar läses, trappor länkar, BFS-vägen byter våning bara via trappa, spärregeln och skyltar per våning; trappa utan motpart, olika storlekar, grid+floors och fel våning avvisas |
| `internal/sim` | `TestStairsMoveBetweenFloors` | Att kliva på trappan flyttar spelaren en våning, dimman lättar runt andra änden, perrongen hörs bara på egen våning, boten går hela vägen över våningar |
| `internal/archtest` | `TestOnlyPresentationPackagesImportEbitengine` | Beroenderegeln ovan |
### Planerade tester per milstolpe
@@ -140,7 +142,7 @@ att bygga på Linux som på Windows.
| ~~M7b Tåg som kommer och går~~ ✓ | Faser, ombordstigning, indikatoravstånd – finns, se tabellen ovan; ljud och animation verifieras manuellt/med skärmdumpar |
| M9b Folk, reklam, ljudröra | NPC:er följer seedade mål utan att fastna; krock saktar ned; fel sida i gång bromsar; bot klarar bana med folk; fler NPC:er = längre tid; clutter/noise läses per bana |
| ~~M8 Progression & sparfil~~ ✓ | Round-trip, skillkrav, upplåsningar, 33 %-regeln – finns, se tabellen ovan |
| M9a Flera våningar | Trappa byter våning för Mover och följare; `Path` över våningar; lösbarhetstest med trappor; dimma/minikarta per våning; gamla banor = en våning |
| ~~M9a Flera våningar~~ ✓ | Trappor, vägar över våningar, dimma per våning, gamla banor oförändrade – finns, se tabellen ovan |
| M9 Navigeringslägen | Listläge genererar rätt ordning av tåg; skyltläge: 1–4 giltiga vägar; fel-riktnings-förlust triggar vid rätt slutstation |
| M10 Story-innehåll | Alla banor lösbara (redan automatiskt); flerbytesbanor har sammanhängande byten; sista banan slutar på flygplatsen |
| M11 Oändligt läge & NG+ | Målsekvens deterministisk per seed; NG+ behåller skills men nollställer items |

View File

@@ -34,7 +34,7 @@ brasse-linux01-runnern, inte Pi5:n.
M0 skelett ✓ → M1 rörelse/kamera ✓ → M2 tåg/spärrar/vinst ✓ → M3 japanska/skyltar ✓
→ M4 lämmeltåget ✓ → M5 minikarta ✓ → M6 kort/biljetter/minispel ✓ → M7
svårighet/poäng/debuffar ✓ → M7b tåg som kommer och går ✓ → M8 progression/sparfiler ✓ → M9a flera våningar → M9b folk/reklam/ljudröra → M9 navigeringslägen →
svårighet/poäng/debuffar ✓ → M7b tåg som kommer och går ✓ → M8 progression/sparfiler ✓ → M9a flera våningar ✓ → M9b folk/reklam/ljudröra → M9 navigeringslägen →
M10 story-innehåll → M11 oändligt läge/NG+ → M12 ljud/polish/release.
Innehåll per milstolpe: [roadmap.md › Milstolpar](roadmap.md#milstolpar).
Vad som ska vara testat per milstolpe: [mal-och-tester.md](mal-och-tester.md).

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)