Treffer-Toleranz, 2 Ranglisten, Anti-Cheat, CLI-Modi & Icons

- Treffer-Toleranz: Ziel wird geometrisch + bevorzugt getroffen, auch wenn verdeckt
- Zwei Ranglisten: Hall of Fame (Allzeit-Top-5) + Heute (Top-10)
- Anti-Cheat: server-autoritative Sessions (start/hit), Score = Server-Zahl,
  Mindestabstand gegen Auto-Klicker, Deckelung nach Spielzeit; Score ohne Session -> 400
- CLI (server/admin.js): list / delete <name> / clear-today / clear-all
- Zwei Betriebsmodi per CLI (live, ohne Neustart): public (/ = Spiel) und
  private (/ gesperrt, Spiel unter geheimem /pfad) + "not allowed to play"-Seite
- Board-Icons von Emojis auf echte SVG-Icons, Board heisst "Hall of Fame"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-05 11:23:30 +02:00
parent 39ed0e2485
commit ecdbd2ee0d
21 changed files with 472 additions and 117 deletions

View File

@@ -51,9 +51,36 @@ In `public/js/app.js` oben:
## Rangliste
- Gespeichert in `data/leaderboard.json` (wird automatisch angelegt, überlebt Neustarts).
- Endpoints: `GET /api/leaderboard` (Top 10), `POST /api/score` `{name, score}`.
- Namen werden beim Anzeigen escaped (kein XSS). Kein Anti-Cheat — Spaßspiel.
- Zwei Boards: **Hall of Fame** (Allzeit-Top-5) + **Heute** (Top-10). Gespeichert in
`data/leaderboard.json` (wird automatisch angelegt, überlebt Neustarts).
- **Anti-Cheat:** Der Score ist server-autoritär — der Server vergibt zu Spielbeginn eine
Session (`/api/game/start`), zählt jeden gemeldeten Treffer (`/api/game/hit`) mit
Mindestabstand (gegen Auto-Klicker) und deckelt nach echter Spielzeit. Beim Eintragen
(`/api/score`) zählt **nur** diese Server-Zahl; ein Score ohne gültige Session wird
abgelehnt. Namen werden beim Anzeigen escaped (kein XSS).
## Verwaltung per CLI
Auf dem Server (im Projektordner):
```sh
# Rangliste
node server/admin.js list # beide Boards anzeigen
node server/admin.js delete "Name" # einen bestimmten Spieler löschen
node server/admin.js clear-today # nur die heutige Rangliste leeren
node server/admin.js clear-all # komplette Rangliste leeren
# Betriebsmodus (wirkt SOFORT, ohne Neustart)
node server/admin.js mode # aktuellen Modus anzeigen
node server/admin.js mode public # Spiel öffentlich unter "/"
node server/admin.js mode private geheim # "/" gesperrt, Spiel nur unter "/geheim"
```
(Kurzform via npm: `npm run lb -- <befehl>`.)
- **public** (Default): `/` ist das Spiel.
- **private**: `/` zeigt „You are not allowed to play", das Spiel läuft nur unter dem
gewählten Pfad (`/<pfad>`) — praktisch zum Testen im Live-Betrieb.
## Deployment (Ausblick)