# CSI World Online — Notes de développement

## Architecture générale

Application Symfony 7.4 avec deux sections distinctes :
- **Site compagnon** (encyclopédie, calculateur de dégâts) — existant
- **CSI World Online** — le mini-MMO navigateur en cours de développement

---

## Système de cartes interactives

### Entités
- `GameMap` (`game_map`) — carte avec nom, slug unique, fichier image, description, is_active
- `MapZone` (`map_zone`) — zone cliquable avec coordonnées pixel naturelles (x, y, width, height), type, slug unique par carte

Types de zones : `town`, `dungeon`, `field`, `raid`, `event`, `shop`

### Stockage des images
Les images de cartes sont stockées dans `public/uploads/maps/` (fichiers statiques, pas en BDD).

**Limitation PHP WAMP :** `post_max_size = 8M` et `upload_max_filesize = 2M` par défaut.
Pour les grandes images (ex. Centralis.png = 13.66 MB), utiliser la procédure manuelle :
1. Copier le fichier dans `public/uploads/maps/`
2. Insérer la ligne directement en SQL

```sql
INSERT INTO game_map (name, slug, filename, description, is_active)
VALUES ('Centralis', 'centralis', 'map_centralis.png', 'Description...', 1);
```

### Données en place
| ID | Nom | Slug | Fichier | Active |
|---|---|---|---|---|
| 2 | Centralis | centralis | map_centralis.png | oui |

### Routes admin
| Route | URL |
|---|---|
| `admin_map_index` | `/admin/map` |
| `admin_map_new` | `/admin/map/new` |
| `admin_map_edit` | `/admin/map/{id}/edit` |
| `admin_map_zone_index` | `/admin/map/{mapId}/zones` |
| `admin_map_zone_new` | `/admin/map/{mapId}/zone/new` |
| `admin_map_zone_edit` | `/admin/map/{mapId}/zone/{id}/edit` |

### Routes joueur
| Route | URL |
|---|---|
| `map_index` | `/map` → redirige vers première carte active |
| `map_show` | `/map/{slug}` |
| `map_zone_show` | `/map/{slug}/{zoneSlug}` |

Accès : `ROLE_USER` requis (défini dans `config/packages/dev/security.yaml` et `prod/security.yaml`)

### Éditeur visuel de zones
- Canvas overlay sur l'image de la carte dans l'interface admin
- Drag-to-draw pour dessiner une zone → coordonnées écrites dans les champs du formulaire
- Coordonnées stockées en pixels naturels de l'image originale
- Facteur de scale appliqué uniquement à l'affichage canvas (`displayWidth / naturalWidth`)
- Zones existantes affichées en superposition colorée selon leur type

---

## Système de joueurs

### Entités liées
- `Player` — username, email, password, roles, createdAt, `avatar` (FK → PlayerAvatar), `description`
- `PlayerAvatar` — name, content (filename), defaultAvatar, isUploaded, uploaderId
- `PlayerAchievement` — lien Player ↔ Achievement

### Avatars
- Avatars par défaut dans `public/uploads/avatars/`
- Les joueurs choisissent parmi les avatars `defaultAvatar = true`
- Affiché dans le header (26px, circulaire) et sur le profil (80px)

### Succès
- `Achievement` a un champ `pointsValue` (entier, affiché en "G" dans le header)
- Header affiche : `X succès · Y G`

---

## Données de jeu (game-design.md)

Voir [game-design.md](game-design.md) pour le document de conception complet.

Points clés décidés :
- Pas de stamina — les HP s'épuisent directement au combat
- Progression par personnage (pas globale)
- Instances d'ennemis par joueur (pas de monde partagé pour les combats)
- ~8 classes de base → 2 branches → 8 classes avancées rares
- Craft présent
- Récompenses réelles (perks) pour les joueurs actifs

---

## Icônes RPG Maker

Deux tables LONGBLOB en BDD pour les icônes des jeux :
- `icons_csi_forever` — icônes CSI Forever et CSII Forever (id=0 pour index RPG Maker)
- `icons_narval_souls` — icônes Narval Souls

API : `GET /api/icon/{gameId}/{id}` — retourne l'image PNG directement.
Note : `NO_AUTO_VALUE_ON_ZERO` requis pour insérer id=0 en MySQL.
