Implémentations majeures: - Classe GroupLink pour synchronisation bidirectionnelle acteurs↔groupes - Configuration complète des totems, PNJ et créatures - Redesign du RollDialog avec interface compacte et sélecteurs - Bonus/malus par domaine de totem - Réussites automatiques et seuils auto basés sur niveau de maîtrise - Choix du totem à garder avec recalcul des réussites - Conversion tous templates chat cards en .hbs - Fiches PNJ et Créature avec sélecteurs pour tous les niveaux - Documentation technique (ARCHITECTURE.md) et utilisateur (GUIDE_UTILISATEUR.md) - Mise à jour system.json pour compatibilité v14 - Tous les TODOs du README.md complétés Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
29 KiB
Vermine2047 System - Architecture Technique
Table des matières
- Introduction
- Structure du Projet
- Configuration du Système
- Documents
- Fiches (Sheets)
- Système de Dés
- Combat
- Gestion des Groupes
- Synchronisation
- Templates
- 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
-
Niveaux d'âge (AgeTypes)
- Jeune (0-17 ans)
- Adulte (18-46 ans)
- Vieux (47+ ans)
-
Niveaux de compétence (SkillLevels)
- 0: Incompétent
- 1: Débutant
- 2: Compétent
- 3: Expert
- 4: Maître
- 5: Légende
-
Niveaux de difficulté (DifficultyLevels)
- 1: Evidente (3+)
- 2: Facile (5+)
- 3: Difficile (7+)
- 4: Très difficile (9+)
- 5: Impossible (10+)
-
Niveaux de menace (ThreatLevels) - Pour les PNJ
- 1: Mineure
- 2: Sérieuse
- 3: Majeure
- 4: Mortelle
-
Niveaux d'expérience (ExperienceLevels) - Pour les PNJ
- 1: Débutant
- 2: Compétent
- 3: Expert
- 4: Maître
-
Niveaux de rôle (RoleLevels) - Pour les PNJ
- 1: Mineur
- 2: Secondaire
- 3: Important
- 4: Majeur
-
Niveaux de gabarit (PatternLevels) - Pour les créatures
- 1: Insecte
- 2: Rat
- 3: Chien
- 4: Ours
-
Niveaux de taille (SizeLevels) - Pour les créatures
- 1: Petit
- 2: Moyen
- 3: Grand
-
Niveaux de meute (PackLevels) - Pour les créatures
- 0: Solitaire
- 1: Petit groupe
- 2: Groupe
- 3: Grande meute
-
Catégories de caractéristiques (abilityCategories)
- physical: Physique
- manual: Manuel
- mental: Mental
- social: Social
-
Caractéristiques (abilities)
- vigor: Vigueur
- health: Santé
- precision: Précision
- reflexes: Réflexes
- knowledge: Connaissance
- perception: Perception
- will: Volonté
- empathy: Empathie
-
Catégories de compétences (skillCategories)
- man: Humain
- animal: Animal
- tool: Outil
- weapon: Arme
- survival: Survie
- world: Monde
-
Totems (totems)
- human: Humain
- predator: Prédateur
- scavenger: Charognard
- symbiote: Symbiote
- parasite: Parasite
- builder: Bâtisseur
- horde: Horde
- hive: Ruche
- loner: Solitaire
- adapted: Adapté
-
Totems opposés (totem_opposites)
- human ↔ adapted
- predator ↔ scavenger
- symbiote ↔ parasite
- builder ↔ horde
- hive ↔ loner
-
Domaines des totems (totemDomains) - NOUVEAU Chaque totem a des domaines de prédilection qui accordent des bonus
- human: ["man", "world"]
- adapted: ["animal", "survival"]
- etc.
-
Origines (origins) Liste des origines possibles pour les personnages
-
Traits (traits) Liste des traits disponibles pour les items avec leurs descriptions
-
Types de dégâts (damageTypes)
- choc
- lame
- feu
- balle
-
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)
{
"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)
{
"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)
{
"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)
{
"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
- item: Objet général
- weapon: Arme
- defense: Protection
- vehicle: Véhicule
- ability: Capacité
- specialty: Spécialité
- background: Historique
- trauma: Traumatisme
- evolution: Évolution
- rumor: Rumeur
- target: Cible
- 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
{
"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:
{
"min_range": 0,
"max_range": 0,
"damage": { "value": 0, "type": "", "addVigor": false },
"ammo": 0
}
defense:
{
"level": 0,
"specificLevel": { "label": "", "level": 0 },
"mobility": 0,
"isShield": false
}
ability:
{
"type": "",
"totem": "",
"learn": { "threshold": 5, "hindrance": 0 },
"level": { "value": 1, "min": 1, "max": 3 },
"effects": []
}
specialty:
{
"skill": ""
}
rite:
{
"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
- Caractéristiques et compétences (abilities)
- Caractéristiques (8)
- Compétences (30+) groupées par catégorie
- Domaines de prédilection
- Spécialités
- 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
- Combat et réserves (combat)
- Statuts de combat (offensif/actif/passif)
- Réserves (Effort, Sang-Froid)
- Blessures
- Matériel (equipment)
- Armes
- Protections
- Véhicules
- Objets
- 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
- 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)
- Matériel
- 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
- 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)
- 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
{
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
-
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é
-
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
-
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
-
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
keepTotemest spécifié, seul un totem est utilisé
-
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)
- Base:
Exemple
// 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
-
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
-
Hooks enregistrés
updateActor: Synchronise les groupes quand un acteur est mis à jourcreateActor: Nettoie les références invalidesdeleteActor: Retire l'acteur de tous ses groupes
-
Méthodes utilitaires
getActorObjects(actorIds): Retourne les objets Actor pour une liste d'IDsgetGroupMembers(group): Retourne les membres d'un groupegetGroupEncounters(group): Retourne les rencontres d'un groupegetActorGroups(actor): Retourne les groupes d'un acteurgetActorEncounters(actor): Retourne les rencontres d'un acteuraddActorToGroup(actorId, groupId): Ajoute un acteur à un grouperemoveActorFromGroup(actorId, groupId): Retire un acteur d'un groupe
Exemple d'utilisation
// 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 3DrenderChatMessage: Gestion des relances de désupdateUser: Mise à jour des dés 3D pour l'utilisateurready: Initialisation du systèmerenderPause: Personnalisation de l'écran de pausehotbarDrop: Gestion du glisser-déposer sur la barre d'outilsgetSceneControlButtons: Ajout du bouton de lancer de déspreCreateActor: Image par défaut pour les acteurspreCreateItem: Image par défaut pour les items
Hooks GroupLink
Voir Gestion des Groupes.
Templates
Structure
Tous les templates sont en format Handlebars (.hbs) et sont situés dans le dossier templates/.
Types de templates
-
Templates principaux
templates/actor/actor-*.hbs: Fiches d'acteurstemplates/item/item-sheet.hbs: Fiche d'itemtemplates/roll-message.hbs: Message de jet de déstemplates/combat-tracker.hbs: Tracker de combat
-
Templates de dialogue
templates/dialogs/roll-dialog.hbs: Dialogue de jet de déstemplates/dialogs/min-max-edit.hbs: Édition min/max
-
Partials
templates/actor/parts/*: Parties réutilisables des feuilles d'acteurtemplates/actor/character/*: Parties spécifiques aux personnagestemplates/actor/group/*: Parties spécifiques aux groupestemplates/actor/npc/*: Parties spécifiques aux PNJtemplates/actor/creature/*: Parties spécifiques aux créaturestemplates/item/partials/*: Parties réutilisables des feuilles d'item
-
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 intelligentesmarttlk(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étencediffLevel(property, level): Propriété d'un niveau de difficultéthreatLevel(property, level): Propriété d'un niveau de menaceexperienceLevel(property, level): Propriété d'un niveau d'expérienceroleLevel(property, level): Propriété d'un niveau de rôlepatternLevel(property, level): Propriété d'un niveau de gabaritsizeLevel(property, level): Propriété d'un niveau de taillepackLevel(property, level): Propriété d'un niveau de meuteageType(property, level): Propriété d'un type d'âgenpcThreatLevel(property, level): Propriété d'un niveau de menace PNJnpcExperienceLevel(property, level): Propriété d'un niveau d'expérience PNJnpcRoleLevel(property, level): Propriété d'un niveau de rôle PNJcreaturePatternLevel(property, level): Propriété d'un niveau de gabarit créaturecreatureSizeLevel(property, level): Propriété d'un niveau de taille créaturecreatureRoleLevel(property, level): Propriété d'un niveau de rôle créaturecreaturePackLevel(property, level): Propriété d'un niveau de meute créature
Helpers de données
getDamagesData(damageObject, prop): Données de dégâtsconcat(...args): Concatenation de chaîneslower(str): Convertit en minusculestoLowerCase(str): Convertit en minusculesromanNumber(numb): Convertit un nombre en chiffre romain (I, II, III, etc.)
Helpers de comparaison
ife(arg1, arg2, options): Si égalifgt(a, b, options): Si supérieuriflt(a, b, options): Si inférieurifgteq(a, b, options): Si supérieur ou égaliflteq(a, b, options): Si inférieur ou égalifincludes(arg1, arg2, options): Si contient
Helpers mathématiques
math_add(a, b): Additionmath_subs(a, b): Soustractionmath_mult(a, b): Multiplicationmath_div(a, b): Division
Helpers de boucle
repeat(times, start, indexLabel, block): Boucle avec indexsetVar(varName, varValue, options): Définit une variable
Traductions
Structure
Les traductions sont définies dans les fichiers:
lang/fr.json: Françaislang/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:
- Ajouter la clé dans les deux fichiers (fr.json et en.json)
- Utiliser la clé avec
game.i18n.localize('NAMESPACE.key')ou{{localize 'NAMESPACE.key'}}dans les templates
Exemple:
{
"VERMINE": {
"new_feature": "Nouvelle fonctionnalité"
}
}
Bonnes pratiques
Développement
- Always use strict mode
- Use async/await for asynchronous operations
- Error handling: Always catch and handle errors
- Data validation: Validate input data
- Performance: Be mindful of performance in hooks
Code style
- Naming: Use camelCase for variables and functions, PascalCase for classes
- Comments: Use JSDoc for functions and classes
- Imports: Group related imports together
- Exports: Use named exports for utility functions
Templates
- Keep templates simple: Move complex logic to helpers
- Use partials: Reuse common template parts
- Accessibility: Use proper labels and ARIA attributes
- Responsive: Design for different screen sizes
Internationalization
- Always use localization: Never hardcode text
- Context: Provide context in translation keys
- 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
- Configuration dans
Compatibilité
- FoundryVTT: v11-v14
- Testé avec: v12, v14
Résolution des problèmes
Problèmes courants
-
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
-
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
-
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 = truepour déboguer
-
Data not updating
- Vérifier que les données sont bien modifiées
- Vérifier que
actor.update()ouitem.update()est appelé - Vérifier que les hooks de synchronisation sont actifs
Outils de débogage
-
Console.log
console.log('Debug:', data); -
Notifications
ui.notifications.info('Message d'information'); ui.notifications.warn('Avertissement'); ui.notifications.error('Erreur'); -
Dialogues de débogage
new Dialog({ title: 'Debug', content: `<pre>${JSON.stringify(data, null, 2)}</pre>`, buttons: { ok: { label: 'OK' } } }).render(true);
Contribution
Comment contribuer
- Fork le dépôt
- Create une branche pour votre fonctionnalité
- Commit vos changements
- Push à la branche
- Open une Pull Request
Guidelines
- Suivre le style de code existant
- Ajouter des tests si possible
- Mettre à jour la documentation
- 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