M8: progression, items, bankarta och sparfil
All checks were successful
release / build-release (push) Successful in 1m46s
- internal/progress: katalog (skills.json 12 noder, items.json 25 items) med validering; XP/nivåer (150·n(n+1)/2) och skillpoäng; skillträd med krav och kostnad; items per plats med buffar, genvägar (JR Pass, kartor, powerbank) och färgton; banresultat och upplåsning (huvudbanor i ordning, sidospår efter föräldern); 33 %-regeln som test - internal/save: versionerad JSON med kunskap, plånbok, debuffar, progression och pågående bana + seed; atomisk skrivning; migrering; ~/.config/metro-puzzle-jp/save.json resp. %AppData% - sim: RunOptions får Extra/FogRadius/Landmarks/FreeGates/RevealAll/ InfiniteBattery; luck påverkar trängselzonen; Fog.RevealAll och extra landmärken - game: bankarta i spelbrädesstil ersätter menyn (⟳ återupptar med sparad seed), skillträd (T), garderob (I), butik i kiosken (B), XP/nivå/items/ upplåsningar på resultatet, spelaren tonas av skins; autospar vid banstart, efter banan och vid köp; flaggor -save/-nosave - level: kind/order/parent/rewards/shop; ny sidobana 002b Kabukicho som belönar skinnet Kimono; 001 belönar Salaryman-skinnet; butikssortiment på 002/003 - tools/shots: demo-sparfil (build/, aldrig den riktiga), bilder av karta, skills, garderob och butik; alla körningar med -nosave - docs/README/wiki uppdaterade Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
BIN
doc/img/items.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
doc/img/map.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
doc/img/menu.png
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
BIN
doc/img/ride.png
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 20 KiB |
BIN
doc/img/shop.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
doc/img/skills.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
@@ -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 | 3 av 3 |
|
||||
| Banor | 100 % passerar det automatiska lösbarhetstestet | 4 av 4 |
|
||||
| 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 |
|
||||
@@ -118,6 +118,12 @@ att bygga på Linux som på Windows.
|
||||
| `internal/minigame` | `TestTopUpPicksMemberWithIndividualCards`, `TestSeatSelectionPreferences` | Personval och 2×2-rutnät; seedade önskemål, upptagna platser, missnöje, fönster/gång/sida/bredvid, Esc avbryter köpet |
|
||||
| `internal/level` | `TestSchedulePhases`, `TestScheduleValidationForPhases`, `TestTrackTile` | **M7b:** faserna away→approaching→arriving→dwelling→closing→leaving ur tidtabellen, ombordstigning bara med öppna dörrar, Status och Phase konsekventa; för korta uppehåll/borta-tider avvisas; rälsrutan |
|
||||
| `internal/sim` | `TestNearTrackAndPhases` | Närmaste perrong inom två rutor, inte tre; under inrullningen syns tåget men man kan inte kliva på; med öppna dörrar kan man |
|
||||
| `internal/progress` | `TestShippedCatalogAndThirdRule`, `TestCatalogValidation` | **M8:** katalogerna parsar och validerar; **billigaste tredjedelen av items kostar mer än startkassan**; banornas belöningar/butiker pekar på riktiga items |
|
||||
| `internal/progress` | `TestXPLevelsAndSkillPoints`, `TestSkillTreeRequirementsAndCost` | Nivåtrösklar, skillpoäng per level-up, krav och kostnad, effekter multipliceras |
|
||||
| `internal/progress` | `TestItemsBuyEquipAndEffects`, `TestLevelRecordsAndUnlocking` | Köp, bär/ta av, en per plats, tint, genvägar; bästa resultat behålls, upplåsning av huvud- och sidobanor |
|
||||
| `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/archtest` | `TestOnlyPresentationPackagesImportEbitengine` | Beroenderegeln ovan |
|
||||
|
||||
### Planerade tester per milstolpe
|
||||
@@ -133,7 +139,7 @@ att bygga på Linux som på Windows.
|
||||
| ~~M7 Svårighet/poäng/debuffs~~ ✓ | Poäng, tidsgräns, debuffar, egna kort, sittplatsval – finns, se tabellen ovan |
|
||||
| ~~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 | Sparfil round-trip (skriv → läs ger samma tillstånd inkl. seed); skill tree-krav; upplåsningar efter rätt bana; "< 33 %"-regeln kontrolleras mot itemlistan |
|
||||
| ~~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 |
|
||||
| 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 |
|
||||
|
||||
@@ -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).
|
||||
@@ -62,5 +62,7 @@ Vad som ska vara testat per milstolpe: [mal-och-tester.md](mal-och-tester.md).
|
||||
- ~~Hur lär man sig ord utöver hjälp?~~ – beslutat av Björn 2026-10-23:
|
||||
bra resultat lär resmålet, läsning ger seedade framsteg, språkpoäng på
|
||||
valfria ord i ordlistan. Implementerat; trädet (M8) bygger vidare på listan.
|
||||
- Ska Oändligt läge dela sparfil med story eller ha egen?
|
||||
- Ska Oändligt läge dela sparfil med story eller ha egen? (Sparfilen har
|
||||
nu ett versionsfält och `Current`-referens; oändligt läge kan få en egen
|
||||
sektion i samma fil.)
|
||||
- Hur många huvudbanor siktar vi på i storyn? (Påverkar M10:s omfattning.)
|
||||
|
||||
@@ -61,6 +61,8 @@ metro-puzzle-jp/
|
||||
│ ├── sim/ rutbaserad rörelse, kollision, kamera, banomgång (Run), sällskap (Party), dimma (Fog) – ren Go
|
||||
│ ├── lang/ ordbok, tokenisering, kunskap, delvis översättning, engelska-andel, hjälptid – ren Go
|
||||
│ ├── minigame/ påfyllning, biljettköp, trängsel, tågresa – seedade, ren Go
|
||||
│ ├── progress/ XP, skillträd, items, banresultat, upplåsning – ren Go
|
||||
│ ├── save/ sparfil: versionerad JSON, migrering, atomisk skrivning
|
||||
│ ├── game/ Ebitengine-loop, scener, input, rendering, skriptläge ← får använda Ebitengine
|
||||
│ ├── archtest/ beroenderegler
|
||||
│ └── … kommande: lang/, nav/, score/, save/, minigame/, ui/, audio/
|
||||
@@ -71,7 +73,7 @@ metro-puzzle-jp/
|
||||
│ ├── sprites/ bilder, tilesets, UI
|
||||
│ ├── sound/ OGG/WAV
|
||||
│ ├── text/ sv.json, en.json, jp-dictionary.json, fonts/PixelMplus*.ttf
|
||||
│ └── data/ levels/, items, skills (JSON)
|
||||
│ └── data/ levels/, items.json, skills.json
|
||||
├── doc/ denna dokumentation (doc/img/ = skärmdumpar från tools/shots)
|
||||
├── .gitea/workflows/ CI: test + release-zippar för linux/windows på brasse-linux01-runnern
|
||||
├── .vscode/ tasks.json, launch.json
|
||||
@@ -355,18 +357,40 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n.
|
||||
- **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
|
||||
### M8 – Progression, items och sparfiler ✓ (klar 2026-10-24)
|
||||
|
||||
- **Mål:** något att låsa upp och en anledning att fortsätta.
|
||||
- XP/level-ups, skill tree, items (kläder, masker, hattar) med buffar.
|
||||
- Bankarta i spelbrädesstil; sidobanor som ger skins/powers/items; items
|
||||
som låser upp genvägar i huvudbanor.
|
||||
- Sparfil med framsteg, items, skills, debuffar och seed. Autospar vid
|
||||
banstart.
|
||||
- **Teknik:** `internal/save` (JSON, versionsfält för migrering),
|
||||
`resources/data/items.json`, `skills.json`.
|
||||
- **Klar när:** sparfil round-trip-test grön; "< 33 % per omgång" går att
|
||||
räkna ut från datan.
|
||||
- **XP och nivåer:** en klarad bana ger `poäng/10 + 25 × stjärnor` XP;
|
||||
nivå n+1 nås vid 150·n(n+1)/2 XP (150, 450, 900 …). Varje level-up ger
|
||||
en **skillpoäng**.
|
||||
- **Skillträd** (`resources/data/skills.json`, 12 noder i fyra grenar:
|
||||
språk, kropp, resenär, utforskare): kana, fokus, hjälp, fart, törst, toa,
|
||||
tur, sikt, landmärken. Krav och kostnad valideras; effekterna är
|
||||
stats-multiplikatorer plus flaggor. Språkpoängen på ord (M3) finns kvar
|
||||
som egen valuta.
|
||||
- **Items** (`resources/data/items.json`, 25 st: hattar, masker, kläder,
|
||||
skor, prylar, skins) med buffar, färgton på spelaren och genvägar:
|
||||
JR Pass (gratis spärrar), kartor (hela minikartan på en bana), powerbank
|
||||
(oändligt batteri). Ett item per plats (huvud, ansikte, kropp, fötter,
|
||||
väska). Köps kontant i **kioskens butik** (B) – banans sortiment eller ett
|
||||
seedat urval. Designregeln "knappt 33 % per omgång" är ett test:
|
||||
billigaste tredjedelen kostar mer än startkassan.
|
||||
- **Bankartan** i spelbrädesstil ersätter menyn: huvudbanorna på en linje,
|
||||
sidospår ovanför, låsta grå, klarade med stjärnor; nästa huvudbana öppnas
|
||||
när föregående är klarad, sidospår när föräldern är. Ny sidobana
|
||||
**002b Kabukicho** belönar skinnet Kimono och en skillpoäng.
|
||||
- **Sparfil** (`internal/save`): versionerad JSON med kunskap, plånbok,
|
||||
debuffar, progression och pågående bana + seed, atomisk skrivning,
|
||||
migrering av äldre filer. `~/.config/metro-puzzle-jp/save.json` på Linux,
|
||||
`%AppData%` på Windows. Autospar vid banstart (seeden), efter banan och
|
||||
vid köp/upplåsningar. `⟳` på kartan betyder att banan återupptas med samma
|
||||
slump. Flaggor `-save PATH`, `-nosave`.
|
||||
- **Teknik:** `internal/progress` (ren Go, 6 tester), `internal/save`
|
||||
(3 tester), `sim.RunOptions` får Extra/FogRadius/Landmarks/FreeGates/
|
||||
RevealAll/InfiniteBattery, luck påverkar trängselzonen, nya scener
|
||||
karta/skills/garderob och butiken i `internal/game`.
|
||||
- **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)
|
||||
|
||||
|
||||