Créez votre premier Système FoundryVTT

Un tutoriel progressif et complet pour maîtriser le développement de systèmes pour FoundryVTT v13. De la structure de base aux fonctionnalités avancées.

FoundryVTT v13 ES Modules Application V2
mon-systeme.mjs
Hooks.once("init", function() {
  console.log("Mon Système | Initialisation");
  
  // Enregistrer les DataModels
  CONFIG.Actor.dataModels = {
    character: CharacterData,
    npc: NPCData
  };
  
  // Enregistrer les feuilles
  DocumentSheetConfig.registerSheet(
    Actor, "mon-systeme", 
    CharacterSheet,
    { types: ["character"], makeDefault: true }
  );
});

Pourquoi ce tutoriel ?

📚

Basé sur dnd5e

Apprenez les meilleures pratiques en analysant le système dnd5e 5.2.0, la référence en matière de développement FoundryVTT.

🎯

Progressif

Chaque chapitre s'appuie sur le précédent. Commencez par les bases et avancez vers les concepts les plus avancés.

💻

Pratique

Des exemples de code fonctionnels à chaque étape. Copiez, adaptez et expérimentez.

🔄

À jour

Couvre les dernières API de FoundryVTT v13 : ApplicationV2, DataModels, système de hooks moderne.

Prérequis

Avant de commencer, assurez-vous d'avoir les outils et connaissances suivants.

🛠️

Outils requis

  • Node.js 18+ - Pour les outils de build
  • FoundryVTT v13 - Installé et fonctionnel
  • Éditeur de code - VS Code recommandé
  • Git - Pour le versioning
🧠

Connaissances requises

  • JavaScript ES6+ - Classes, modules, async/await
  • HTML/CSS - Structure et styles basiques
  • JSON - Format de configuration
  • Handlebars - Templates (optionnel, expliqué)
📖

Recommandé

  • Expérience utilisateur de FoundryVTT
  • Avoir créé un module simple
  • Connaissances en TypeScript (bonus)
  • Familiarité avec un système JDR

Installation rapide de l'environnement

# Vérifier Node.js
node --version  # Doit être >= 18.0.0

# Créer le dossier du système
cd /chemin/vers/foundrydata/Data/systems
mkdir mon-systeme && cd mon-systeme

# Initialiser le projet
npm init -y

Chapitres du Tutoriel

9 chapitres pour maîtriser le développement de systèmes FoundryVTT. Suivez-les dans l'ordre pour une progression optimale.

00
Débutant

Architecture d'un Système

Vue d'ensemble de la structure d'un système FoundryVTT. Arborescence des fichiers, cycle de vie, et flux de données.

  • Arborescence type
  • Hooks init → ready
  • Flux de données
Lire le chapitre →
01
Débutant

Manifeste system.json

Guide complet du fichier manifeste. Configuration des types de documents, compendiums et métadonnées.

  • Champs obligatoires
  • documentTypes
  • Compendiums (packs)
Lire le chapitre →
02
Débutant

DataModels et Schémas

Définissez vos modèles de données avec TypeDataModel. Validation, migration et champs personnalisés.

  • defineSchema()
  • Types de champs
  • Templates (mixins)
Lire le chapitre →
03
Intermédiaire

Documents et Extensions

Étendez les Documents Foundry (Actor, Item, ActiveEffect) pour implémenter votre logique métier.

  • Cycle de vie
  • prepareData()
  • Pattern mixin
Lire le chapitre →
04
Intermédiaire

Applications et Sheets

Créez des interfaces modernes avec ApplicationV2. Système de PARTS, actions déclaratives, et composants.

  • ApplicationV2
  • Système PARTS
  • data-action
Lire le chapitre →
05
Intermédiaire

Système de Hooks

Maîtrisez le système d'événements de FoundryVTT. Interceptez et réagissez aux actions du système pour étendre les fonctionnalités.

  • Hooks.on / once
  • call vs callAll
  • Hooks personnalisés
Lire le chapitre →
06
Intermédiaire

Système de Dés

Implémentez des mécaniques de jets personnalisées. D20Roll, DamageRoll et dialogues de configuration.

  • Classe Roll
  • Jets personnalisés
  • Messages de chat
Lire le chapitre →
07
Intermédiaire

Templates Handlebars

