M7: svårighet, tid, poäng, debuffar, egna kort och sittplatsval
All checks were successful
release / build-release (push) Successful in 1m37s

- sim/stats.go: Stats (fart, törst, fokus, toalett, tur), debuffar som
  multiplikatorer, Profile som följer med mellan banor och räknar ned
- sim.Run: tidsgräns och maxantal missade tåg förlorar banan; poängformel
  (tid mot par, pengar, sällskapets mätare, utforskat, avdrag); debuffar
  tjänas av många steg, lång tid, tom matmätare och seedad otur vid
  kiosken; stats påverkar fart, mätartakter, läsning och hjälptid
- egna kort (individualCards): Member.Card, spärren kräver allas saldo och
  drar från alla, automaten frågar vems kort, biljetter köps åt alla
- sittplatsval (seatSelection): Ticket får ett sittplatssteg med seedade
  önskemål (fönster/gång/sida/bredvid); missnöjda ger mätar- och poängavdrag
- level: maxMissedTrains, individualCards, seatSelection; bana 003 Shibuya
  (svårighet 3, fyra i sällskapet) och 002 med tidsgräns och sittplatser;
  ordboken utökad; generatorn är spec-driven
- game: tid kvar/missade i HUD, debuffar i meny/HUD/resultat, poäng och
  förlustorsaker på resultatet, vyer för personval och vagn, skript-pick,
  flaggan -debuffs; HUD och resultat komprimerade för fyra i sällskapet
- plan (Björn 2026-10-24): flera våningar med trappor som M9a, egna kort
  och sittplatsval som svårighetsinställningar i M7 – i spelbeskrivning,
  roadmap, testplan
- docs/README/wiki med sittplatsbilden

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 10:18:17 +02:00
parent 9fc7e94074
commit b2995d4ca9
44 changed files with 1567 additions and 177 deletions

View File

