# TODOs — Idées & améliorations à venir

## À faire (par priorité)

### 1. Builds publics (fiche + commentaires)
Prolonge la sauvegarde privée en ajoutant la publication et l'interaction communautaire.
- Champ `is_public` (bool) + `slug` (unique généré) sur l'entité `Build`
- Route publique `/builds/{slug}` : fiche complète du build (perso, équipement, stats calculées, dégâts type), lien « Copier chez moi » qui crée une copie privée
- Galerie `/builds/browse` : filtres jeu / perso / rôle, tri par likes/date, pagination
- Système de likes : table `build_like` (`player_id`, `build_id`, `created_at`, unique)
- Commentaires : table `build_comment` (`build_id`, `player_id`, `body`, `created_at`), modération admin (soft delete)
- Bouton « rendre public / privé » sur la page « Mes builds »

### 2. Échanges entre joueurs (v2+)
Base v1 livrée (troc 1-vs-1 dans le marché MMO). Extensions à considérer :
- **Bundles** : offered/wanted en paquets (N objets d'un côté vs N de l'autre) — entité `TradeItem` liée à `TradeListing`
- **Matching auto** : notifications quand un joueur crée une annonce dont l'objet demandé correspond à l'inventaire d'un autre
- **Wishlist standalone** : entité `WishlistEntry` séparée pour déclarer « je cherche X » sans avoir à créer d'annonce (soft-matching côté serveur pour notifier)
- **Historique** : page « Mes échanges terminés » avec filtrage par période
- **Rate-limit dynamique** : cap ajustable par niveau/rôle plutôt qu'à 10 en dur

### Plus tard (moins prioritaire)

- **Carte de personnage — publication** (dépend du chantier « Builds publics ») :
  - Endpoint public `/build/{slug}/card`
  - Cache statique du PNG dans `public/uploads/build-cards/{id}-{updatedAt}.png` (pré-génération server-side via headless Chrome ou wkhtmltoimage)
  - Balises Open Graph sur les fiches publiques
  - Presets de fond additionnels dans `public/images/card_backgrounds/`
- **Extensions du simulateur** :
  - Combat multi-tours (débloque tous les tags MMO-only déjà parsés)
  - Rotation optimale de skills
  - Team simulator 4v4
  - Damage curve over levels
  - Comparaison de builds côte-à-côte
- **Encyclopédie enrichie** :
  - Table de résistances × ennemis (matrice colorée)
  - Explorateur d'arbre de recettes
  - Calculateur de drop rates cumulés
  - « Utilisé par » sur les statuts (miroir des recettes)
- **Services techniques** :
  - Sandbox de formules Yanfly
  - API JSON publique documentée + OpenAPI
- **QoL** :
  - Raccourcis clavier dans les simulateurs
  - Thème clair/sombre
  - Historique des builds chargés

## En cours

_(rien)_

## Fait

- Annonces d'échange (troc 1-vs-1 sans monnaie) — nouvel onglet « Annonces d'échange » dans `/market`. Entité `TradeListing` (`trade_listing`) parallèle à `MarketplaceListing` : offered (5 types dont instances) contre wanted (types de base uniquement), notes libres ≤ 500 c, statut active/accepted/cancelled. À la création, l'objet offert est retiré (locked) ; à l'acceptation, transfert atomique avec vérif inventaire des 2 parties (`canAddToInventory`) et notification au vendeur ; à l'annulation, restitution. Cap 10 annonces actives/joueur. Endpoints `GET /market/trades/api/list|mine`, `POST .../create|{id}/accept|{id}/cancel`. UI : filtres armes/armures/objets + recherche, modal de création avec pickers offered (inventaire) / wanted (catalogue MMO) + notes.
- Résistances/faiblesses des ennemis via passive states élémentaires (miroirs 401-413 en NS)
- Partage de build par URL (NS + CSF) — format JSON → base64 URL-safe dans `?b=…`, bouton « 📋 Partager » à côté du niveau, toast confirmation, auto-apply au chargement. Capture perso/niveau/équipement/statuts manuels/variations/passifs cochés (NS)/points d'attribut (CSF)/compteurs/PV/EG/Power/ennemi/statuts ennemi/skill sélectionné.
- Sauvegarde persistante des builds (comptes utilisateurs) — entité `Build`, CRUD JSON `/api/builds`, boutons « 💾 Sauver » / « 📂 Charger » dans les deux simulateurs, page « Mes builds » dans le dropdown profil. Max 20 par jeu, écrasement avec confirmation si nom identique.
- Système de favoris (⭐) — champ `favorites` JSON sur `Player` (`{type: [entityId, ...]}`), endpoints `GET /api/favorites` + `POST /api/favorites/toggle`, extension Twig `is_favorited()`, bouton ⭐ dans le header de chaque fiche (weapon/armor/item/skill/status/enemy), page « Mes favoris » dans le dropdown profil.
  - Chaque carte affiche : **icône** (via `icon_img` ou portrait pour ennemi), **catégorie** en badge vert (weaponType/armorType/item.type/skillType traduit/Boss/Superboss/Standard) et **jeu** en badge gris.
  - Grille responsive 260 px min, groupée par type, tri chronologique d'ajout.
- Génération de cartes de personnage (privé) — carte 320×660 (Manrope + JetBrains Mono, thème dark, gradient élémental) générée directement dans le simulateur via un modal, alimentée par `getCharFinalStats()` (équipement/statuts/customBonuses appliqués). Partial partagé `templates/simulator/_card_generator.html.twig` inclus dans NS et CSF, entrée « Générer une carte » (CardLogo.svg) dans le dropdown « ⋯ Build ».
  - Portrait avec `background-size: contain` (html2canvas respecte, contrairement à `object-fit`), badges élément dans le coin, sous-titre « Niveau X ».
  - 8 stats finales en grille 4×2. Section « Passifs » (auto, uniquement ceux cochés dans « Passifs secondaires », natifs exclus, icône `passive.png`). Section « Sorts » (user-picked, cap 8, badge d'élément à droite).
  - 9 slots équipement en bas.
  - Modal : picker latéral avec sélecteur de fond (auto-découvert depuis `public/images/card_backgrounds/` via extension Twig `card_backgrounds()`) + liste des sorts apprenables (triés par niveau, cap 8 avec compteur). Bouton « Télécharger PNG » (DownloadLogo.svg) via html2canvas (échelle 2×, CORS).
  - Lien « 🖼 Carte » sur « Mes builds » redirige vers le simulateur (`?b=…&card=1&name=…`) et ouvre automatiquement le modal.

## Idées futures

- URL shortening côté serveur (POST /api/builds → slug court `/build/xyz123`) si les URLs deviennent trop longues
- Nommage de build (paramètre `&name=…` visible dans le toast au chargement)
- Galerie de builds partagés (nécessite comptes users + BDD)
- Compare mode : `?b=…&b2=…` affichés côte-à-côte
