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

View File

@@ -0,0 +1,42 @@
// jp-subway-pussel – pixel art-pussel om att hitta rätt tåg på japanska stationer.
package main
import (
"flag"
"fmt"
"log"
"os"
"github.com/hajimehoshi/ebiten/v2"
"gitea.brasse-pc.eu/brasse/jp-subway-pussel/internal/buildinfo"
"gitea.brasse-pc.eu/brasse/jp-subway-pussel/internal/game"
)
func main() {
levelID := flag.String("level", "001-flygplatsen", "bana att starta (id = filnamn utan .json)")
scale := flag.Int("scale", 4, "fönsterskala (intern upplösning 320x180 × skala)")
smoke := flag.Int("smoke", 0, "avsluta automatiskt efter N bildrutor (smoke-test)")
version := flag.Bool("version", false, "skriv ut version och avsluta")
flag.Parse()
if *version {
fmt.Printf("jp-subway-pussel %s (%s)\n", buildinfo.Version, buildinfo.Mode)
return
}
g, err := game.New(game.Options{LevelID: *levelID, SmokeFrames: *smoke})
if err != nil {
log.Fatalf("kunde inte starta: %v", err)
}
ebiten.SetWindowSize(game.ScreenW**scale, game.ScreenH**scale)
ebiten.SetWindowTitle("JP Subway Pussel")
ebiten.SetWindowResizingMode(ebiten.WindowResizingModeEnabled)
ebiten.SetVsyncEnabled(true)
if err := ebiten.RunGame(g); err != nil {
log.Println(err)
os.Exit(1)
}
}