@@ -1,21 +1,11 @@
{
"id": "002-shinjuku",
"name": {
"en": "Shinjuku Station",
"ja": "新宿駅",
"sv": "Shinjuku station"
},
"difficulty": 2,
"party": 3,
"ticketRequired": true,
"rideStops": 4,
"destination": {
"en": "Shibuya",
"ja": "渋谷",
"romaji": "Shibuya",
"sv": "Shibuya"
},
"timeLimitSec": 0,
"difficulty": 2,
"fareYen": 200,
"grid": [
"#################################",
@@ -23,7 +13,7 @@
"#.#.#.#.#.#.#######.#.#########.#",
"#.#W#.#.#.#.#.....#.#...........#",
"#.###.#.#.#.#####.#.###########.#",
"#.#...#.#.........#.#.......#...#",
"#.#...#.#..i......#.#.......#...#",
"#.#.###.###########.#.#.###.#.###",
"#.....#.......#...#.#.#.........#",
"#####.#######.#.#.#.#.#########.#",
@@ -35,14 +25,56 @@
"#.#.###.###.#.###.#.#.#######.#.#",
"#...#T#.#..i#.#.#...#.....#...#.#",
"#####.#.#.#.#.#.#####.#####.###.#",
"#.....#.#.#.#..i....#.......#...#",
"#.....#.#.#.#.......#.......#...#",
"#G#.#.#.#.#########.#########.#G#",
"#pG.#...#.....................#P#",
"#################################"
],
"id": "002-shinjuku",
"maxMissedTrains": 2,
"name": {
"en": "Shinjuku Station",
"ja": "新宿駅",
"sv": "Shinjuku station"
},
"party": 3,
"rideStops": 4,
"seatSelection": true,
"signs": [
{
"text": {
"en": "Shinjuku Station. Track 14 Yamanote Line for Shibuya: far bottom right. Track 8 Chuo Line for Tokyo: far bottom left.",
"ja": "新宿駅 14番線 山手線 渋谷方面 → 南東 8番線 中央線 東京方面 → 南西",
"sv": "Shinjuku station. Spår 14 Yamanote-linjen mot Shibuya: längst ner till höger. Spår 8 Chuo-linjen mot Tokyo: längst ner till vänster."
},
"x": 5,
"y": 1
},
{
"text": {
"en": "\u003c- Track 8 Chuo Line (Tokyo) Track 14 Yamanote Line (Shibuya) -\u003e",
"ja": "← 8番線 中央線 東京方面 14番線 山手線 渋谷方面 →",
"sv": "\u003c- Spår 8 Chuo-linjen (Tokyo) Spår 14 Yamanote-linjen (Shibuya) -\u003e"
},
"x": 11,
"y": 15
},
{
"text": {
"en": "Track 14 Yamanote Line for Shibuya: the gate in the south-east corner.",
"ja": "14番線 山手線 渋谷方面 → 南東口 改札",
"sv": "Spår 14 Yamanote-linjen mot Shibuya: spärren i sydöstra hörnet."
},
"x": 11,
"y": 5
}
],
"ticketRequired": true,
"timeLimitSec": 420,
"trains": [
{
"correct": true,
"crowded": true,
"destination": {
"en": "Shibuya",
"ja": "渋谷",
@@ -59,8 +91,7 @@
"intervalSec": 20,
"offsetSec": 3
},
"track": "14",
"crowded": true
"track": "14"
},
{
"correct": false,
@@ -82,34 +113,5 @@
},
"track": "8"
}
],
"signs": [
{
"text": {
"en": "Shinjuku Station. Track 14 Yamanote Line for Shibuya: far bottom right. Track 8 Chuo Line for Tokyo: far bottom left.",
"ja": "新宿駅 14番線 山手線 渋谷方面 → 南東 8番線 中央線 東京方面 → 南西",
"sv": "Shinjuku station. Spår 14 Yamanote-linjen mot Shibuya: längst ner till höger. Spår 8 Chuo-linjen mot Tokyo: längst ner till vänster."
},
"x": 5,
"y": 1
},
{
"text": {
"en": "<- Track 8 Chuo Line (Tokyo) Track 14 Yamanote Line (Shibuya) ->",
"ja": "← 8番線 中央線 東京方面 14番線 山手線 渋谷方面 →",
"sv": "<- Spår 8 Chuo-linjen (Tokyo) Spår 14 Yamanote-linjen (Shibuya) ->"
},
"x": 11,
"y": 15
},
{
"text": {
"en": "Track 14 Yamanote Line for Shibuya: the gate in the south-east corner.",
"ja": "14番線 山手線 渋谷方面 → 南東口 改札",
"sv": "Spår 14 Yamanote-linjen mot Shibuya: spärren i sydöstra hörnet."
},
"x": 15,
"y": 17
}
]
}
}

View File

