# CSIWO — TODO

## ⚠️ Principe fondamental : entités séparées

Les tables et entités `Item`, `Weapon`, `Armor` existantes appartiennent au **site compagnon** (encyclopédie).
CSIWO aura ses propres entités distinctes :

| Site compagnon (existant) | CSIWO (à créer) |
|---|---|
| `Item` / `item` | `CsiwoItem` / `csiwo_item` |
| `Weapon` / `weapon` | `CsiwoWeapon` / `csiwo_weapon` |
| `Armor` / `armor` | `CsiwoArmor` / `csiwo_armor` |

Ces entités CSIWO auront des propriétés différentes (ex. `isTwoHanded` sur les armes, `isAmbidextrous` sur le personnage, `maxCapacity` sur les items) et ne doivent pas polluer le modèle encyclopédie.

---

## ✅ Fait

### Système de cartes (`GameMap` + `MapZone`)
- Entités, repositories, migration
- Admin CRUD avec éditeur visuel canvas (drag-to-draw zones)
- Vue joueur `/map/{slug}` avec zones cliquables, panning, tooltips
- Vue détail zone `/map/{slug}/{zoneSlug}`
- Accès sécurisé `ROLE_USER`
- Carte Centralis seedée manuellement (limitation PHP upload 8 Mo)

### Entité `Player` — économie & inventaire
- `money` (INT, max 99 999 999, helpers `addMoney`)
- `premiumMoney` (INT, max 99 999 999, helpers `addPremiumMoney`)
- `inventory` (JSON, helpers `addToInventory` / `removeFromInventory` avec auto-stacking)
- Migration `Version20260519000001` + correctif `Version20260519000002`
- ⚠️ `equipment` et `isAmbidextrous` déplacés sur `CharacterMmo` (pas sur Player)

### Entité `CharacterMmo`
- Champs : `name`, `appearance`, `classLevel`, `experience`, `currentPv`, `currentEg`, `spentAttributePoints` (JSON)
- Stats calculées dynamiquement via `computeStats()` (pas stockées en base)
- `currentPv` / `currentEg` persistés et clampés au max calculé
- Délégation stricte vers `ClassMmo` : `getUsableWeapons()`, `isAmbidextrous()`, etc.
- Helpers : `healPv`, `damagePv`, `isAlive`, `spendEg`, `addExperience`, `spendAttributePoint`
- Migration `Version20260519000003`

