Files

153 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🏰 Der letzte Auftrag AI-Befehle
## Projektbeschreibung
"Der letzte Auftrag" ist ein interaktives Brautabschied-Spiel (Heldenspiel/Drill) als Web-App.
Der Bräutigam (der "Held") muss 8 Quests absolvieren, um alle Besitztümer für die Braut zu erbeuten.
## Architektur
- **Frontend:** Single-page HTML (CSS + Vanilla JS), keine Frameworks
- **Backend:** Node.js/Express auf Port 8082
- **Datenbank:** SQLite (better-sqlite3), Dateiname `data.db`
- **Deployment:** systemd Service auf 192.168.0.187, nginx Reverse Proxy
## API-Endpunkte
### Game State
```
GET /api/game Full game state + spieler + notes + stats
POST /api/game/start {"name": "Spielname"} Spiel starten
POST /api/game/reset Alles zurücksetzen
POST /api/game/save-state {"items":[...], "drinks": N, "quests":[...]} Zustand speichern
POST /api/game/drink {"amount": ±N} Trinken hinzufügen/abziehen
POST /api/game/drink/reset Null trinken
POST /api/game/toggle-item {"index": 0-7} Inventar-Toggle
POST /api/game/toggle-quest {"index": 0-7} Quest-Toggle
```
### Spieler (Participants)
```
GET /api/spieler Alle Spieler
POST /api/spieler {"name": "...","rolle": "...","quest_id": N|null}
PUT /api/spieler/:id {"rolle": "...","quest_id": N|null}
DELETE /api/spieler/:id Spieler entfernen
```
### Notes
```
GET /api/game (im state.notes) Alle Notizen
POST /api/notes {"body": "Text"}
```
### Stats
```
GET /api/game/stats {collected, total, questsDone, questsTotal, drinks, gameName, spielerCount, spieler}
```
## Rolen-System
| Rolle | Code | Bedeutung |
|-------|------|-----------|
| Held | `held` | Der Bräutigam löst alle Quests |
| Spielleiter | `spielleiter` | Organisator, kennt alle Aufgaben |
| Hüter | `hüter` | Bewacht ein Besitztum |
| Ratsmitglied | `ratsmitglied` | Erfahrener RPG-Spieler |
| Einsteiger | `einsteiger` | Tabletop-Neuling |
| Gast | `gast` | Schaut zu, trinkt mit |
## Quest-System
8 Quests mit 3 Schwierigkeitsstufen:
- **EINSTEIGER** (0-3): Brief, Ring, Schlüssel, Blume
- **MITTEL** (4-5): Foto, Schuh
- **HERAUSFORDERUNG** (6-7): Maskottchen, Urkunde
Jede Quest hat: id, badge, badgeLabel, name, holder, item, desc, success, fail, details
## Frontend-Struktur
```
index.html (Single File)
├── Lines 1-1257: HTML-Struktur + CSS (NICHT ÄNDERN!)
└── Lines 1258+: JavaScript (API-basiert)
├── PART 1-2: API-Helpers, State-Sync, Quest-Daten
├── PART 3-6: UI-Funktionen (Stars, Tabs, Quests, Items, Drinks, Status)
├── PART 7: Würfelfunktionen (W4, W6, W8, W10, W12, W20, W100)
└── PART 8: Spieler-Management (API-Version)
```
## Backend-Struktur
```
server/
├── server.js Express-Server mit SQLite-Backend
├── package.json Abhängigkeiten (express, better-sqlite3)
├── data.db SQLite-Datenbank (wird erstellt)
└── node_modules/
```
## Datenbank-Schema
```sql
CREATE TABLE state (key TEXT PRIMARY KEY, value TEXT);
CREATE TABLE spieler (id INTEGER PRIMARY KEY, name TEXT, rolle TEXT, quest_id INTEGER, created_at DATETIME);
CREATE TABLE notes (id INTEGER PRIMARY KEY, body TEXT, created_at DATETIME);
CREATE TABLE drinks_log (id INTEGER PRIMARY KEY, amount INTEGER, note TEXT, created_at DATETIME);
```
## Deployment
### systemd Service
```ini
[Unit]
Description=Der letzte Auftrag Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/der_letzte_auftrag/server
ExecStart=/usr/bin/node server.js
Restart=on-failure
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
```
### Nginx Konfiguration
```nginx
location / {
proxy_pass http://127.0.0.1:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
```
## AI-Anweisungen
### Bei Änderungen am Frontend:
1. ÄNDERE NIE die HTML-Struktur (Zeilen 1-1257)
2. ÄNDERE NIE das CSS
3. Nutze IMMER die API-Helpers (apiGet/apiPost/apiPut/apiDelete)
4. Lokal State nach API-Call: syncState() und refreshUI()
5. Keine localStorage mehr alles geht über die API
### Bei Änderungen am Backend:
1. Neue Endpunkte: Immer PUT für Updates, DELETE für Löschungen, POST für Creates
2. Datenbanken: Immer `initState()` aufrufen vor state-Leseoperationen
3. Fehlerbehandlung: Immer auf null/undefined prüfen
4. WAL-Modus aktiviert für bessere Concurrent-Performance
### Deployment-Schritte:
1. `git push origin main`
2. SSH zum Server (192.168.0.187): `git pull`
3. `cd server && npm install`
4. `systemctl restart der-letzte-auftrag`
5. Test: `curl http://localhost:8082/api/game`