M8: bankarta, skillträd, items, butik och sparfil

2026-10-24 11:24:15 +02:00
parent 51dab4c5f2
commit ecbf79b80a

51
Home.md

@@ -16,12 +16,16 @@ till rätt resmål.
| [`doc/roadmap.md`](../src/branch/master/doc/roadmap.md) | Teknikval, katalogstruktur, milstolpar M0–M12 | | [`doc/roadmap.md`](../src/branch/master/doc/roadmap.md) | Teknikval, katalogstruktur, milstolpar M0–M12 |
| [`doc/mal-och-tester.md`](../src/branch/master/doc/mal-och-tester.md) | Projektmål, teststrategi, checklistor | | [`doc/mal-och-tester.md`](../src/branch/master/doc/mal-och-tester.md) | Projektmål, teststrategi, checklistor |
## Så fungerar spelet (läget efter M7b) ## Så fungerar spelet (läget efter M8)
**Menyn** listar banorna i `resources/data/levels/` med resmål. Pilar/WASD **Bankartan** är ett spelbräde: huvudbanorna på en linje från flygplatsen,
väljer, Enter startar, Esc avslutar. Gamepad fungerar också. sidospåren som avstickare ovanför. Låsta banor är grå, klarade visar sina
stjärnor. Nästa huvudbana öppnas när föregående är klarad, sidospår när
föräldern är det. `⟳` betyder att banan återupptas med samma seed som när du
slutade. Pilar väljer, Enter startar; L ordlistan, T skillträdet, I
garderoben, P telefonen.
![Meny](/brasse/metro-puzzle-jp/raw/branch/master/doc/img/menu.png) ![Bankartan](/brasse/metro-puzzle-jp/raw/branch/master/doc/img/map.png)
**I banan** startar du på den gröna dörrmattan. Stationen är en labyrint: **I banan** startar du på den gröna dörrmattan. Stationen är en labyrint:
mörka väggar, ljust golv, skyltar (blå tavla på stolpe), biljettautomat mörka väggar, ljust golv, skyltar (blå tavla på stolpe), biljettautomat
@@ -148,9 +152,32 @@ av en tom matmätare och matförgiftning med liten otur vid kiosken. De
sänker farten, snabbar på mätarna eller gör skyltarna svårare att lära sig, sänker farten, snabbar på mätarna eller gör skyltarna svårare att lära sig,
och räknas ned en bana i taget. och räknas ned en bana i taget.
Resultatet visar tid mot par, stjärnor, utforskat, spenderat, missade tåg och Resultatet visar tid mot par, stjärnor, poäng, spenderat och missade tåg –
sällskapets försörjning. R spelar om, L öppnar ordlistan, Enter/Esc går till och vad banan gav: **XP**, nivå upp, nya items och vilka banor som öppnades.
menyn. R spelar om, L öppnar ordlistan, Enter/Esc går till kartan.
**Progression.** En klarad bana ger `poäng/10 + 25 × stjärnor` XP. Nivå n+1
nås vid 150·n(n+1)/2 XP och varje nivå ger en **skillpoäng** till
skillträdet (T): fyra grenar – språk (kana, fokus, hjälp), kropp (fart,
törst, toa), resenär (tur) och utforskare (sikt, landmärken på minikartan).
![Skillträdet](/brasse/metro-puzzle-jp/raw/branch/master/doc/img/skills.png)
**Items** köps kontant i kioskernas **butik** (B): hattar, masker, kläder,
skor och prylar med buffar, några med genvägar – JR Pass öppnar alla spärrar,
kartor avslöjar en bana, powerbanken håller telefonen vid liv. Ett item per
plats bärs (huvud, ansikte, kropp, fötter, väska); skins ändrar din färg.
Sidospår belönar unika skins. Det finns fler items än man har råd med på en
omgång – det är meningen.
![Butiken](/brasse/metro-puzzle-jp/raw/branch/master/doc/img/shop.png)
![Garderoben](/brasse/metro-puzzle-jp/raw/branch/master/doc/img/items.png)
**Sparfilen** ligger i `~/.config/metro-puzzle-jp/save.json` (Linux) eller
`%AppData%\metro-puzzle-jp\` (Windows) och sparas automatiskt vid banstart
(med seeden), efter varje bana och vid köp. Den har ett versionsfält så att
äldre filer kan migreras.
![Resultat](/brasse/metro-puzzle-jp/raw/branch/master/doc/img/result.png) ![Resultat](/brasse/metro-puzzle-jp/raw/branch/master/doc/img/result.png)
@@ -177,6 +204,8 @@ cmd/metro-puzzle-jp programstart, flaggor
internal/game Ebitengine: scener (meny → bana → resultat), rendering, input internal/game Ebitengine: scener (meny → bana → resultat), rendering, input
internal/sim ren spellogik: rörelse, kollision, kamera, banomgång (tåg, spärrar, plånbok, hjälp, stjärnor, minispel), sällskap, dimma/minikarta internal/sim ren spellogik: rörelse, kollision, kamera, banomgång (tåg, spärrar, plånbok, hjälp, stjärnor, minispel), sällskap, dimma/minikarta
internal/minigame påfyllning, biljettköp, trängsel, tågresa – seedade tillståndsmaskiner internal/minigame påfyllning, biljettköp, trängsel, tågresa – seedade tillståndsmaskiner
internal/progress XP, skillträd, items, banresultat, upplåsning av bankartan
internal/save sparfil: versionerad JSON, migrering, atomisk skrivning
internal/lang japanska: ordbok, tokenisering, kunskap, delvis översättning, engelska-andel internal/lang japanska: ordbok, tokenisering, kunskap, delvis översättning, engelska-andel
internal/level banformat (JSON), validering, BFS-lösbarhet internal/level banformat (JSON), validering, BFS-lösbarhet
internal/res hittar resources/ (env → bredvid binären → uppåt från cwd) internal/res hittar resources/ (env → bredvid binären → uppåt från cwd)
@@ -218,6 +247,14 @@ resources/ sprites/ sound/ text/ data/ – skeppas bredvid binäre
gemensamt gränssnitt (Update/Done/Success) och all slump från del-seeds. gemensamt gränssnitt (Update/Done/Success) och all slump från del-seeds.
Därför kan hela bana 002 – fel biljett, rätt biljett, spärr, trängsel, Därför kan hela bana 002 – fel biljett, rätt biljett, spärr, trängsel,
resa – spelas igenom i ett vanligt `go test`. resa – spelas igenom i ett vanligt `go test`.
- **Progressionen är data.** Skills och items är JSON-rader med en
`effect` som antingen multiplicerar en stat eller sätter en flagga; samma
tabell gäller debuffar åt andra hållet. Nya items/skills = nya rader, inga
kodändringar. Designregeln "knappt 33 % per omgång" är ett test mot
itemlistan.
- **Sparfilen skrivs atomiskt** (tempfil + byte av namn) och har version +
migrering från dag ett, så att vi kan ändra formatet utan att förstöra
någons spel.
- **Tågets liv är sex faser ur tidtabellen** (away, approaching, arriving, - **Tågets liv är sex faser ur tidtabellen** (away, approaching, arriving,
dwelling, closing, leaving), beräknade i `level` utan tillstånd. Animation, dwelling, closing, leaving), beräknade i `level` utan tillstånd. Animation,
ljud, vind och indikator i spelet läser bara av fasen – och boten i ljud, vind och indikator i spelet läser bara av fasen – och boten i