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

239
resources/data/skills.json Normal file
View File

@@ -0,0 +1,239 @@
{
"_comment": "Språkträdet/skill tree. cost = skillpoäng (1 per level-up). requires = id:n som måste vara upplåsta. effect: stats (multiplikatorer: speed/thirst/focus/toilet/luck), kana, fogRadius (+rutor), landmarks (toaletter/kiosker/automater syns alltid på minikartan).",
"skills": [
{
"id": "kana",
"branch": "språk",
"name": {
"sv": "Kana",
"en": "Kana"
},
"desc": {
"sv": "Du kan läsa hiragana och katakana – alla kana-ord visas som romaji.",
"en": "You can read hiragana and katakana – kana words show as romaji."
},
"cost": 2,
"requires": [],
"effect": {
"kana": true
}
},
{
"id": "focus1",
"branch": "språk",
"name": {
"sv": "Skarp blick",
"en": "Sharp eye"
},
"desc": {
"sv": "+25 % chans att lära ord av skyltar, snabbare hjälp.",
"en": "+25% chance to learn words from signs, faster help."
},
"cost": 1,
"requires": [],
"effect": {
"stats": {
"focus": 1.25
}
}
},
{
"id": "focus2",
"branch": "språk",
"name": {
"sv": "Fotografiskt minne",
"en": "Photographic memory"
},
"desc": {
"sv": "Ytterligare +25 % fokus.",
"en": "Another +25% focus."
},
"cost": 2,
"requires": [
"focus1"
],
"effect": {
"stats": {
"focus": 1.25
}
}
},
{
"id": "polite",
"branch": "språk",
"name": {
"sv": "Sumimasen!",
"en": "Sumimasen!"
},
"desc": {
"sv": "Folk hjälper dig gärna: hjälpen går dubbelt så fort.",
"en": "People like helping you: help takes half the time."
},
"cost": 1,
"requires": [
"focus1"
],
"effect": {
"stats": {
"focus": 1.5
}
}
},
{
"id": "legs1",
"branch": "kropp",
"name": {
"sv": "Snabba fötter",
"en": "Quick feet"
},
"desc": {
"sv": "+10 % gångfart.",
"en": "+10% walking speed."
},
"cost": 1,
"requires": [],
"effect": {
"stats": {
"speed": 1.1
}
}
},
{
"id": "legs2",
"branch": "kropp",
"name": {
"sv": "Pendlarsteg",
"en": "Commuter stride"
},
"desc": {
"sv": "Ytterligare +10 % gångfart.",
"en": "Another +10% speed."
},
"cost": 2,
"requires": [
"legs1"
],
"effect": {
"stats": {
"speed": 1.1
}
}
},
{
"id": "camel",
"branch": "kropp",
"name": {
"sv": "Kamel",
"en": "Camel"
},
"desc": {
"sv": "Törsten kommer 25 % långsammare.",
"en": "Thirst builds 25% slower."
},
"cost": 1,
"requires": [],
"effect": {
"stats": {
"thirst": 0.75
}
}
},
{
"id": "bladder",
"branch": "kropp",
"name": {
"sv": "Stålblåsa",
"en": "Steel bladder"
},
"desc": {
"sv": "Toamätaren sjunker 25 % långsammare.",
"en": "Toilet meter drops 25% slower."
},
"cost": 1,
"requires": [
"camel"
],
"effect": {
"stats": {
"toilet": 0.75
}
}
},
{
"id": "lucky",
"branch": "resenär",
"name": {
"sv": "Omikuji",
"en": "Omikuji"
},
"desc": {
"sv": "+30 % tur: färre omskanningar, lättare att få plats, färre matförgiftningar.",
"en": "+30% luck: fewer rescans, easier to squeeze in, fewer food poisonings."
},
"cost": 1,
"requires": [],
"effect": {
"stats": {
"luck": 1.3
}
}
},
{
"id": "commuter",
"branch": "resenär",
"name": {
"sv": "Rusningsvan",
"en": "Rush-hour pro"
},
"desc": {
"sv": "Ytterligare +30 % tur.",
"en": "Another +30% luck."
},
"cost": 2,
"requires": [
"lucky"
],
"effect": {
"stats": {
"luck": 1.3
}
}
},
{
"id": "scout",
"branch": "utforskare",
"name": {
"sv": "Spanare",
"en": "Scout"
},
"desc": {
"sv": "Du ser ett steg längre i gångarna.",
"en": "You see one step further down the corridors."
},
"cost": 1,
"requires": [],
"effect": {
"fogRadius": 1
}
},
{
"id": "local",
"branch": "utforskare",
"name": {
"sv": "Lokalkännedom",
"en": "Local knowledge"
},
"desc": {
"sv": "Toaletter, kiosker och automater syns alltid på minikartan.",
"en": "Toilets, kiosks and machines always show on the minimap."
},
"cost": 2,
"requires": [
"scout"
],
"effect": {
"landmarks": true
}
}
]
}