# Stadt Land Dschungel

Stadt Land Dschungel (englisch: Jungle Categories) ist ein browserbasiertes Multiplayer-Wortspiel im Stil von Stadt, Land, Fluss. Ein Spieler leitet den Raum, wählt ein Thema und startet eine synchronisierte 120-Sekunden-Runde. Alle anderen treten über denselben Raumcode bei – ohne Konto und ohne App-Installation.

## Was bereits funktioniert

- 1 bis 12 Spieler pro Raum
- geschützte Raumleitung und fortsetzbare Spielersitzungen
- elf Themen-Presets plus eigene Kategorien
- vollständige deutsche und englische Sprachpakete; jeder Raum behält seine gewählte Spielsprache
- QR-Code pro Raum für den direkten Beitritt per Handykamera
- serverseitig synchronisierte Runden und automatische Zeitbegrenzung
- serverseitige Eingabeprüfung und Bananenberechnung
- 10 Bananen für eindeutige Antworten, 15 Bananen für gemeinsame Matches (10 Bananen plus 5 Bonusbananen) und 0 Bananen für Antworten mit weniger als drei Buchstaben oder andere ungültige Antworten
- Gesamtstand über mehrere Runden; je 100 Bananen werden kompakt als eine Wassermelone dargestellt
- responsive Oberfläche für Desktop und Smartphone
- installierbare Progressive Web App mit Offline-App-Shell
- zweisprachige Info-/About-Seite mit Spiel-Insidern, lokaler Startanleitung und Offline-Verfügbarkeitsanzeige
- automatisierte Tests für Spiellogik, Rechte, HTTP-API und statische Dateien

## Lokal starten

Voraussetzung: Node.js 20 oder neuer.

```bash
npm ci
npm start
```

Danach läuft das Spiel unter [http://localhost:3001](http://localhost:3001).

Für die Entwicklung mit automatischem Neustart:

```bash
npm run dev
```

## Qualität prüfen

```bash
npm run check
```

Der Befehl prüft alle JavaScript-Dateien syntaktisch und führt die komplette Testsuite aus.

## Spielablauf

1. Die erste Person im Raum wird zur Raumleitung.
2. Weitere Spieler öffnen den geteilten Link und wählen einen eigenen Namen.
3. Die Raumleitung wählt ein Thema oder passt die Kategorien an.
4. Nach dem Rundenstart wird ein Buchstabe gezogen und der gemeinsame Countdown beginnt.
5. Antworten können frühzeitig abgegeben werden; leere Felder sind erlaubt und zählen 0 Bananen.
6. Sobald alle abgegeben haben oder die Zeit abläuft, zeigt der Server die verbindliche Auswertung.

## Projektstruktur

```text
.
├── game-server.js       # HTTP-Server, API und statische Dateien
├── lib/game.js          # testbare Spiellogik ohne Browser-Abhängigkeit
├── slf/                 # Spieloberfläche und vorhandene Jungle-Assets
├── test/                # Unit- und Integrationstests
├── design/assets.csv    # Manifest der verwendeten Bild-Assets
├── index.html           # Spielauswahl
├── about.html           # offlinefähige Info-/About-Seite
├── manifest.json        # PWA-Metadaten
└── service-worker.js    # Offline-App-Shell
```

## Konfiguration und Daten

Der Server verwendet standardmäßig Port `3001`. Über die Umgebungsvariable `PORT` kann ein anderer Port gesetzt werden; siehe `.env.example`.

Für einen öffentlichen Betrieb hinter HTTPS sollte zusätzlich die öffentliche Domain gesetzt werden:

```bash
PUBLIC_ORIGIN=https://play.cloud9ine.io
```

Dadurch enthalten geteilte Links und QR-Codes garantiert die öffentliche HTTPS-Adresse statt eines internen Node-Ports. Nach dem Hochladen einer neuen `game-server.js` muss die Node-Anwendung im Hosting-Panel neu gestartet werden; ein reiner FTP-Upload ersetzt den bereits laufenden Serverprozess nicht.

Aktive Räume werden als JSON-Dateien im lokalen Ordner `games/` gespeichert. Dieser Ordner ist absichtlich von Git ausgeschlossen, weil er Spielersitzungen enthält.

Räume aus älteren, ungeschützten Versionen werden beim ersten Öffnen automatisch auf das aktuelle Format migriert. Alte Spielerlisten werden dabei geleert, weil frühere Sitzungen keine sicheren Tokens besaßen; anschließend kann jeder Spieler normal neu beitreten.

## Technische Grenzen

Die aktuelle Version speichert Räume auf dem lokalen Dateisystem und verwendet kurzes HTTP-Polling. Das ist für private Runden und einen einzelnen Serverprozess ausgelegt. Für horizontale Skalierung über mehrere Serverinstanzen wäre als nächster Schritt eine gemeinsame Datenbank plus WebSocket-Schicht sinnvoll.

## Lizenz

Veröffentlicht unter der [MIT-Lizenz](LICENSE).
