# Vermine2047 System - Architecture Technique

## Table des matières
1. [Introduction](#introduction)
2. [Structure du Projet](#structure-du-projet)
3. [Configuration du Système](#configuration-du-système)
4. [Documents](#documents)
5. [Fiches (Sheets)](#fiches-sheets)
6. [Système de Dés](#système-de-dés)
7. [Combat](#combat)
8. [Gestion des Groupes](#gestion-des-groupes)
9. [Synchronisation](#synchronisation)
10. [Templates](#templates)
11. [Traductions](#traductions)

---

## Introduction

Vermine2047 est un système pour FoundryVTT (Virtual Tabletop) qui implémente les règles du jeu de rôle Vermine 2047. Ce document décrit l'architecture technique du système.

### Technologies utilisées
- **FoundryVTT**: v14 (compatible v11+)
- **Langage**: JavaScript (ES Modules)
- **Templates**: Handlebars
- **CSS**: Vanilla CSS avec Flexbox/Grid

### Version actuelle
- **Version**: 0.1.14 (après mise à jour)
- **Compatibilité**: FoundryVTT v11-v14

---

## Structure du Projet

```
vermine2047/
├── module/
│   ├── vermine2047.mjs              # Point d'entrée principal
│   ├── documents/
│   │   ├── actor.mjs                # Classe Actor étendue
│   │   └── item.mjs                 # Classe Item étendue
│   ├── sheets/
│   │   ├── actor-sheet.mjs          # Classe de base des feuilles d'acteur
│   │   ├── character-sheet.mjs      # Feuille de personnage
│   │   ├── npc-sheet.mjs            # Feuille de PNJ
│   │   ├── creature-sheet.mjs       # Feuille de créature
│   │   └── npc-group.mjs            # Feuille de groupe
│   │   └── item-sheet.mjs           # Feuille d'item
│   └── system/
│       ├── config.mjs               # Configuration du système
│       ├── hooks.mjs                # Hooks FoundryVTT
│       ├── roll.mjs                 # Logique des jets de dés
│       ├── dice3d.mjs               # Intégration Dice So Nice
│       ├── dialogs/
│       │   └── rollDialog.mjs       # Dialogue de jet de dés
│       ├── functions.mjs            # Fonctions utilitaires
│       ├── fight.mjs                # Système de combat
│       ├── effects.mjs              # Gestion des effets
│       ├── settings.mjs             # Paramètres du système
│       ├── tour.mjs                 # Visite guidée
│       ├── applications.mjs         # Applications (sélecteurs)
│       └── group-link.mjs           # Gestion des liens de groupe
├── templates/
│   ├── actor/
│   │   ├── actor-character-sheet.hbs
│   │   ├── actor-npc-sheet.hbs
│   │   ├── actor-creature-sheet.hbs
│   │   └── actor-group-sheet.hbs
│   ├── dialogs/
│   │   ├── roll-dialog.hbs
│   │   └── min-max-edit.hbs
│   ├── item/
│   │   └── chatCards/              # Templates de chat pour items
│   │       ├── *.hbs               # Par type d'item
│   └── roll-message.hbs            # Template de message de jet
├── lang/
│   ├── fr.json                      # Traductions françaises
│   └── en.json                      # Traductions anglaises
├── assets/
│   ├── icons/                      # Icônes
│   ├── images/                     # Images
│   └── style/                      # Styles CSS
├── packs/                          # Compendiums
├── system.json                     # Métadonnées du système
└── template.json                   # Structure des données
```

---

## Configuration du Système

### CONFIG.VERMINE

Toutes les configurations du système sont définies dans `module/system/config.mjs` et sont accessibles via `CONFIG.VERMINE`.

#### Catégories principales

1. **Niveaux d'âge (AgeTypes)**
   - Jeune (0-17 ans)
   - Adulte (18-46 ans)
   - Vieux (47+ ans)

2. **Niveaux de compétence (SkillLevels)**
   - 0: Incompétent
   - 1: Débutant
   - 2: Compétent
   - 3: Expert
   - 4: Maître
   - 5: Légende

3. **Niveaux de difficulté (DifficultyLevels)**
   - 1: Evidente (3+)
   - 2: Facile (5+)
   - 3: Difficile (7+)
   - 4: Très difficile (9+)
   - 5: Impossible (10+)

4. **Niveaux de menace (ThreatLevels)** - Pour les PNJ
   - 1: Mineure
   - 2: Sérieuse
   - 3: Majeure
   - 4: Mortelle

5. **Niveaux d'expérience (ExperienceLevels)** - Pour les PNJ
   - 1: Débutant
   - 2: Compétent
   - 3: Expert
   - 4: Maître

6. **Niveaux de rôle (RoleLevels)** - Pour les PNJ
   - 1: Mineur
   - 2: Secondaire
   - 3: Important
   - 4: Majeur

7. **Niveaux de gabarit (PatternLevels)** - Pour les créatures
   - 1: Insecte
   - 2: Rat
   - 3: Chien
   - 4: Ours

8. **Niveaux de taille (SizeLevels)** - Pour les créatures
   - 1: Petit
   - 2: Moyen
   - 3: Grand

9. **Niveaux de meute (PackLevels)** - Pour les créatures
   - 0: Solitaire
   - 1: Petit groupe
   - 2: Groupe
   - 3: Grande meute

10. **Catégories de caractéristiques (abilityCategories)**
    - physical: Physique
    - manual: Manuel
    - mental: Mental
    - social: Social

11. **Caractéristiques (abilities)**
    - vigor: Vigueur
    - health: Santé
    - precision: Précision
    - reflexes: Réflexes
    - knowledge: Connaissance
    - perception: Perception
    - will: Volonté
    - empathy: Empathie

12. **Catégories de compétences (skillCategories)**
    - man: Humain
    - animal: Animal
    - tool: Outil
    - weapon: Arme
    - survival: Survie
    - world: Monde

13. **Totems (totems)**
    - human: Humain
    - predator: Prédateur
    - scavenger: Charognard
    - symbiote: Symbiote
    - parasite: Parasite
    - builder: Bâtisseur
    - horde: Horde
    - hive: Ruche
    - loner: Solitaire
    - adapted: Adapté

14. **Totems opposés (totem_opposites)**
    - human ↔ adapted
    - predator ↔ scavenger
    - symbiote ↔ parasite
    - builder ↔ horde
    - hive ↔ loner

15. **Domaines des totems (totemDomains)** - NOUVEAU
    Chaque totem a des domaines de prédilection qui accordent des bonus
    - human: ["man", "world"]
    - adapted: ["animal", "survival"]
    - etc.

16. **Origines (origins)**
    Liste des origines possibles pour les personnages

17. **Traits (traits)**
    Liste des traits disponibles pour les items avec leurs descriptions

18. **Types de dégâts (damageTypes)**
    - choc
    - lame
    - feu
    - balle

19. **Statuts de combat (combatStatus)**
    - offensif: 5
    - actif: 7
    - passif: 9

---

## Documents

### VermineActor

La classe `VermineActor` étend la classe `Actor` de FoundryVTT et ajoute des fonctionnalités spécifiques à Vermine2047.

#### Méthodes principales

- **prepareData()**: Prépare les données de l'acteur
- **prepareBaseData()**: Prépare les données de base
- **prepareDerivedData()**: Prépare les données dérivées
- **_prepareCharacterData()**: Prépare les données spécifiques aux personnages
- **_prepareNpcData()**: Prépare les données spécifiques aux PNJ
- **getRollData()**: Retourne les données pour les jets de dés
- **prepareCombatStatus()**: Prépare le statut de combat

#### Propriétés calculées

- **ageType**: Type d'âge basé sur l'âge du personnage
- **modFromAgeSelfControl**: Modificateur de Sang-Froid basé sur l'âge
- **modFromAgeEffort**: Modificateur d'Effort basé sur l'âge
- **modFromAgeWounds**: Modificateurs de blessures basés sur l'âge

#### Données d'un Personnage (character)

```json
{
  "adaptation": {
    "value": 1,
    "totems": {
      "human": { "value": 1, "min": 0, "max": 3 },
      "adapted": { "value": 1, "min": 0, "max": 3 }
    }
  },
  "identity": {
    "height": 0,
    "weight": 0,
    "totem": "",
    "age": 15,
    "ageType": 2,
    "profile": "",
    "theme": "",
    "instincts": "",
    "prohibits": "",
    "objectives": "",
    "relations": "",
    "biography": ""
  },
  "attributes": {
    "xp": { "value": 0, "max": 10 },
    "reputation": { "value": 0, "max": 10 },
    "self_control": { "value": 0, "min": 0, "max": 5 },
    "effort": { "value": 0, "min": 0, "max": 5 }
  },
  "abilities": {
    "vigor": { "value": 1, "min": 0, "max": 5, "category": "physical" },
    "health": { "value": 1, "min": 0, "max": 5, "category": "physical" },
    "precision": { "value": 1, "min": 0, "max": 5, "category": "manual" },
    "reflexes": { "value": 1, "min": 0, "max": 5, "category": "manual" },
    "knowledge": { "value": 1, "min": 0, "max": 5, "category": "mental" },
    "perception": { "value": 1, "min": 0, "max": 5, "category": "mental" },
    "will": { "value": 1, "min": 0, "max": 5, "category": "social" },
    "empathy": { "value": 1, "min": 0, "max": 5, "category": "social" }
  },
  "skills": { ... }, // 30+ compétences avec valeur (0-5)
  "skill_categories": {
    "preferred": "",
    "man": { "label": "VERMINE.skill_category.man", "preferred": false },
    "animal": { ... },
    "tool": { ... },
    "weapon": { ... },
    "survival": { ... },
    "world": { ... }
  },
  "encounters": [], // NOUVEAU: Liste des groupes/rencontres
  "combatStatus": { "label": "", "difficulty": 7 },
  "minorWound": { "threshold": 1, "value": 0, "min": 0, "max": 5 },
  "majorWound": { "threshold": 4, "value": 0, "min": 0, "max": 4 },
  "deadlyWound": { "threshold": 8, "value": 0, "min": 0, "max": 2 }
}
```

#### Données d'un PNJ (npc)

```json
{
  "age": 15,
  "skills": "",
  "threat": { "value": 1, "min": 1, "max": 4 },
  "experience": { "value": 1, "min": 1, "max": 4 },
  "role": { "value": 1, "min": 1, "max": 4 }
}
```

#### Données d'un Groupe (group)

```json
{
  "identity": {
    "totem": "",
    "profile": "",
    "origin": "",
    "theme": "",
    "instincts": "",
    "prohibits": "",
    "major_objectives": "",
    "minor_objectives": "",
    "notes": ""
  },
  "level": { "value": 0, "min": 0, "max": 3 },
  "reputation": { "value": 10, "min": 2, "max": 10 },
  "morale": { "level": "high", "value": 7, "min": 1, "max": 7 },
  "members": [],
  "encounters": []
}
```

#### Données d'une Créature (creature)

```json
{
  "skills": "",
  "modes": {
    "survival": true,
    "nightmare": true,
    "apocalypse": false
  },
  "pattern": { "value": 1, "min": 1, "max": 4 },
  "size": { "value": 1, "min": 1, "max": 4 },
  "role": { "value": 1, "min": 1, "max": 4 },
  "pack": { "value": 0, "min": 0, "max": 3 }
}
```

### VermineItem

La classe `VermineItem` étend la classe `Item` de FoundryVTT.

#### Types d'items

1. **item**: Objet général
2. **weapon**: Arme
3. **defense**: Protection
4. **vehicle**: Véhicule
5. **ability**: Capacité
6. **specialty**: Spécialité
7. **background**: Historique
8. **trauma**: Traumatisme
9. **evolution**: Évolution
10. **rumor**: Rumeur
11. **target**: Cible
12. **rite**: Rite

#### Méthodes principales

- **prepareData()**: Prépare les données de l'item
- **prepareBaseData()**: Prépare les données de base
- **getRollData()**: Retourne les données pour les jets de dés
- **roll()**: Effectue un jet de dés pour l'item

#### Données communes à tous les items

```json
{
  "description": "",
  "rarity": { "value": 3, "handicap": 0 },
  "reliability": 3,
  "handicap": 0,
  "quantity": 1,
  "weight": 0,
  "traits": {},
  "damages": {
    "value": 0,
    "min": 0,
    "max": 5,
    "pannes": ["mineure", "mineure", "grave", "grave", "critique"],
    "state": ["endommagé", "endommagé", "défectueux", "défectueux", "hors d'usage"],
    "effect": ["bonus annulé", "bonus annulé", "malus 1D", "malus 1D", "inutilisable"]
  }
}
```

#### Données spécifiques par type

**weapon**:
```json
{
  "min_range": 0,
  "max_range": 0,
  "damage": { "value": 0, "type": "", "addVigor": false },
  "ammo": 0
}
```

**defense**:
```json
{
  "level": 0,
  "specificLevel": { "label": "", "level": 0 },
  "mobility": 0,
  "isShield": false
}
```

**ability**:
```json
{
  "type": "",
  "totem": "",
  "learn": { "threshold": 5, "hindrance": 0 },
  "level": { "value": 1, "min": 1, "max": 3 },
  "effects": []
}
```

**specialty**:
```json
{
  "skill": ""
}
```

**rite**:
```json
{
  "rituel": "",
  "transe": "",
  "ability": "",
  "effect": ""
}
```

---

## Fiches (Sheets)

### Hierarchie des classes

```
ActorSheet (FoundryVTT)
└── VermineActorSheet
    ├── VermineCharacterSheet
    ├── VermineNpcSheet
    ├── VermineCreatureSheet
    └── VermineGroupSheet

ItemSheet (FoundryVTT)
└── VermineItemSheet
```

### VermineCharacterSheet

Fiche pour les personnages joueurs.

#### Onglets
1. **Caractéristiques et compétences** (abilities)
   - Caractéristiques (8)
   - Compétences (30+) groupées par catégorie
   - Domaines de prédilection
   - Spécialités
2. **Totem et ajustements** (totem)
   - Sélection du totem
   - Dés de totem (humain/adapté)
   - Capacités de totem
   - Capacités
   - Spécialités
   - Historiques
   - Traumatismes
   - Évolutions
3. **Combat et réserves** (combat)
   - Statuts de combat (offensif/actif/passif)
   - Réserves (Effort, Sang-Froid)
   - Blessures
4. **Matériel** (equipment)
   - Armes
   - Protections
   - Véhicules
   - Objets
5. **Histoire** (stories)
   - Identity (nom, âge, origine, etc.)
   - Objectifs
   - Relations
   - Biographie

#### Fonctionnalités

- Création de spécialités depuis les compétences
- Gestion des dés de totem (cliquables)
- Mode jeu/edit (désactive les inputs en mode jeu)
- Roll sur les caractéristiques et compétences

### VermineNpcSheet

Fiche pour les PNJ.

#### Sélecteurs
- **Menace**: 1-4 (sélecteur)
- **Expérience**: 1-4 (sélecteur)
- **Rôle**: 1-4 (sélecteur)

#### Onglets
1. **Caractéristiques et compétences**
   - Menace (attaque, vigueur, blessures)
   - Expérience (action, spécialités, relances, contact)
   - Rôle (réaction, réserves, matériel, protection)
2. **Matériel**
3. **Combat**

### VermineCreatureSheet

Fiche pour les créatures.

#### Sélecteurs
- **Gabarit**: 1-4 (sélecteur)
- **Taille**: 1-3 (sélecteur)
- **Rôle**: 1-4 (sélecteur)
- **Groupe**: 0-3 (sélecteur)
- **Modes**: Survie, Cauchemar, Apocalypse (checkboxes)

#### Onglets
1. **Caractéristiques et compétences**
   - Gabarit (attaque, dégâts, blessures)
   - Taille (attaque, vigueur, blessures)
   - Rôle (réaction, réserves, matériel, protection)
   - Meute (attaque, dégâts, blessures)
2. **Combat**

### VermineGroupSheet

Fiche pour les groupes.

#### Fonctionnalités
- Sélection du totem
- Gestion des membres (ajout/suppression)
- Gestion des rencontres (ajout/suppression)

#### Synchronisation
- Les membres sont stockés dans `system.members` (IDs)
- Les rencontres sont stockées dans `system.encounters` (IDs)
- Les groupes d'un acteur sont stockés dans `system.encounters` (IDs)

### VermineItemSheet

Fiche pour les items.

#### Types gérés
- item
- weapon
- defense
- vehicle
- ability
- specialty
- background
- trauma
- evolution
- rumor
- target
- rite

---

## Système de Dés

### VermineUtils.roll()

Méthode principale pour effectuer un jet de dés.

#### Paramètres

```javascript
{
  actor: Actor,          // L'acteur qui lance les dés
  NoD: number,          // Nombre de dés de base
  Reroll: number,       // Nombre de relances autorisées
  difficulty: number,    // Difficulté du jet (3-10)
  self_control: number, // Sang-Froid utilisé
  rollLabel: string,    // Libellé du jet
  totems: object,        // { human: boolean, adapted: boolean }
  max_effort: number,    // Effort maximum
  skillCategory: string, // Catégorie de compétence pour les bonus de domaine
  keepTotem: string,     // Totem à garder ('human' ou 'adapted')
  skillLevel: number,    // Niveau de la compétence pour les réussites automatiques
  hasSpecialty: boolean   // Si une spécialité est utilisée
}
```

#### Fonctionnement

1. **Calcul des bonus/malus de totem**
   - Si une catégorie de compétence est spécifiée, calcule les bonus/malus basés sur le domaine de prédilection
   - Bonus: +1 dé si le domaine de prédilection est dans les domaines du totem
   - Malus: -1 dé si le domaine de prédilection est dans les domaines du totem opposé

2. **Réussites automatiques**
   - Niveau 2 (Compétent) + spécialité: +1 réussite automatique
   - Niveau 3 (Expert): +1 réussite automatique
   - Niveau 4 (Maître) + spécialité: +2 réussites automatiques
   - Niveau 5 (Légende): +2 réussites automatiques

3. **Seuils automatiques**
   - Niveau 0 (Incompétent): seuil = 9 (très difficile)
   - Niveau 1 (Débutant): seuil = 7 (difficile)
   - Niveau >= 2: utilise la difficulté spécifiée

4. **Gestion des totems**
   - Chaque totem utilisé ajoute un dé spécial avec double réussite possible
   - Le totem humain et adapté peuvent être utilisés simultanément
   - Si `keepTotem` est spécifié, seul un totem est utilisé

5. **Formule de jet**
   - Base: `{NoD}d10cs>={difficulty}[regular_{user}]`
   - Avec totem humain: `+ (1d10cs>={difficulty}[human_{user}]*2)`
   - Avec totem adapté: `+ (1d10cs>={difficulty}[adapted_{user}]*2)`

#### Exemple

```javascript
// Jet de compétence avec totem humain
VermineUtils.roll({
  actor: character,
  NoD: 3,                    // 3 dés de base
  difficulty: 7,             // Difficulté 7
  skillCategory: 'survival', // Catégorie de compétence
  skillLevel: 3,             // Niveau Expert
  hasSpecialty: true,        // Avec spécialité
  totems: { human: true, adapted: false } // Totem humain seulement
});
// Résultat: 4d10cs>=7[regular_user] + (1d10cs>=7[human_user]*2)
// avec 1 réussite automatique (niveau 3)
```

### RollDialog

Dialogue de jet de dés avancé.

#### Fonctionnalités
- Sélection de la caractéristique
- Sélection de la compétence
- Sélection de la spécialité (+1D)
- Sélection de la difficulté
- Sélection du handicap
- Bonus:
  - Entraide (+1D)
  - Groupe (0-5D)
  - Sang-Froid (0-5D, basé sur la caractéristique)
  - Équipement (+1D)
  - Dés de totem (humain/adapté)
- Affichage du total du pool de dés
- Choix du totem à garder (si les deux sont activés)

#### Structure du template
- Utilise `<details>`/`<summary>` pour une interface compacte
- Sections principales:
  - Sélection caractéristique + compétence
  - Difficulté + Handicap (section ouverte par défaut)
  - Bonus (section pliable)
  - Total du pool de dés

---

## Combat

### VermineCombat

Classe étendue de `Combat` de FoundryVTT.

#### Formules

- **Initiative**: `@abilities.reflexes.value + @skills.alertness.value)d10cs>=@combatStatus.difficulty`
- **Difficulté dynamique**:
  - Offensif: 5
  - Actif: 7
  - Passif: 9

#### Classes

- **VermineCombat**: Gestion du combat
- **VermineCombatTracker**: Tracker de combat personnalisé
- **VermineCombatant**: Combatant personnalisé

#### Statuts de combat

Chaque acteur a un `combatStatus` avec:
- `label`: "Offensif", "Actif", ou "Passif"
- `difficulty`: 5, 7, ou 9

### VermineFight

Classe pour la gestion des confrontations (ancien système).

À migrer vers le nouveau système de combat.

---

## Gestion des Groupes

### GroupLink

Classe pour la synchronisation bidirectionnelle entre acteurs et groupes.

#### Fonctionnalités

1. **Synchronisation automatique**
   - Quand un groupe est mis à jour, les acteurs membres sont notifiés
   - Quand un acteur est mis à jour, ses groupes sont notifiés

2. **Hooks enregistrés**
   - `updateActor`: Synchronise les groupes quand un acteur est mis à jour
   - `createActor`: Nettoie les références invalides
   - `deleteActor`: Retire l'acteur de tous ses groupes

3. **Méthodes utilitaires**
   - `getActorObjects(actorIds)`: Retourne les objets Actor pour une liste d'IDs
   - `getGroupMembers(group)`: Retourne les membres d'un groupe
   - `getGroupEncounters(group)`: Retourne les rencontres d'un groupe
   - `getActorGroups(actor)`: Retourne les groupes d'un acteur
   - `getActorEncounters(actor)`: Retourne les rencontres d'un acteur
   - `addActorToGroup(actorId, groupId)`: Ajoute un acteur à un groupe
   - `removeActorFromGroup(actorId, groupId)`: Retire un acteur d'un groupe

#### Exemple d'utilisation

```javascript
// Ajouter un acteur à un groupe
GroupLink.addActorToGroup('actor123', 'group456');

// Retirer un acteur d'un groupe
GroupLink.removeActorFromGroup('actor123', 'group456');

// Obtenir les membres d'un groupe
const members = GroupLink.getGroupMembers(group);
```

---

## Synchronisation

### Hooks principaux

#### Dans `module/vermine2047.mjs`
- Initialisation des classes globales
- Enregistrement des hooks GroupLink
- Pré-chargement des templates Handlebars
- Configuration de l'interface utilisateur (mode de jeu)

#### Dans `module/system/hooks.mjs`
- `diceSoNiceReady`: Configuration des dés 3D
- `renderChatMessage`: Gestion des relances de dés
- `updateUser`: Mise à jour des dés 3D pour l'utilisateur
- `ready`: Initialisation du système
- `renderPause`: Personnalisation de l'écran de pause
- `hotbarDrop`: Gestion du glisser-déposer sur la barre d'outils
- `getSceneControlButtons`: Ajout du bouton de lancer de dés
- `preCreateActor`: Image par défaut pour les acteurs
- `preCreateItem`: Image par défaut pour les items

### Hooks GroupLink

Voir [Gestion des Groupes](#gestion-des-groupes).

---

## Templates

### Structure

Tous les templates sont en format Handlebars (.hbs) et sont situés dans le dossier `templates/`.

#### Types de templates

1. **Templates principaux**
   - `templates/actor/actor-*.hbs`: Fiches d'acteurs
   - `templates/item/item-sheet.hbs`: Fiche d'item
   - `templates/roll-message.hbs`: Message de jet de dés
   - `templates/combat-tracker.hbs`: Tracker de combat

2. **Templates de dialogue**
   - `templates/dialogs/roll-dialog.hbs`: Dialogue de jet de dés
   - `templates/dialogs/min-max-edit.hbs`: Édition min/max

3. **Partials**
   - `templates/actor/parts/*`: Parties réutilisables des feuilles d'acteur
   - `templates/actor/character/*`: Parties spécifiques aux personnages
   - `templates/actor/group/*`: Parties spécifiques aux groupes
   - `templates/actor/npc/*`: Parties spécifiques aux PNJ
   - `templates/actor/creature/*`: Parties spécifiques aux créatures
   - `templates/item/partials/*`: Parties réutilisables des feuilles d'item

4. **Chat Cards**
   - `templates/item/chatCards/*.hbs`: Cartes de chat pour chaque type d'item

### Helpers Handlebars

Tous les helpers sont définis dans `module/system/handlebars-manager.mjs`.

#### Helpers de traduction
- `smarttl(arrayLabel, objectLabel, key)`: Traduction intelligente
- `smarttlk(arrayLabel, objectLabel, key)`: Traduction avec clé
- `smartcfg(configLabel, objectLabel)`: Traduction de configuration

#### Helpers de niveau
- `skillLevel(property, level)`: Propriété d'un niveau de compétence
- `diffLevel(property, level)`: Propriété d'un niveau de difficulté
- `threatLevel(property, level)`: Propriété d'un niveau de menace
- `experienceLevel(property, level)`: Propriété d'un niveau d'expérience
- `roleLevel(property, level)`: Propriété d'un niveau de rôle
- `patternLevel(property, level)`: Propriété d'un niveau de gabarit
- `sizeLevel(property, level)`: Propriété d'un niveau de taille
- `packLevel(property, level)`: Propriété d'un niveau de meute
- `ageType(property, level)`: Propriété d'un type d'âge
- `npcThreatLevel(property, level)`: Propriété d'un niveau de menace PNJ
- `npcExperienceLevel(property, level)`: Propriété d'un niveau d'expérience PNJ
- `npcRoleLevel(property, level)`: Propriété d'un niveau de rôle PNJ
- `creaturePatternLevel(property, level)`: Propriété d'un niveau de gabarit créature
- `creatureSizeLevel(property, level)`: Propriété d'un niveau de taille créature
- `creatureRoleLevel(property, level)`: Propriété d'un niveau de rôle créature
- `creaturePackLevel(property, level)`: Propriété d'un niveau de meute créature

#### Helpers de données
- `getDamagesData(damageObject, prop)`: Données de dégâts
- `concat(...args)`: Concatenation de chaînes
- `lower(str)`: Convertit en minuscules
- `toLowerCase(str)`: Convertit en minuscules
- `romanNumber(numb)`: Convertit un nombre en chiffre romain (I, II, III, etc.)

#### Helpers de comparaison
- `ife(arg1, arg2, options)`: Si égal
- `ifgt(a, b, options)`: Si supérieur
- `iflt(a, b, options)`: Si inférieur
- `ifgteq(a, b, options)`: Si supérieur ou égal
- `iflteq(a, b, options)`: Si inférieur ou égal
- `ifincludes(arg1, arg2, options)`: Si contient

#### Helpers mathématiques
- `math_add(a, b)`: Addition
- `math_subs(a, b)`: Soustraction
- `math_mult(a, b)`: Multiplication
- `math_div(a, b)`: Division

#### Helpers de boucle
- `repeat(times, start, indexLabel, block)`: Boucle avec index
- `setVar(varName, varValue, options)`: Définit une variable

---

## Traductions

### Structure

Les traductions sont définies dans les fichiers:
- `lang/fr.json`: Français
- `lang/en.json`: Anglais

### Namespaces principaux

- **SETTINGS**: Paramètres du monde
- **VERMINE**: Termes spécifiques au système
  - **ability**: Caractéristiques
  - **skills_title**: Compétences
  - **wounds**: Blessures
  - **tabs**: Onglets
- **ABILITIES**: Caractéristiques
- **SKILLS**: Compétences
- **SKILL_LEVELS**: Niveaux de compétence
- **DIFFICULTY_LEVELS**: Niveaux de difficulté
- **THREAT_LEVELS**: Niveaux de menace
- **EXPERIENCE_LEVELS**: Niveaux d'expérience
- **ROLE_LEVELS**: Niveaux de rôle
- **PATTERN_LEVELS**: Niveaux de gabarit
- **AGE_TYPES**: Types d'âge
- **ATTITUDES**: Attitudes de combat
- **ADVERSITY**: Adversité (PNJ/Créature)
- **TOTEMS**: Totems
- **GAME_MODES**: Modes de jeu
- **IDENTITY**: Identité
- **UI**: Interface utilisateur
- **ITEMS**: Items

### Ajout de traductions

Pour ajouter une nouvelle traduction:

1. Ajouter la clé dans les deux fichiers (fr.json et en.json)
2. Utiliser la clé avec `game.i18n.localize('NAMESPACE.key')` ou `{{localize 'NAMESPACE.key'}}` dans les templates

Exemple:
```json
{
  "VERMINE": {
    "new_feature": "Nouvelle fonctionnalité"
  }
}
```

---

## Bonnes pratiques

### Développement

1. **Always use strict mode**
2. **Use async/await** for asynchronous operations
3. **Error handling**: Always catch and handle errors
4. **Data validation**: Validate input data
5. **Performance**: Be mindful of performance in hooks

### Code style

1. **Naming**: Use camelCase for variables and functions, PascalCase for classes
2. **Comments**: Use JSDoc for functions and classes
3. **Imports**: Group related imports together
4. **Exports**: Use named exports for utility functions

### Templates

1. **Keep templates simple**: Move complex logic to helpers
2. **Use partials**: Reuse common template parts
3. **Accessibility**: Use proper labels and ARIA attributes
4. **Responsive**: Design for different screen sizes

### Internationalization

1. **Always use localization**: Never hardcode text
2. **Context**: Provide context in translation keys
3. **Fallback**: Provide fallback text for missing translations

---

## Dépendances

### Modules externes

- **Dice So Nice**: Pour les dés 3D
  - Configuration dans `module/system/dice3d.mjs`
  - Dé différents pour Vermine2047

### Compatibilité

- **FoundryVTT**: v11-v14
- **Testé avec**: v12, v14

---

## Résolution des problèmes

### Problèmes courants

1. **Templates not found**
   - Vérifier que le template existe dans le bon dossier
   - Vérifier que l'extension est `.hbs`
   - Vérifier que le template est pré-chargé dans `handlebars-manager.mjs`

2. **Translations missing**
   - Vérifier que la clé existe dans le fichier de langue
   - Vérifier que le namespace est correct
   - Utiliser `game.i18n.localize()` pour déboguer

3. **Hooks not firing**
   - Vérifier que le hook est bien enregistré
   - Vérifier que le hook est appelé au bon moment
   - Utiliser `CONFIG.debug.hooks = true` pour déboguer

4. **Data not updating**
   - Vérifier que les données sont bien modifiées
   - Vérifier que `actor.update()` ou `item.update()` est appelé
   - Vérifier que les hooks de synchronisation sont actifs

### Outils de débogage

1. **Console.log**
   ```javascript
   console.log('Debug:', data);
   ```

2. **Notifications**
   ```javascript
   ui.notifications.info('Message d'information');
   ui.notifications.warn('Avertissement');
   ui.notifications.error('Erreur');
   ```

3. **Dialogues de débogage**
   ```javascript
   new Dialog({
     title: 'Debug',
     content: `<pre>${JSON.stringify(data, null, 2)}</pre>`,
     buttons: { ok: { label: 'OK' } }
   }).render(true);
   ```

---

## Contribution

### Comment contribuer

1. **Fork** le dépôt
2. **Create** une branche pour votre fonctionnalité
3. **Commit** vos changements
4. **Push** à la branche
5. **Open** une Pull Request

### Guidelines

1. Suivre le style de code existant
2. Ajouter des tests si possible
3. Mettre à jour la documentation
4. Utiliser des messages de commit clairs

---

## Historique des versions

Voir `CHANGELOG.md` pour l'historique complet.

---

## Licence

Voir `LICENSE.txt` pour les détails de la licence.

---

## Auteurs

- François-Xavier Guillois
- Rwanoux (Discord: rwanoux)
- Pretre (Discord: pretre)

---

*Documentation générée: 2026-06-04*
*Version: 0.1.14*