### Entité `ClassMmo`
- `baseStats` (Stats embeddable, prefix `base_`), `statsGrowth` (JSON)
- `evolvesTo` (JSON array d'IDs), `usableWeapons`, `usableArmors`, `learnSpells`, `elementalTypes`
- `isAmbidextrous`, `roleId`
- `computeStatsAtLevel(int $level): Stats`
- Migration `Version20260519000004`
- Admin CRUD dans `/admin/csiwo/class` avec form complet (stats, croissance, évolution, armes/armures, sorts)
- Sorts appris : select dynamique niveau → SkillMmo (comme Character admin)

### Entité `SkillMmo`
- Calque de `Skill` sans `gameId`
- `triggersFunction` : clé nullable vers `TRIGGER_FUNCTIONS` (constante avec 6 fonctions à affiner)
- `getTriggersFunctionLabel()` helper
- Repository : `findPlayerSkills()` / `findEnemySkills()`
- Migration `Version20260519000006`
- Admin CRUD dans `/admin/csiwo/skill`

### `csiwoExclusive` sur types d'armes/armures
- Colonne `csiwo_exclusive` sur `weapon_types` et `armor_types`
- `findForCsiwo()` dans les deux repositories (filtre les exclusifs CSI1/CSI2/CsiRogue)
- Checkbox dans les forms admin weapon-type et armor-type
- Migration `Version20260519000005`

### Sous-section admin CSIWO (`/admin/csiwo`)
- Dashboard avec cartes : Cartes, Classes MMO, Compétences MMO
- `AdminCsiwoController` dédié

---

## ⚠️ État de déploiement

La partie MMO (routes `/map`, `/admin/csiwo`, entités CharacterMmo/ClassMmo/SkillMmo/GameMap) est **dev uniquement pour l'instant**.
Elle ne doit pas être accessible en production avant que le gameplay de base soit stable.

À faire avant de passer en prod :
- Désactiver ou conditionner les routes MMO en prod (via `when@prod` dans les routes, ou un feature flag)
- S'assurer que les migrations sont rejouables proprement sur la base prod
- Définir les droits d'accès MMO (rôle dédié `ROLE_MMO` ?)

---

## À faire

### Entités objets CSIWO ← prochain chantier
Héritent de leurs homologues encyclopédie (`Weapon`, `Armor`, `Item`) via héritage Doctrine
(stratégie à choisir : `JOINED` pour avoir les colonnes communes + une table d'extension, ou `SINGLE_TABLE`).
- [ ] `WeaponMmo` extends `Weapon` — ajouter `isTwoHanded` (bool), potentiellement d'autres champs MMO
- [ ] `ArmorMmo` extends `Armor` — champs supplémentaires MMO si nécessaire
- [ ] `ItemMmo` extends `Item` — ajouter `maxCapacity` (int), effets consommable
- [ ] Migrations correspondantes
- [ ] Admin CRUD pour chacune + cartes dans le dashboard CSIWO
- [ ] Mettre à jour `findForCsiwo()` des repositories pour cibler les sous-classes

### Boîtes de dialogues
- [ ] Réfléchir à la structure : entité `Dialogue` (arbre de choix ? séquentiel ?) liée à un NPC / zone / quête
- [ ] Système de conditions d'affichage (level requis, quête en cours, flag, etc.)
- [ ] Interface admin pour créer/éditer des dialogues (éditeur de nœuds ?)

### Système de quêtes & progression
- [ ] Entité `Quest` — titre, description, conditions de déclenchement, récompenses
- [ ] Entité `QuestStep` — étapes séquentielles avec objectifs (tuer X, livrer Y, parler à Z)
- [ ] Entité `PlayerQuest` (pivot Player ↔ Quest) — statut (active, terminée, échouée), progression
- [ ] Système de progression général : XP, niveaux, déblocages (sorts, zones, classes)

### Équipement personnage
- [ ] Définir les slots définitifs sur `CharacterMmo::equipment` JSON
- [ ] Helpers `equip(slot, type, id)` / `unequip(slot)` sur `CharacterMmo`
- [ ] Résolution `getEquippedEntity(slot)` via repository
- [ ] Validation : vérifier que l'arme/armure est utilisable par la classe avant d'équiper

### Gameplay MMO
- [ ] Système de combat (tour par tour)
- [ ] Déclenchement des `triggersFunction` des SkillMmo
- [ ] Système de boutique / marchands (lié aux zones de type `shop`)
- [ ] Système de donjons (lié aux zones de type `dungeon`)
- [ ] `ATTRIBUTE_VALUES` sur `CharacterMmo` à calibrer (actuellement tous à 0)

### API
- [ ] Exposer `money`, `premiumMoney`, `inventory` dans `/api/player/profile`
- [ ] Endpoints pour équipement et personnages MMO

### Admin Player
- [ ] Afficher/éditer `money` et `premiumMoney` sur la fiche joueur admin

---

## Questions résolues

**`equipment` sur Player ou CharacterMmo ?**
Sur `CharacterMmo` — chaque personnage a son propre équipement, pas le compte joueur.

**`left_hand` — type ambigu (arme ou armure) ?**
- Par défaut, `left_hand` accepte uniquement des armures de type off-hand/bouclier.
- Si `ClassMmo::isAmbidextrous = true`, le slot accepte aussi toute arme avec `CsiwoWeapon::isTwoHanded = false`.

**Taille max de l'inventaire ?**
Pas de limite globale. Chaque item aura une propriété `maxCapacity` (quantité max par stack).

**Duplicatas en inventaire ?**
Oui, plusieurs exemplaires du même objet sont possibles (stacks séparés si `maxCapacity` différent).
