diff --git a/.gitignore b/.gitignore index c512e48..0f72113 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /public/*.js* /.env /rules/ +/public/*.css* +/public/fonts/ diff --git a/PLAN.md b/PLAN.md index 348b52d..371d85b 100644 --- a/PLAN.md +++ b/PLAN.md @@ -162,3 +162,26 @@ Abgabe: **9. Dezember 2026, 03:00 MEZ**. Eingereicht wird in „Best Daily Game Spiel als Entry `game` (Expanded). - **Fallstrick:** `hMGet` ist laut Doku nicht für jede App freigeschaltet → einzelne `hGet`. - Offen: Löschungen von Nutzern respektieren (Devvit-Regel) – Ergebnis und Name bei Kontolöschung entfernen. + +### 2026-11-13 – Phase 1, Client + +- **Brett aus dem Hauptspiel:** `BoardView.ts`, `atlas.ts`, `geometry.ts`, `board.css` und `env.ts` kommen per + Sync-Skript nach `src/engine/app/` (unverändert). `import.meta.env` und `__API_ORIGIN__` setzt esbuild per + `--define`; Typen dafür in `src/types/ninelands-env.d.ts`. Das Symbol `i-warn` (Warn-Badge der Vorschau) steht + direkt in `public/game.html`. +- **Startbildschirm** (`splash`, inline, `height: tall`): Name, Nummer, Datum, Mini-Karte, Gesetz, Ziele bzw. eigenes + Ergebnis, Spielen-Knopf, Streak, Top 3, „i“ mit Credits. +- **Spiel** (`game`, Expanded): Ziele-Leiste mit Sternen live, Gesetz (antippbar → Regeln), Brett, Hinweiszeile, + Figuren mit Kosten, Rückgängig (1 Schritt wie im Hauptspiel). Touch: erster Tipp zeigt Vorschau und Grund, zweiter + setzt. Nach der Burg automatisch Bauer. Ende → Abgabe → Ergebniskarte (Sterne, Gold, Länder, Platz, Streak, Top 10, + Teilen über `showShareSheet`, „Play again“ als Übung, „Done“ schließt den Expanded Mode). +- Gäste spielen ohne Wertung (Hinweis + `showLoginPrompt`); wer schon gespielt hat, sieht „Practice“. +- **Layout-Fallstrick:** Brett und Hinweis liegen in einem Container mit `container-type: size`; das Brett ist + `min(100cqw, 100cqh − 3.2em)` breit. Mit `flex: 1` + `aspect-ratio` allein blieb viel Leerraum zwischen Brett und + Hinweis. +- Schrift Pixelify Sans über `@fontsource/pixelify-sans` (OFL), von esbuild nach `public/fonts/` kopiert – externe + Schrift-Abrufe sind im Devvit-Client gesperrt. +- Musik: Start beim ersten Tippen, Stumm-Knopf, Pause bei `visibilitychange`. Stumm-Schalter vorerst in + `localStorage` (geht bei App-Updates verloren – vertretbar; Redis erst, wenn es stört). +- Lokale Vorschau ohne Reddit: kleine Server-Attrappe + Playwright-Screenshots (Skripte im Scratchpad, nicht im Repo). +- Biome ergänzt bei `--write` Dateiendungen an Engine-Importen (`'../engine/core/Game.ts'`) – ist so gewollt. diff --git a/biome.jsonc b/biome.jsonc index fda6dc9..929e57f 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -2,7 +2,15 @@ "$schema": "https://biomejs.dev/schemas/2.6.6/schema.json", "css": {"formatter": {"enabled": true, "quoteStyle": "single"}}, // src/engine/ ist eine Kopie aus Ninelands (scripts/sync-engine.sh) und wird nicht umformatiert - "files": {"includes": ["**", "!dist/", "!public/*.js*", "!src/engine"]}, + "files": { + "includes": [ + "**", + "!dist/", + "!public/*.js*", + "!public/*.css*", + "!src/engine" + ] + }, "formatter": { "bracketSpacing": false, "enabled": true, diff --git a/package-lock.json b/package-lock.json index 0e2fc01..11b814b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,10 +7,11 @@ "": { "name": "ninelands-game", "version": "0.0.0", - "license": "BSD-3-Clause", + "license": "GPL-3.0-only", "devDependencies": { "@biomejs/biome": "2.6.6", "@devvit/web": "0.15.3", + "@fontsource/pixelify-sans": "5.3.0", "@types/node": "24.19.2", "devvit": "0.15.3", "esbuild": "0.28.2", @@ -1673,6 +1674,16 @@ "node": ">=18" } }, + "node_modules/@fontsource/pixelify-sans": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/pixelify-sans/-/pixelify-sans-5.3.0.tgz", + "integrity": "sha512-4RCe9nXbi7wUu5+H0FNX1sgPZ2kJ1MmY1uTkEfvQIzzqhoS8zGKJaJfdK8oreE0OU+5gM+NdurFi3H3FJRBvyw==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@improbable-eng/grpc-web": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.15.0.tgz", diff --git a/package.json b/package.json index 4c82f9a..599e060 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "type": "module", "scripts": { "build": "npm run build:client -- --metafile=dist/client.meta.json --minify && npm run build:server -- --metafile=dist/server.meta.json --minify", - "build:client": "esbuild --bundle --log-level=warning --sourcemap=linked --target=es2023 --format=esm --outdir=public --platform=browser src/client/splash.ts src/client/game.ts", + "build:client": "esbuild --bundle --log-level=warning --sourcemap=linked --target=es2023 --format=esm --outdir=public --platform=browser --define:import.meta.env.MODE='\"reddit\"' --define:import.meta.env.BASE_URL='\"/\"' --define:__API_ORIGIN__='\"\"' --loader:.woff2=file --loader:.woff=file --asset-names=fonts/[name]-[hash] src/client/splash.ts src/client/game.ts", "build:server": "esbuild --bundle --log-level=warning --sourcemap=linked --target=es2023 --format=cjs --outdir=dist/server --platform=node src/server/index.ts", - "clean": "rm -rf dist/ public/*.js*", + "clean": "rm -rf dist/ public/*.js* public/*.css* public/fonts/", "format": "npm run lint -- --fix", "lint": "biome check --error-on-warnings", "playtest": "devvit playtest", @@ -21,6 +21,7 @@ "devDependencies": { "@biomejs/biome": "2.6.6", "@devvit/web": "0.15.3", + "@fontsource/pixelify-sans": "5.3.0", "@types/node": "24.19.2", "devvit": "0.15.3", "esbuild": "0.28.2", diff --git a/public/game.html b/public/game.html index 76d9cbd..fcbe7e1 100644 --- a/public/game.html +++ b/public/game.html @@ -2,36 +2,27 @@
- -
-
-