@@ -0,0 +1,118 @@
{
"destination": {
"en": "Ikebukuro",
"ja": "池袋",
"romaji": "Ikebukuro",
"sv": "Ikebukuro"
},
"difficulty": 3,
"fareYen": 200,
"grid": [
"#################################",
"#S.........W#....i........#.....#",
"#.#####.#.###.###.#####.#.#.#####",
"#.#...#.#.....#...#.....#.#.....#",
"#.#.#.#.#######.###.#####.#.###.#",
"#.#.#.#.....#...#......i..#.#...#",
"#.#.#.#####.#.#.#.#####.#####.###",
"#...#.#...#...#.#.....#.#...#...#",
"#####.#.#.#####.#####.#.#.#.###.#",
"#T#...#.#...#K#.....#.#...#...#.#",
"#.#.###.###.#.#####.#.#######.#.#",
"#.#.#...#...#...#...#...#...#...#",
"#.#.#.#.#.#.#.###.#####.#.#.#####",
"#...#.#.#.#.#.....#...#...#..i..#",
"#.#####.#.#.#######.#.#######.#.#",
"#.....#.#.#.....#...#...#...#.#.#",
"#####.#.#.#####.#.#####.#.#.#.#.#",
"#...#...#.....#.#.#.#...#.#.#.#.#",
"#G#######.#####.#.#.#.###.#.#.#G#",
"#pG...............#.......#...GP#",
"#################################"
],
"id": "003-shibuya",
"individualCards": true,
"maxMissedTrains": 1,
"name": {
"en": "Shibuya Station",
"ja": "渋谷駅",
"sv": "Shibuya station"
},
"party": 4,
"rideStops": 5,
"seatSelection": true,
"signs": [
{
"text": {
"en": "Shibuya Station. Track 2 Yamanote Line for Ikebukuro: south-east. Track 4 Tokyu Toyoko Line for Yokohama: south-west. Tickets at the machine.",
"ja": "渋谷駅 2番線 山手線 池袋方面 → 南東 4番線 東急東横線 横浜方面 → 南西 切符 自動券売機",
"sv": "Shibuya station. Spår 2 Yamanote-linjen mot Ikebukuro: sydöst. Spår 4 Tokyu Toyoko-linjen mot Yokohama: sydväst. Biljetter i automaten."
},
"x": 17,
"y": 1
},
{
"text": {
"en": "\u003c- Track 4 Tokyu Toyoko Line (Yokohama) Track 2 Yamanote Line (Ikebukuro) -\u003e",
"ja": "← 4番線 東急東横線 横浜方面 2番線 山手線 池袋方面 →",
"sv": "\u003c- Spår 4 Tokyu Toyoko-linjen (Yokohama) Spår 2 Yamanote-linjen (Ikebukuro) -\u003e"
},
"x": 23,
"y": 5
},
{
"text": {
"en": "Track 2 Yamanote Line for Ikebukuro: the gate in the south-east corner. Everyone needs a ticket and card balance.",
"ja": "2番線 山手線 池袋方面 → 南東口 改札",
"sv": "Spår 2 Yamanote-linjen mot Ikebukuro: spärren i sydöstra hörnet. Alla behöver biljett och saldo på kortet."
},
"x": 29,
"y": 13
}
],
"ticketRequired": true,
"timeLimitSec": 360,
"trains": [
{
"correct": true,
"crowded": true,
"destination": {
"en": "Ikebukuro",
"ja": "池袋",
"romaji": "Ikebukuro"
},
"line": {
"en": "Yamanote Line",
"ja": "山手線",
"romaji": "Yamanote-sen"
},
"platform": "P",
"schedule": {
"dwellSec": 7,
"intervalSec": 25,
"offsetSec": 6
},
"track": "2"
},
{
"correct": false,
"destination": {
"en": "Yokohama",
"ja": "横浜",
"romaji": "Yokohama"
},
"line": {
"en": "Tokyu Toyoko Line",
"ja": "東急東横線",
"romaji": "Tokyu Toyoko-sen"
},
"platform": "p",
"schedule": {
"dwellSec": 8,
"intervalSec": 30,
"offsetSec": 12
},
"track": "4"
}
]
}

View File

@@ -91,5 +91,41 @@
"mini.crowd.title": "Crowded train - squeeze in",
"mini.crowd.hint": "Press Enter when the marker is in the green zone (%d tries left)",
"mini.ride.title": "On the train - next stop",
"mini.ride.hint": "Enter: get off here (you are going to %s)"
"mini.ride.hint": "Enter: get off here (you are going to %s)",
"hud.time_left": "Left",
"hud.debuffs": "Debuffs",
"hud.grumpy": "Someone is grumpy about their seat…",
"hud.poisoned": "That snack tasted odd…",
"hud.need_all_cards": "Gate: %s has no money on the card.",
"hud.need_all_tickets": "Gate: everyone needs a ticket.",
"result.lost_time_up": "Time ran out.",
"result.lost_missed_trains": "Too many missed trains.",
"result.score": "Score",
"result.money": "money",
"result.meters": "meters",
"result.new_debuffs": "New debuffs",
"mini.topup.member": "Whose card to top up?",
"mini.seat.hint": "Pick a seat for %s (arrows, Enter)",
"mini.seat.prefs": "Wishes:",
"seat.front": "← direction of travel",
"seat.window": "window",
"seat.aisle": "aisle",
"seat.left": "left side",
"seat.right": "right side",
"seat.with": "next to %s",
"debuff.sore_feet": "sore feet",
"debuff.tired": "tired",
"debuff.hangry": "hangry",
"debuff.food_poisoning": "food poisoning",
"debuff.doms": "sore muscles",
"debuff.blisters": "blisters",
"debuff.heavy_bag": "heavy bag",
"debuff.stuffed": "stuffed",
"debuff.sweaty": "sweaty and hot",
"hud.cash_short": "Cash",
"hud.missed_short": "Miss",
"result.penalty": "penalty",
"result.lang_points": "language points",
"result.missed_short": "Missed",
"result.map": "map"
}

