M0: skelett, byggkedja och dokumentation för JP Subway Pussel

- Go 1.27 + Ebitengine v2.10, intern upplösning 320x180 med heltalsskalning
- internal/res (resursuppslag), internal/rng (seedad slump), internal/level
  (banformat, validering, BFS-lösbarhet) med tester; internal/archtest
  kontrollerar att bara presentationslagret beror på Ebitengine
- tools/build: debug -> build/debug/, release -> build/release/<os>-<arch>/
  med resources/ bredvid binären; Windows korsbyggs utan C-verktyg
- VS Code tasks (build/test/release) och launch (dlv)
- Första banan 001-flygplatsen, sv/en-texter, skyltordbok, placeholder-sprite
- doc/: spelbeskrivning (renskriven), mål och tester, roadmap med teknikval
  (M0–M12), plan.md; README med bygg- och beroendeinformation

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 18:52:10 +02:00
commit c1f9546af6
32 changed files with 2165 additions and 0 deletions

22
resources/data/README.md Normal file
View File

@@ -0,0 +1,22 @@
# resources/data – speldata
Banor, items, skills och annan data som spelet läser vid start. Allt är JSON.
- `levels/<id>.json` – en bana per fil. `id` i filen **måste** vara lika med
filnamnet utan `.json`. Testet `internal/level.TestAllShippedLevels` kör
igenom alla banor här och faller om någon inte parsar eller inte går att klara.
## Rutnätets tecken
| Tecken | Betydelse |
|--------|-----------|
| `#` | vägg |
| `.` | golv |
| `S` | start (exakt en) |
| `P` | perrong med tåg |
| `p` | perrong med fel tåg |
| `G` | spärr (kräver kort/biljett) |
| `T` | biljett-/påfyllningsautomat |
| `i` | skylt |
Varje rad måste vara lika lång. Se `internal/level/level.go` för formatet.

View File

@@ -0,0 +1,35 @@
{
"id": "001-flygplatsen",
"name": { "sv": "Flygplatsen", "en": "The Airport", "ja": "空港" },
"difficulty": 1,
"destination": { "ja": "新宿", "romaji": "Shinjuku", "sv": "Shinjuku", "en": "Shinjuku" },
"timeLimitSec": 0,
"grid": [
"####################",
"#S.....#.....i.....#",
"#.###.##.###.#.###.#",
"#...#....#...#...#.#",
"###.######.#####.#.#",
"#...#....#.....#.#.#",
"#.###.##.#####.#.#.#",
"#.....#T.......#...#",
"#.#####.#########.##",
"#....GG......i..GG.#",
"#..p.....##......P.#",
"####################"
],
"trains": [
{
"platform": "P",
"line": { "ja": "成田エクスプレス", "romaji": "Narita Ekusupuresu", "en": "Narita Express" },
"destination": { "ja": "新宿", "romaji": "Shinjuku", "en": "Shinjuku" },
"correct": true
},
{
"platform": "p",
"line": { "ja": "京成本線", "romaji": "Keisei Honsen", "en": "Keisei Main Line" },
"destination": { "ja": "京成上野", "romaji": "Keisei-Ueno", "en": "Keisei-Ueno" },
"correct": false
}
]
}