# Dimension47 - TTRPG Campaign Management Platform ## Projekt-Philosophie **Qualität vor Geschwindigkeit**: Es ist egal, wie lange die Implementierung dauert - das System soll am Ende gut funktionieren. Keine Shortcuts oder Quick-Fixes, die später Probleme verursachen. **Lieber langsam und richtig**: Immer den sauberen Weg wählen, auch wenn er länger dauert. Beispiele: - Prisma Migrations statt `db push` verwenden - Daten in Datenbank statt direkt aus JSON-Dateien lesen - Proper Error Handling statt try/catch mit console.log - TypeScript strict mode, keine `any` Types ## Architektur-Entscheidungen ### Daten-Management - **Equipment/Items in Datenbank**: Alle Pathfinder 2e Daten (Waffen, Rüstungen, Ausrüstung, Zauber, Talente) werden in die PostgreSQL-Datenbank importiert, NICHT direkt aus JSON-Dateien gelesen. - **Prisma Seed Scripts**: JSON-Dateien werden via `prisma db seed` in die Datenbank importiert. - **Übersetzungen gecacht**: Deutsche Übersetzungen werden on-demand via Claude API generiert und in der Translation-Tabelle gespeichert. ### Vorteile des Database-Ansatzes - Bessere Such- und Filtermöglichkeiten - Konsistente Datenstruktur - Eigene Items können hinzugefügt werden - Relationale Verknüpfungen möglich - Performance durch Indizes ## Tech Stack ### Frontend - React 19 + TypeScript - Vite als Build Tool - Tailwind CSS v4 - shadcn/ui Komponenten (selbst gebaut) - Zustand für Client State ### Backend - NestJS mit TypeScript - Prisma ORM - PostgreSQL - JWT Authentication - Socket.io für WebSockets ## Ordnerstruktur ``` dimension47/ ├── client/ # React Frontend │ ├── src/ │ │ ├── app/ # App-Config, Router │ │ ├── features/ # Feature-Module (auth, campaigns, characters, etc.) │ │ │ ├── auth/components/ │ │ │ │ ├── login-page.tsx # Login mit Animationen │ │ │ │ └── register-page.tsx # Registrierung │ │ │ └── characters/ │ │ │ ├── components/ │ │ │ │ ├── character-sheet-page.tsx # Hauptseite mit Tabs │ │ │ │ ├── hp-control.tsx # HP-Management Komponente │ │ │ │ ├── add-condition-modal.tsx # Zustand hinzufügen │ │ │ │ ├── add-item-modal.tsx # Item aus DB hinzufügen │ │ │ │ ├── actions-tab.tsx # Aktionen-Tab │ │ │ │ ├── alchemy-tab.tsx # Alchemie-Tab │ │ │ │ └── rest-modal.tsx # Rasten-Modal │ │ │ └── utils/ │ │ │ └── export-character-html.ts # HTML-Export Funktion │ │ ├── shared/ # Geteilte Komponenten, Hooks, Types │ │ │ └── hooks/ │ │ │ └── use-character-socket.ts # WebSocket Hook für Echtzeit-Sync │ │ └── assets/ │ └── public/ # Statische Dateien, JSON-Datenbanken │ └── server/ # NestJS Backend ├── src/ │ ├── modules/ # Feature-Module │ │ ├── auth/ # Authentifizierung │ │ ├── campaigns/ # Kampagnenverwaltung │ │ ├── characters/# Charakterverwaltung │ │ │ ├── characters.gateway.ts # WebSocket Gateway │ │ │ └── alchemy.service.ts # Alchemie-System Service │ │ └── equipment/ # Equipment-Datenbank │ ├── common/ # Shared Utilities │ └── prisma/ # Prisma Service └── prisma/ ├── schema.prisma # Datenbank-Schema ├── migrations/ # Prisma Migrations ├── seed.ts # Basis-Seed ├── seed-equipment.ts # Equipment-Import (5.482 Items) └── data/ # JSON-Quelldaten für Equipment ``` ## Implementierte Features ### Auth - JWT-basierte Authentifizierung - Login/Register/Logout - Rollen: ADMIN, GM, PLAYER - **"Anmeldung speichern"** Funktion (localStorage vs sessionStorage) - **Animierter Login-Screen**: - Zweistufiger Flow: Splash → Formular - Animierter Sternenhintergrund mit schwebenden Orbs - "DIMENSION 47" Titel mit Buchstaben-Animation und Glow-Effekt - Logo mit Tap-Glow-Effekt - Gestaffelte Formular-Animationen (Komponente für Komponente) ### Kampagnen - CRUD für Kampagnen - Mitgliederverwaltung - GM-Berechtigungen ### Charaktere - Pathbuilder 2e Import - HP-Management (mobile-optimiert, Schaden/Heilung/Direkt) - Zustände (Conditions) mit PF2e-Datenbank - Fertigkeiten mit deutschen Namen - Rettungswürfe - **Inventar-System (komplett)**: - Vollständige Equipment-Datenbank (5.482 Items) - Item-Suche mit Kategoriefilter und Pagination - Bulk-Tracking mit Belastungs-Anzeige - Ausrüstungsstatus (angelegt/abgelegt/investiert) - Quantity-Management - Item-Details mit Eigenschaften, Schaden, etc. - Benutzerdefinierte Notizen pro Item - **Talente-Tab (komplett)**: - Alle Charaktertalente aus Pathbuilder-Import - Kategorisiert nach Quelle (Klasse, Abstammung, Allgemein, Fertigkeit, Bonus, Archetyp) - Einklappbare Kategorien - Talentdetails mit Beschreibung und Voraussetzungen - **Aktionen-Tab** mit PF2e-Aktionsdatenbank (99 Aktionen) - Kategorien: Allgemein, Kampf, Bewegung, Interaktion, Spezial - Einklappbare Kategorien (standardmäßig eingeklappt) - Aktionstyp-Icons (Aktion, Reaktion, Freie Aktion, etc.) - Suchfunktion - **WebSocket Real-Time Sync** für: - HP (aktuell, temporär, max) - Zustände (hinzufügen, entfernen, aktualisieren) - Inventar (Items hinzufügen, entfernen, aktualisieren) - Ausrüstungsstatus (angelegt/abgelegt) - Geld (Credits) - Level - Alchemie (Phiolen, Formeln, vorbereitete Items) - **Alchemie-Tab (komplett)**: - Vielseitige Phiolen mit Tracker - Formelbuch mit allen bekannten Formeln - Tägliche Vorbereitung (Advanced Alchemy) - Schnelle Alchemie (Quick Alchemy) - Handwerkliche Alchemie (Craft Alchemy) - Forschungsgebiete (Bomber, Chirurg, Mutageniker, Toxikologe) - Infundierte Items mit Effekt-Anzeige und Schadenswerten - **Rest-System**: - HP-Heilung basierend auf CON-Mod × Level - Zustands-Management (Erschöpft entfernt, Verdammt/Entkräftet reduziert) - Ressourcen-Reset (Zauberplätze, Fokuspunkte) - Alchemie-Reset (infundierte Items verfallen, Phiolen aufgefüllt) - **Status-Tab Erweiterungen**: - Wahrnehmung mit korrekter PF2e-Berechnung - Geschwindigkeit - Rüstungsklasse mit Übungsstufe - Rettungswürfe mit Übungsstufen - **HTML-Export**: - Vollständiger Charakterbogen als druckbare HTML-Datei - Alle Attribute, Fertigkeiten, Talente, Ausrüstung - Zauber und Alchemie (wenn vorhanden) ### Noch zu implementieren (Character Screen) - **Level-Up System**: Stufenaufstieg mit Attributs-, Talent- und Fertigkeitenwahl ### Equipment-Datenbank - **5.482 Items** aus Pathfinder 2e importiert - Waffen mit Schaden, Schadentyp, Reichweite, Eigenschaften - Rüstungen mit RK, DEX-Cap, Penalties - Verbrauchsgüter und allgemeine Ausrüstung - Durchsuchbar nach Name, Kategorie, Level, Eigenschaften - API-Endpunkte: `/equipment`, `/equipment/categories`, `/equipment/weapons`, etc. ## Design-Prinzipien - **Mobile-First**: Touch-optimiert mit 44px+ Touch-Targets - **Dark Mode**: Primärfarbe #c26dbc (Magenta) - **Deutsch**: Alle UI-Texte auf Deutsch - **Keine Emojis**: Nur Lucide Icons ## Environment-Variablen ### Server (`server/.env`) ```bash PORT=5000 # Server-Port DATABASE_URL="postgresql://..." # PostgreSQL Connection String JWT_SECRET="..." # JWT Signing Key ANTHROPIC_API_KEY="..." # Claude API für Übersetzungen ``` ### Client (`client/.env`) ```bash VITE_API_URL=http://localhost:5000/api # Muss mit Server PORT übereinstimmen ``` **Wichtig**: Die WebSocket-URL wird automatisch aus `VITE_API_URL` abgeleitet (ohne `/api` Suffix). Beispiel-Dateien: `server/.env.example` und `client/.env.example` ## Entwicklung ```bash # Backend starten (Port 5000, konfigurierbar via PORT in .env) cd server && npm run start:dev # Frontend starten (Port 5173) cd client && npm run dev # Prisma Migrations (IMMER Migrations verwenden, NIEMALS db push!) cd server && npm run db:migrate:dev # Neue Migration erstellen & anwenden cd server && npm run db:migrate:deploy # Migrations in Produktion anwenden cd server && npm run db:migrate:status # Status der Migrations prüfen cd server && npm run db:migrate:reset # DB zurücksetzen (Dev only!) # Prisma Sonstiges cd server && npm run db:studio # DB Browser cd server && npm run db:generate # Prisma Client generieren cd server && npm run db:seed # Basis-Seed-Daten laden cd server && npm run db:seed:equipment # Equipment-Datenbank laden ```