feat: Sprint 1 — backend fondations TetaRdPG

Auth SuperOAuth (JWT validation + httpOnly cookie), entités users/characters/level_thresholds,
lazy calculation endurance, seed 100 niveaux, config prod-ready (trust proxy, helmet, CORS, rate limit).
Validé : health 200, auth flow, character CRUD, endurance lazy, 401 sans cookie.
This commit is contained in:
2026-03-15 05:51:02 +01:00
commit da3237bf3f
29 changed files with 7249 additions and 0 deletions

524
GDD.md Normal file
View File

@@ -0,0 +1,524 @@
# TetaRdPG — Game Design Document
> Version : 1.0 — Mars 2026
> Statut : Conception — pré-production
> Type : Idle-RPG textuel communautaire | Extension Twitch + Site Web
---
## Pitch
TetaRdPG est un RPG communautaire asynchrone intégré à Twitch.
Les viewers créent un personnage, le font progresser via des actions consommant de l'endurance,
et interagissent avec le stream et la communauté en temps réel.
**Ce qui rend ce jeu unique :**
- L'engagement Twitch (Bits, abonnements, points de chaîne) est une ressource de jeu
- La progression est persistante et stratégique, pas un simple clicker
- La communauté joue ensemble — succès collectifs, boss mondiaux, guildes
---
## Piliers de design
| Pilier | Description |
|--------|-------------|
| **Stratégie** | Chaque action coûte de l'endurance — gérer sa ressource est central |
| **Persistance** | La progression survit aux streams, les choix ont des conséquences durables |
| **Communauté** | Les objectifs collectifs sont aussi importants que la progression individuelle |
| **Intégration Twitch** | L'activité sur le stream a une valeur en jeu directe |
---
## Systèmes Core
### Endurance
L'endurance est la ressource principale. Elle régule toutes les actions du joueur.
| Paramètre | Valeur |
|-----------|--------|
| Base | 100 pts |
| Maximum (avec équipement) | 150 pts |
| Recharge passive | 10 pts / heure (1 pt toutes les 6 min) |
**Recharge active :**
- 1 TetardCoin → +20 endurance
- Potions : +25 / +50 / +100 endurance
**Coût des actions :**
| Action | Coût endurance |
|--------|---------------|
| Combat | 10 |
| Entraînement (léger) | 20 |
| Entraînement (moyen) | 40 |
| Entraînement (intensif) | 60 |
| Quête (facile) | 15 |
| Quête (moyenne) | 30 |
| Quête (difficile) | 50 |
| Fuite en combat | 5 |
---
### Combat PvE
**Format :** tour par tour — Attaque / Défense / Objet / Fuite
**Formules de dégâts :**
| Type | Formule |
|------|---------|
| Mêlée | Arme + (Force × 1.5) |
| Distance | Arme + (Agilité × 1.5) |
| Magique | Arme + (Intelligence × 1.5) |
**Mécanique défensive :**
- Réduction selon type d'armure + coefficient de défense
**Coups critiques et esquive :**
| Mécanique | Formule | Effet |
|-----------|---------|-------|
| Critique | 5% + (Chance × 0.2%) | Dégâts × 1.5 |
| Esquive | 5% + (Chance × 0.1%) | Annule les dégâts |
**Fin de combat :**
- Victoire → XP + Or + loot + récupération 10% PV
- Défaite → retour auberge, -50 endurance, perte d'or
- Récupération PV hors combat → 10% PV toutes les 15 min
---
### Progression & Niveaux
**Courbe XP :** `XP requise = 100 × N^1.5`
| Niveau | XP requise (cumulé) |
|--------|-------------------|
| 2 | 283 |
| 10 | 3 162 |
| 50 | 35 355 |
| 100 | 100 000 |
**Niveau maximum :** 100, puis **Niveau Beta** *(définition à préciser — prestige, cosmétique ?)*
**Statistiques :**
- 5 stats : Force, Agilité, Intelligence, Chance, Vitalité
- Base : 5 points à répartir à la création
- Gain : +5 points par niveau
- Plafond : 101 par stat (via entraînement et équipement)
- PV de base : 100 (Vitalité influence le max)
**Déblocages par niveau :**
| Niveau | Déblocage |
|--------|-----------|
| 5 | Quêtes moyennes |
| 10 | Forge |
| 15 | Boutique avancée |
| 20 | Quêtes difficiles + Guildes |
| 30 | Équipements épiques |
| 50 | Succès communautaires + Quêtes d'élite |
---
### Artisanat & Forge
**Forge** (accès niveau 10+)
Améliore les équipements existants : +stat, effet spécial, bonus set anticipé.
| Niveau d'amélioration | Résultat | Risque |
|----------------------|----------|--------|
| Niv. 1 2 | Succès garanti | Aucun |
| Niv. 3 | Succès / Échec | 20% perte matériaux |
| Niv. 4 | Succès / Échec | 30% perte matériaux |
| Niv. 5 | Succès / Échec | 40% perte matériaux |
Coût max : 12 TetardCoin (succès garanti, tous niveaux)
**Artisanat**
Création d'équipements, consommables, améliorations à partir de recettes + matériaux.
| Paramètre | Valeur |
|-----------|--------|
| Durée | 15 min à 2 h (temps réel) |
| Endurance | 5 + (Rareté × 3) |
| Accélération | TetardCoin |
Sources de matériaux : loot, échanges joueurs, événements.
**Bonus de sets d'équipement :**
| Pièces du même set | Bonus |
|--------------------|-------|
| 2 pièces | +3% stat associée |
| 3 pièces | +10% + effet spécial |
---
## Économie
### Monnaies
| Monnaie | Obtention | Usage |
|---------|-----------|-------|
| **Or** | Combats, quêtes, succès | Forge, consommables, boutique de base |
| **TetardCoin** | Twitch (Bits, abonnements), achat direct | Recharge endurance, boutique Twitch, forge garantie |
| **Matériaux** | Loot, artisanat, événements | Forge, artisanat |
### Boutiques
| Boutique | Accès | Contenu |
|----------|-------|---------|
| Base | Niveau 1 | Équipements communs/rares, potions simples |
| Avancée | Niveau 15 | Épiques, recettes, matériaux |
| Événementielle | Événements | Objets thématiques limités |
| Twitch | TetardCoin uniquement | Cosmétiques, boosts XP/loot |
### Marché communautaire *(futur — post-lancement)*
- Vente / achat d'objets et matériaux entre joueurs
- Taxe : 5% Or sur chaque transaction
- Limite d'accès : selon niveau joueur
- Phase alpha : interface simple, sans enchères
- Phase évoluée : filtres avancés, système d'enchères
---
## Communauté
### Succès
**Individuels** — catégories : Progression / Combat / Zones / Équipements / Économie
Récompenses : Or, objets rares, titres honorifiques
**Communautaires** — objectifs collectifs :
- Exemples : tuer 10 000 monstres, collecter 1M TetardCoin, vaincre un GIGABOSS
- Récompenses : boosts globaux XP/loot, boutique spéciale, titres exclusifs
### Événements mondiaux
**GIGABOSS mondial**
- Boss unique accessible à tous pendant 72h
- Chaque joueur inflige des dégâts cumulés
- Récompenses proportionnelles à la contribution (Or, loot, titres)
**Semaines thématiques**
- Focus sur une zone ou activité (XP doublée, loot spécial, quêtes exclusives)
**Chasses communautaires**
- Tuer X monstres spécifiques ensemble
- Suivi en temps réel (barres de progression)
### Guildes & Alliances
**Guildes** (accès niveau 20)
- Création : coût Or + TetardCoin, nom + blason + description personnalisés
- Chat de guilde (site + extension)
- Coffre de guilde (matériaux, or, objets partagés)
- Quêtes hebdomadaires collectives
| Niveau guilde | Bonus |
|---------------|-------|
| 1 | +5% XP |
| 2 | +10% loot |
| 3 | +5% endurance max |
**Alliances** (jusqu'à 3 guildes)
- Bonus événementiels partagés
- Classements inter-guildes (PvE, quêtes, contribution économique)
- Récompenses : titres collectifs, cosmétiques, accès boutique exclusive
---
## Compétitif
### PvP — Tag & Resolve
Inspiré du modèle LaBrute (site classique) : **les combats sont asynchrones, résolus automatiquement par le serveur.**
**Ressource PvP : tickets journaliers**
- 10 tickets par jour, remise à zéro quotidienne (heure fixe à définir)
- 1 combat = 1 ticket, qu'il s'agisse d'un humain ou d'un bot
- Pas de coût en endurance — le PvP est indépendant du PvE
- *(Bonus de tickets via abonnements Twitch ou TetardCoin : à définir lors de la session monétisation)*
---
**Flux d'un combat PvP :**
```
1. Le joueur s'inscrit en file PvP (tag)
2. Le système trouve un adversaire dans sa fenêtre Elo
3. Le combat se résout côté serveur (même moteur que le PvE)
4. Les deux joueurs consultent le log de combat + résultat
5. Les Elo se mettent à jour
```
Aucune interaction en temps réel requise — le joueur peut voir le résultat à sa prochaine connexion.
---
### Système Elo
**Elo de départ :** 1000
**Formule :**
```
Score attendu = 1 / (1 + 10^((EloAdversaire - EloJoueur) / 400))
Nouvel Elo = Elo + K × (résultat - score attendu)
résultat = 1 (victoire) | 0 (défaite)
```
**K-factor :**
| Statut | Combats | K |
|--------|---------|---|
| Elo provisoire | < 20 combats PvP | 32 |
| Elo stable | ≥ 20 combats PvP | 16 |
| Combat contre bot | Tout statut | 8 |
**Fenêtre de matchmaking :**
- Départ : ±150 Elo
- Si aucun adversaire trouvé après 5 min → fenêtre élargie à ±300
- Si toujours rien → bot inséré
---
### Bots de simulation
Permettent de jouer dès le lancement même avec peu de joueurs, et de tester l'équilibrage en continu.
Le bot est construit à partir d'un profil de stats correspondant à son tier Elo — il utilise le même moteur de combat que les joueurs.
| Tier | Elo | Profil |
|------|-----|--------|
| Têtard | < 800 | Stats faibles, build généraliste |
| Apprenti | 800 1 000 | Stats moyennes, pas d'équipement rare |
| Guerrier | 1 000 1 200 | Stats optimisées, set de base complet |
| Élite | 1 200 1 500 | Build spécialisé, équipements épiques |
| Légendaire | 1 500+ | Build maxé, équipement rare, set complet |
> Un combat contre un bot met l'Elo à jour (K=8). Le joueur sait qu'il a joué contre un bot.
---
### Ligues saisonnières
- Saisons de durée fixe *(durée à définir)*
- Classement basé sur l'Elo PvP en fin de saison
- **Soft reset** en début de saison : Elo ramené vers 1000 (ex : `nouvel Elo = (Elo + 1000) / 2`)
- Récompenses de fin de saison selon rang (cosmétiques, titres, TetardCoin)
**Rangs de ligue *(noms illustratifs)* :**
| Rang | Elo |
|------|-----|
| Têtard | < 800 |
| Apprenti | 800 1 000 |
| Guerrier | 1 000 1 200 |
| Élite | 1 200 1 500 |
| Légendaire | 1 500+ |
---
### Classements complémentaires
En plus du classement PvP Elo, plusieurs axes de classement coexistent :
| Classement | Basé sur |
|------------|----------|
| XP globale | Niveau + XP totale |
| Richesse | Or accumulé |
| Contribution communautaire | Dégâts GIGABOSS, chasses, événements |
| Hall of Fame mensuel | Activité + performance du mois |
---
## Économie Twitch — Intégration enrichie *(Direction A)*
> Enrichissement de l'expérience pour UN streamer et sa communauté.
> Développable en continuité directe de la v1.0.
### Sources de TetardCoin via Twitch
| Source | Mécanisme | Montant |
|--------|-----------|---------|
| Bits | EventSub `channel.cheer` → conversion directe | *À définir* |
| Abonnement Prime | EventSub subscribe | Bonus mensuel *à définir* |
| Abonnement Lv.1 | EventSub subscribe | Bonus mensuel *à définir* |
| Abonnement Lv.2 | EventSub subscribe | Bonus mensuel *à définir* |
| Abonnement Lv.3 | EventSub subscribe | Bonus mensuel *à définir* |
| Activité chat | EventSub `channel.chat.message` | *À définir — ratio et anti-spam* |
| Présence stream | Token de présence côté serveur (pendant live) | *À définir — fréquence* |
### Présence stream (Watch Time)
Le viewer s'authentifie une fois sur le site.
Pendant que le stream est live (`stream.online`), le serveur lui crédite des TetardCoin passifs toutes les X minutes.
> Twitch n'expose pas le watch time via API — la détection de présence se fait côté serveur (token actif + stream live). Le viewer n'a pas besoin de rester sur le site.
> **Question ouverte :** doit-il être connecté sur le *site* ou juste sur *Twitch* ? *(impacte l'implémentation)*
### Activité chat
Récompenser la participation des viewers en direct.
- Commandes dédiées (`!combat`, `!quête`, `!statut`) → déclencher des actions en jeu depuis le chat
- Messages passifs → TetardCoin au message ou par tranche de X messages
- **Question ouverte :** récompenser tout message ou uniquement les commandes ? *(anti-spam à définir)*
### Événements Twitch → Événements en jeu
| Événement Twitch | Événement en jeu |
|-----------------|-----------------|
| Hype Train | Boost communautaire temporaire (XP/loot doublés, boss surprise) |
| Sub Gift massif | Événement spécial (drop de matériaux rares) |
| Raid entrant | Accueil des raiders avec bonus temporaire |
| *Autres à définir* | *Session brainstorm événements* |
---
## Portail multi-streamers *(Direction B)*
> TetaRdPG comme service — héberger le jeu pour plusieurs streamers.
> Architecture distincte de la v1.0 — à traiter comme un projet parallèle.
### Vision
Chaque streamer s'enregistre sur la plateforme et lie son compte Twitch.
La plateforme gère son token, ses viewers jouent dans son royaume TetaRdPG.
Le jeu grandit en réseau : plus de streamers = plus de joueurs = communauté étendue.
### Modèle d'univers — question ouverte
Deux options architecturales non tranchées :
| Modèle | Description | Avantage | Inconvénient |
|--------|-------------|----------|-------------|
| **Royaumes isolés** | Chaque streamer a son propre jeu indépendant | Simple, streamer = maître de son univers | Pas de communauté inter-streamers |
| **Univers partagé** | Un compte joueur global, plusieurs streams rejoignables | Réseau fort, croissance organique | Équilibrage complexe, gouvernance |
> **Question ouverte :** univers partagé ou royaumes isolés ?
### Modèle économique — question ouverte
| Option | Description |
|--------|-------------|
| Freemium streamer | Gratuit de base, fonctionnalités premium payantes |
| Abonnement streamer | Mensuel fixe par streamer enregistré |
| % transactions | Commission sur les achats TetardCoin des joueurs |
| Hybride | Freemium + commission |
> **Question ouverte :** quel modèle économique pour les streamers ?
### Ce que la plateforme gère par streamer
- Token Twitch broadcaster (EventSub sur son channel)
- Base de joueurs liée à son channel
- Personnalisation : nom du royaume, lore local *(optionnel)*
- Classements et événements propres à sa communauté
### Roadmap Direction B
> À ne pas démarrer avant que la v1.0 (Direction A) soit stable en production.
```
v1.0 stable → extraire l'architecture multi-tenant → onboarding premiers streamers partenaires
```
---
## Intégration Twitch
**Authentification**
- Connexion via OAuth Twitch → lien compte Twitch ↔ compte site
**Données récupérées**
- Statut live du stream
- Points de chaîne
- Bits (conversion en TetardCoin)
- Abonnements (bonus TetardCoin mensuel)
**Extension Twitch (panel viewer)**
- Statut du personnage
- Actions rapides depuis le stream
- Affichage des succès et classements
**Actions spéciales via récompenses personnalisées Twitch**
- Exemples : boost XP, lancement de quête, défi communautaire
---
## Monétisation *(valeurs à définir — session dédiée)*
| Source | Mécanisme | Valeur |
|--------|-----------|--------|
| Bits | 1 Bit → X TetardCoin | *À définir* |
| Abonnement Prime | Bonus mensuel TetardCoin | *À définir* |
| Abonnement Lv.1 | Bonus mensuel TetardCoin | *À définir* |
| Abonnement Lv.2 | Bonus mensuel TetardCoin | *À définir* |
| Abonnement Lv.3 | Bonus mensuel TetardCoin | *À définir* |
| Achat direct TetardCoin | Recharge endurance / objets | *À définir* |
---
## Lore & Univers *(illustratif — à redéfinir)*
> Ce qui suit est une base d'inspiration, pas un canon définitif.
> Tout peut être réinventé lors d'une session lore dédiée.
Monde aquatique régi par la mythologie du **Têtarastafarisme** et du *Têtard Prophétique*.
Exemples de zones : marais, forêt brumeuse, grottes, ruines, temple.
Exemples de PNJ : sage, alchimiste, forgeron, guide mystérieux.
---
## Roadmap v1.0
| Phase | Durée | Livrables clés |
|-------|-------|----------------|
| Pré-production | Sem. 14 | Stack validé, wireframes, systèmes formalisés |
| Sprint 1 — Auth + Backend | Sem. 56 | Auth Twitch, création personnage, API core |
| Sprint 2 — Combat + UI | Sem. 78 | Combat PvE, interface joueur |
| Sprint 3 — Artisanat | Sem. 910 | Forge, craft, recettes |
| Sprint 4 — Succès + HoF | Sem. 1112 | Succès, classements, Hall of Fame |
| Bêta fermée | Mois 4 | Tests communauté, feedback, équilibrage |
| Lancement v1.0 | Mois 5 | Extension Twitch + Site Web en prod |
---
## Post-lancement (v1.1+)
| Trimestre | Contenu |
|-----------|---------|
| T1 | Guildes v1.1, premier GIGABOSS rotatif, boutique de succès |
| T2 | PvP v1.2, personnalisation joueur, marché communautaire étendu |
| T3 | Nouvelles zones & lore avancé v1.3, événements saisonniers |
| T4 | Alliances de guildes v1.4, GIGABOSS légendaires, personnalisation Twitch avancée |
**Fréquence de mises à jour :**
- Patchs : toutes les 2 semaines (bugfix, équilibrage)
- Contenu : mensuel (zones, quêtes, objets, événements)
---
## Points ouverts
| Point | État |
|-------|------|
| Stack technique | **TypeScript partout** — NestJS (backend) + React (frontend) + PostgreSQL + Redis |
| Monétisation — valeurs exactes (Bits, abos) | *Session dédiée* |
| Présence stream — détection côté site ou Twitch ? | *À trancher — Direction A* |
| Chat rewards — tout message ou commandes seulement ? | *À trancher — Direction A* |
| Direction B — univers partagé ou royaumes isolés ? | *À trancher — Direction B* |
| Direction B — modèle économique streamers | *À trancher — Direction B* |
| Durée des saisons PvP | *À définir* |
| Niveau Beta (post-100) | *À préciser* |
| Lore & univers | *Redéfinition libre lors d'une session dédiée* |
| Zones et contenu v1.0 | *À définir selon le scope MVP* |