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>
This commit is contained in:
2026-10-24 11:29:30 +02:00
parent d466333f01
commit 915c684dc2
46 changed files with 3058 additions and 316 deletions

View File

@@ -0,0 +1,122 @@
{
"destination": {
"en": "Shinjuku",
"ja": "新宿",
"romaji": "Shinjuku",
"sv": "Shinjuku"
},
"difficulty": 2,
"fareYen": 200,
"grid": [
"#################################",
"#S....#....K#.....#.............#",
"#.###.#.#####.###.#.#.#########.#",
"#...#.#.........#.#.#.....#.....#",
"#.###.###########.#.#####.#######",
"#...#.#.....#...#.#.....#.#.....#",
"#.#.#.#.###.#.#.#.#.#####.#.###.#",
"#.#...#.#T....#.#.#.#...#.....#.#",
"#.#.###.#######.#.#.#.#.#####.#.#",
"#.#....i......#.#...#.#.....#.#.#",
"#.#####.#####.#.#####.#####.#.#.#",
"#.....#....W#.#.....#.#...#.#.#.#",
"#####.###.###.#####.#.#.#.#.###.#",
"#...#.#...#...#...#.#.#.#...#...#",
"#.#.#.###.#.###.#.#.#.#.#####.###",
"#.#.#...#.#.#.....#.#.#...#.....#",
"#.#.###.#.#.#.#####.#.###.#.#.#.#",
"#.#i..#.#.#.#.#...#...#...#...#.#",
"#G#.#.#.###.#.#.#.#####.#######G#",
"#pG.#.......#...#......i......GP#",
"#################################"
],
"id": "002b-kabukicho",
"kind": "side",
"name": {
"en": "Kabukicho exit",
"ja": "歌舞伎町",
"sv": "Kabukicho-utgången"
},
"order": 2,
"parent": "002-shinjuku",
"party": 2,
"rewards": {
"items": [
"skin_kimono"
],
"skillPoints": 1
},
"rideStops": 3,
"signs": [
{
"text": {
"en": "Side trip: Kabukicho. Back to Shinjuku on the Yamanote Line, track 1 south-east. The Chuo Line goes the wrong way.",
"ja": "歌舞伎町 1番線 山手線 新宿方面 → 南東 3番線 中央線 東京方面",
"sv": "Sidospår: Kabukicho. Tillbaka till Shinjuku med Yamanote-linjen, spår 1 i sydost. Chuo-linjen går åt fel håll."
},
"x": 7,
"y": 9
},
{
"text": {
"en": "\u003c- Track 3 Chuo Line (Tokyo) Track 1 Yamanote Line (Shinjuku) -\u003e",
"ja": "← 3番線 中央線 東京方面 1番線 山手線 新宿方面 →",
"sv": "\u003c- Spår 3 Chuo-linjen (Tokyo) Spår 1 Yamanote-linjen (Shinjuku) -\u003e"
},
"x": 3,
"y": 17
},
{
"text": {
"en": "Track 1 Yamanote Line: the gate in the south-east corner.",
"ja": "1番線 山手線 新宿方面 → 南東口 改札",
"sv": "Spår 1 Yamanote-linjen: spärren i sydöstra hörnet."
},
"x": 23,
"y": 19
}
],
"timeLimitSec": 240,
"trains": [
{
"correct": true,
"destination": {
"en": "Shinjuku",
"ja": "新宿",
"romaji": "Shinjuku"
},
"line": {
"en": "Yamanote Line",
"ja": "山手線",
"romaji": "Yamanote-sen"
},
"platform": "P",
"schedule": {
"dwellSec": 7,
"intervalSec": 22,
"offsetSec": 4
},
"track": "1"
},
{
"correct": false,
"destination": {
"en": "Tokyo",
"ja": "東京",
"romaji": "Tokyo"
},
"line": {
"en": "Chuo Line",
"ja": "中央線",
"romaji": "Chuo-sen"
},
"platform": "p",
"schedule": {
"dwellSec": 7,
"intervalSec": 26,
"offsetSec": 9
},
"track": "3"
}
]
}