View File

@@ -481,5 +481,55 @@
"sv": "Nippori",
"tier": 3,
"kind": "station"
},
"横浜": {
"kana": "よこはま",
"romaji": "Yokohama",
"en": "Yokohama",
"sv": "Yokohama",
"tier": 3,
"kind": "station"
},
"東急東横線": {
"kana": "とうきゅうとうよこせん",
"romaji": "Tokyu Toyoko-sen",
"en": "Tokyu Toyoko Line",
"sv": "Tokyu Toyoko-linjen",
"tier": 3
},
"渋谷駅": {
"kana": "しぶやえき",
"romaji": "Shibuya-eki",
"en": "Shibuya Station",
"sv": "Shibuya station",
"tier": 3
},
"北": {
"kana": "きた",
"romaji": "kita",
"en": "north",
"sv": "norr",
"tier": 2
},
"南": {
"kana": "みなみ",
"romaji": "minami",
"en": "south",
"sv": "söder",
"tier": 2
},
"東": {
"kana": "ひがし",
"romaji": "higashi",
"en": "east",
"sv": "öster",
"tier": 2
},
"西": {
"kana": "にし",
"romaji": "nishi",
"en": "west",
"sv": "väster",
"tier": 2
}
}

View File

@@ -91,5 +91,41 @@
"mini.crowd.title": "Fullt tåg - tränga sig på",
"mini.crowd.hint": "Tryck Enter när markören är i det gröna fältet (%d försök kvar)",
"mini.ride.title": "På tåget - nästa station",
"mini.ride.hint": "Enter: kliv av här (du ska till %s)"
"mini.ride.hint": "Enter: kliv av här (du ska till %s)",
"hud.time_left": "Kvar",
"hud.debuffs": "Debuffar",
"hud.grumpy": "Någon är sur över sittplatsen…",
"hud.poisoned": "Den där matbiten smakade konstigt…",
"hud.need_all_cards": "Spärren: %s har inte pengar på kortet.",
"hud.need_all_tickets": "Spärren: alla behöver en biljett.",
"result.lost_time_up": "Tiden tog slut.",
"result.lost_missed_trains": "För många missade tåg.",
"result.score": "Poäng",
"result.money": "pengar",
"result.meters": "mätare",
"result.new_debuffs": "Nya debuffar",
"mini.topup.member": "Vems kort ska fyllas på?",
"mini.seat.hint": "Välj plats åt %s (pilar, Enter)",
"mini.seat.prefs": "Önskemål:",
"seat.front": "← färdriktning",
"seat.window": "fönster",
"seat.aisle": "gången",
"seat.left": "vänster sida",
"seat.right": "höger sida",
"seat.with": "bredvid %s",
"debuff.sore_feet": "onda fötter",
"debuff.tired": "trötthet",
"debuff.hangry": "hunger/irritation",
"debuff.food_poisoning": "matförgiftning",
"debuff.doms": "träningsvärk",
"debuff.blisters": "skoskav",
"debuff.heavy_bag": "tungt köp",
"debuff.stuffed": "proppmätt",
"debuff.sweaty": "svettig och varm",
"hud.cash_short": "Kont",
"hud.missed_short": "Miss",
"result.penalty": "avdrag",
"result.lang_points": "språkpoäng",
"result.missed_short": "Missade",
"result.map": "karta"
}