Maîtrisez la syntaxe Handlebars pour créer des interfaces dynamiques. Découvrez les helpers natifs de Foundry et créez les vôtres.

  • Syntaxe Handlebars
  • Helpers Foundry
  • Partials
Lire le chapitre →
08
Avancé

Canvas et Visuels

Le Canvas est le cœur graphique de FoundryVTT. Étendez les Tokens, MeasuredTemplates et layers pour personnaliser l'expérience visuelle.

  • PIXI.js
  • Tokens
  • MeasuredTemplates
Lire le chapitre →

Un Aperçu du Code

Voici à quoi ressemble un DataModel simple pour un personnage.

// module/data/actor/character.mjs
export default class CharacterData extends foundry.abstract.TypeDataModel {
  
  static defineSchema() {
    const fields = foundry.data.fields;
    
    return {
      // Attributs de base
      attributes: new fields.SchemaField({
        hp: new fields.SchemaField({
          value: new fields.NumberField({ 
            initial: 10, 
            integer: true, 
            min: 0 
          }),
          max: new fields.NumberField({ 
            initial: 10, 
            integer: true, 
            min: 1 
          })
        }),
        level: new fields.NumberField({ 
          initial: 1, 
          integer: true, 
          min: 1, 
          max: 20 
        })
      }),
      
      // Biographie
      biography: new fields.HTMLField({ initial: "" })
    };
  }
  
  // Données dérivées
  prepareDerivedData() {
    // Calculer le bonus de maîtrise
    this.proficiencyBonus = Math.floor((this.attributes.level - 1) / 4) + 2;
  }
}
// module/applications/actor/character-sheet.mjs
export default class CharacterSheet extends foundry.applications.sheets.ActorSheetV2 {
  
  static DEFAULT_OPTIONS = {
    classes: ["mon-systeme", "actor", "character"],
    position: { width: 600, height: 700 },
    actions: {
      rollAttribute: CharacterSheet.#onRollAttribute
    }
  };

  static PARTS = {
    header: { template: "systems/mon-systeme/templates/actor/header.hbs" },
    tabs: { template: "systems/mon-systeme/templates/actor/tabs.hbs" },
    attributes: { template: "systems/mon-systeme/templates/actor/attributes.hbs" },
    biography: { template: "systems/mon-systeme/templates/actor/biography.hbs" }
  };

  async _prepareContext(options) {
    const context = await super._prepareContext(options);
    context.isEditable = this.isEditable;
    context.system = this.actor.system;
    return context;
  }

  static async #onRollAttribute(event, target) {
    const attr = target.dataset.attribute;
    // Logique de jet...
  }
}
<!-- templates/actor/attributes.hbs -->
<section class="attributes-panel">
  <h2>Attributs</h2>
  
  <div class="attribute-group">
    <label>Points de Vie</label>
    <div class="hp-bar">
      <input type="number" 
             name="system.attributes.hp.value" 
             value="{{system.attributes.hp.value}}"
             min="0" 
             max="{{system.attributes.hp.max}}">
      <span class="separator">/</span>
      <input type="number" 
             name="system.attributes.hp.max" 
             value="{{system.attributes.hp.max}}"
             min="1">
    </div>
  </div>
  
  <div class="attribute-group">
    <label>Niveau</label>
    <input type="number" 
           name="system.attributes.level" 
           value="{{system.attributes.level}}"
           min="1" max="20">
    <span class="derived">
      Bonus de maîtrise: +{{system.proficiencyBonus}}
    </span>
  </div>
</section>

Ressources

Liens utiles pour approfondir vos connaissances.

🤖 Contexte pour IA

Vous utilisez un assistant IA pour développer votre système FoundryVTT ? Téléchargez notre documentation complète au format Markdown pour enrichir le contexte de votre IA.

📦

Documentation Markdown

Archive contenant tous les guides techniques et bonnes pratiques au format .md, prêts à être injectés dans le contexte de votre assistant IA (Claude, ChatGPT, Copilot, etc.).

  • 📄 9 guides techniques complets (Architecture → Canvas)
  • ✅ Bonnes pratiques et anti-patterns
  • 🔍 Analyse critique du système dnd5e
  • 📊 ~7000 lignes de documentation
📥 Télécharger docs.zip
💡 Conseil d'utilisation : Extrayez l'archive et ajoutez les fichiers .md pertinents au contexte de votre conversation avec l'IA avant de poser vos questions sur le développement FoundryVTT.