# Corrections apportées au module Mournblade CYD 2.0 ## Date : 2026-06-07 ## Dernière mise à jour : 2026-06-07 ## Nouveautés et Améliorations (2026-06-07) ## Problèmes identifiés et corrigés ### 1. ❌ Erreur de chargement des partials Handlebars **Problème :** Les feuilles de personnage et de créature généraient une erreur lors du rendu : ``` Failed to render template part "sheet": The partial systems/fvtt-mournblade-cyd-2-0/templates/partial-active-effects.hbs could not be found ``` **Cause :** La fonction `preloadHandlebarsTemplates()` dans `modules/mournblade-cyd2-utility.js` ne préchargeait pas tous les partials nécessaires. Seuls 7 templates étaient préchargés sur 9 utilisés. **Partials manquants :** - `partial-active-effects.hbs` - Utilisé dans les feuilles actor-sheet.hbs et creature-sheet.hbs - `partial-item-effects.hbs` - Utilisé dans de nombreux templates d'items **Solution :** Ajout des deux partials manquants à la liste des templates préchargés dans la fonction `preloadHandlebarsTemplates()`. **Fichier modifié :** - `modules/mournblade-cyd2-utility.js` (lignes 189-201) **Code avant :** ```javascript const templatePaths = [ 'systems/fvtt-mournblade-cyd-2-0/templates/editor-notes-gm.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-header.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-description.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-nav.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-prix.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-automation.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/hud-adversites.hbs', ] ``` **Code après :** ```javascript const templatePaths = [ 'systems/fvtt-mournblade-cyd-2-0/templates/editor-notes-gm.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-header.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-description.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-nav.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-prix.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-automation.hbs', 'systems/fvtt-mournblade-cyd-2-0/templates/partial-active-effects.hbs', // ✅ Ajouté 'systems/fvtt-mournblade-cyd-2-0/templates/partial-item-effects.hbs', // ✅ Ajouté 'systems/fvtt-mournblade-cyd-2-0/templates/hud-adversites.hbs', ] ``` --- ### 2. ❌ Erreur de création d'effet actif **Problème :** ``` base-actor-sheet.mjs:357 MournbladeCYD2 | Failed to create effect: TypeError: Cannot read properties of undefined (reading 'create') ``` **Cause :** La fonction `ActiveEffectDialog.create()` n'existe pas dans Foundry VTT v14. L'API a changé et cette méthode a été supprimée. **Solution :** Remplacement de l'appel à `foundry.applications.api.ActiveEffectDialog.create()` par une création directe via `document.createEmbeddedDocuments("ActiveEffect", [data])`, suivie de l'ouverture de la feuille d'édition. **Fichiers modifiés :** - `modules/applications/sheets/base-actor-sheet.mjs` (lignes 328-363) - `modules/applications/sheets/base-item-sheet.mjs` (lignes 189-224) **Code avant :** ```javascript const effect = await foundry.applications.api.ActiveEffectDialog.create({ document: this.document, effect: defaultEffectData }); if (effect) { await this.document.createEmbeddedDocuments("ActiveEffect", [effect.toObject()]); } ``` **Code après :** ```javascript const [effect] = await this.document.createEmbeddedDocuments("ActiveEffect", [defaultEffectData]); if (effect) { effect.sheet.render(true); } ``` --- ### 3. ❌ Boucle infinie de chargement d'icône (effect.webp introuvable) ✅ **Problème :** ``` 404 (Not Found) - GET https://localhost:31000/systems/fvtt-mournblade-cyd-2-0/assets/icons/effect.webp Boucle infinie de tentatives de chargement ``` **Cause :** L'icône `effect.webp` était référencée dans plusieurs fichiers mais n'existait pas dans le dossier `assets/icons/`. Chaque fois que la dialog de création d'effet s'ouvrait, le navigateur essayait de charger cette image manquante en boucle. **Fichiers concernés :** - `modules/applications/sheets/base-actor-sheet.mjs` (ligne 336) - `modules/applications/sheets/base-item-sheet.mjs` (ligne 197) - `modules/mournblade-cyd2-effects.js` (lignes 120, 180) - `templates/partial-active-effects.hbs` (ligne 30) - `templates/partial-item-effects.hbs` (ligne 30) **Solution :** Remplacement de toutes les références à `effect.webp` par `capacite.webp`, une icône existante dans le dossier `assets/icons/`. **Code avant :** ```javascript icon: "systems/fvtt-mournblade-cyd-2-0/assets/icons/effect.webp" ``` **Code après :** ```javascript icon: "systems/fvtt-mournblade-cyd-2-0/assets/icons/capacite.webp" ``` --- ### 4. ❌ Propriété dépréciée ActiveEffectDuration.type ✅ **Problème :** ``` foundry.mjs:1555 Error: You are accessing ActiveEffectDuration#type, which is now at ActiveEffectDuration#units. Deprecated since Version 14 Backwards-compatible support will be removed in Version 16 ``` **Cause :** En Foundry VTT v14, la propriété `duration.type` a été renommée en `duration.units`. L'ancien nom était encore supporté pour la compatibilité, mais générait des avertissements et sera supprimé en v16. **Fichiers concernés :** - `templates/partial-active-effects.hbs` (lignes 55-61) - `templates/partial-item-effects.hbs` (lignes 51-56) **Solution :** Remplacement de toutes les occurrences de `effect.duration.type` par `effect.duration.units` dans les templates. **Code avant :** ```handlebars {{#if effect.duration.type}} {{#if (eq effect.duration.type "rounds")}}🔄{{/if}} {{#if (eq effect.duration.type "turns")}}🎭{{/if}} {{/if}} ``` **Code après :** ```handlebars {{#if effect.duration.units}} {{#if (eq effect.duration.units "rounds")}}🔄{{/if}} {{#if (eq effect.duration.units "turns")}}🎭{{/if}} {{/if}} ``` --- ### 5. ❌ Helper Handlebars "subtract" manquant ✅ **Problème :** ``` Failed to render Application "MournbladeCYD2PersonnageSheet": Missing helper: "subtract" ``` **Cause :** Le template utilisait le helper `subtract` dans `{{#unless (eq index (subtract effect.changes.length 1))}}` mais ce helper n'était pas enregistré dans Handlebars. **Fichiers concernés :** - `templates/partial-active-effects.hbs` (ligne 44) - `templates/partial-item-effects.hbs` (ligne 44) - `modules/mournblade-cyd2-utility.js` (helper non enregistré) **Solution :** Ajout du helper `subtract` dans la méthode `init()` de `MournbladeCYD2Utility` : **Code ajouté :** ```javascript Handlebars.registerHelper('subtract', function (a, b) { return parseInt(a) - parseInt(b); }); ``` **Fonctionnalité :** Le helper permet de soustraire deux nombres dans les templates Handlebars, utilisé pour détecter le dernier élément d'une liste. --- ### 6. ❌ Clés i18n manquantes pour les effets ✅ **Problème :** Les clés de localisation pour les messages d'erreur des effets actifs étaient manquantes dans `lang/fr.json`, ce qui pouvait entraîner l'affichage de messages en anglais ou vides. **Clés manquantes identifiées :** - `MOURNBLADECYD2.EFFECT.createError` - `MOURNBLADECYD2.EFFECT.deleteError` - `MOURNBLADECYD2.EFFECT.applyError` - `MOURNBLADECYD2.EFFECT.applyItemError` - `MOURNBLADECYD2.EFFECT.selectActor` - `MOURNBLADECYD2.EFFECT.toggleError` **Solution :** Ajout de toutes les clés manquantes dans la section `EFFECT` du fichier `lang/fr.json`. **Traductions ajoutées :** ```json { "createError": "Erreur lors de la création de l'effet", "deleteError": "Erreur lors de la suppression de l'effet", "applyError": "Erreur lors de l'application de l'effet", "applyItemError": "Erreur lors de l'application de l'effet sur l'item", "selectActor": "Sélectionnez un acteur pour appliquer l'effet", "toggleError": "Erreur lors de l'activation/désactivation de l'effet" } ``` **Fichier modifié :** `lang/fr.json` --- ### 7. ❌ Clés i18n MNBL manquantes ✅ **Problème :** Les clés de localisation `MNBL.details` et `MNBL.description` étaient manquantes dans `lang/fr.json`, ce qui entraînait l'affichage de la clé elle-même au lieu d'une traduction. **Clés manquantes identifiées :** - `MNBL.details` - Utilisée dans l'onglet "Détails" des fiches d'items - `MNBL.description` - Utilisée dans l'onglet "Description" des fiches d'items **Solution :** Ajout des deux clés manquantes dans la section `MNBL` du fichier `lang/fr.json`. **Traductions ajoutées :** ```json { "details": "Détails", "description": "Description" } ``` **Fichier modifié :** `lang/fr.json` --- ### 8. ❌ Onglet "Effets" manquant dans les fiches d'items ✅ **Problème :** L'onglet "Effets" n'apparaissait pas dans les fiches d'items, empêchant l'accès à la gestion des effets actifs sur les items. **Cause :** Dans `templates/partial-item-nav.hbs`, l'onglet "Effets" n'était affiché que si l'item avait déjà des effets (`{{#if item.effects.length}}`). **Solution :** Suppression de la condition pour toujours afficher l'onglet "Effets", même lorsque l'item n'a pas encore d'effets actifs. **Fichier modifié :** `templates/partial-item-nav.hbs` **Code avant :** ```handlebars {{#if item.effects.length}} {{localize "MOURNBLADECYD2.EFFECT.activeEffects"}} {{/if}} ``` **Code après :** ```handlebars {{localize "MOURNBLADECYD2.EFFECT.activeEffects"}} ``` --- ### 9. ❌ Erreur de parsing JSON (historique) **Problème mentionné :** ``` SyntaxError: Expected ',' or '}' after property value in JSON at position 3753 (line 118 column 4) ``` **Statut :** Cette erreur concernait probablement une ancienne version du fichier `lang/fr.json`. Le fichier actuel est valide et ne contient pas d'erreur de syntaxe. **Vérification :** ```bash # Le fichier passe la validation JSON node -e "require('./lang/fr.json')" # ✅ Pas d'erreur ``` --- ## Nouveautés et Améliorations (2026-06-07) ### 10. ✅ Amélioration du popup de bienvenue **Modification :** Simplification de la mention des droits dans le popup de bienvenue. **Avant :** ``` Mournblade est un jeu publié par Titam France / Sombres Projets, tous les droits leur appartiennent. ``` **Après :** ``` Mournblade est un jeu Titam. ``` **Fichier modifié :** `modules/mournblade-cyd2-main.js` (ligne 141) --- ### 11. ✅ Ajout du coût en Pouvoir pour les invocations en cours **Nouveauté :** Ajout d'un champ numérique pour suivre le coût en Pouvoir des invocations en cours dans l'onglet Sorcellerie. **Fichiers modifiés :** - `modules/models/personnage.mjs` - Ajout du champ `coutPouvoirInvocations` dans le schéma sorcellerie - `lang/fr.json` - Ajout de la clé `SORCELLERIE.coutPouvoirInvocations` - `templates/actor-sheet.hbs` - Ajout du champ dans le template **Clé i18n ajoutée :** ```json { "coutPouvoirInvocations": "Coût en Pouvoir des invocations" } ``` **Schémas modifié :** ```javascript sorcellerie: new fields.SchemaField({ runes: new fields.HTMLField({ initial: "" }), creaturesinvoquees: new fields.HTMLField({ initial: "" }), demonslies: new fields.HTMLField({ initial: "" }), enchantements: new fields.HTMLField({ initial: "" }), invocationsencours: new fields.HTMLField({ initial: "" }), coutPouvoirInvocations: new fields.NumberField({ initial: 0, integer: true }) // ✅ Ajouté }) ``` --- ### 12. ✅ Amélioration de l'onglet Détails des Profils **Problème :** Les sections de texte (Compétences exercées, Talents Initié, etc.) avaient un rendu peu esthétique. **Solution :** Remplacement des sections de texte simples par des `div class="sheet-box"` pour un meilleur rendu visuel. **Fichier modifié :** `templates/item-profil-sheet.hbs` **Avant :** ```handlebars

{{localize "MNBL.exercisedskills"}}

{{editor competences target="system.competences" button=true owner=owner editable=editable}}
``` **Après :** ```handlebars

{{editor competences target="system.competences" button=true owner=owner editable=editable}}
``` **Impact :** - Meilleure cohérence visuelle avec le reste de l'interface - Permet une meilleure organisation des sections - Facilite l'ajout futur de fonctionnalités comme les liens vers le compendium --- ## Liste complète des partials Handlebars ### Partials utilisés dans le système : | Partial | Utilisation | Pré-chargé ? | |---------|-------------|--------------| | `partial-item-header.hbs` | En-têtes des items | ✅ Oui | | `partial-item-description.hbs` | Descriptions des items | ✅ Oui | | `partial-item-nav.hbs` | Navigation des items | ✅ Oui | | `partial-item-prix.hbs` | Prix des items | ✅ Oui | | `partial-item-effects.hbs` | Effets des items | ✅ Oui (ajouté) | | `partial-active-effects.hbs` | Effets actifs (actors) | ✅ Oui (ajouté) | | `partial-automation.hbs` | Automatisation | ✅ Oui | | `editor-notes-gm.hbs` | Notes GM | ✅ Oui | | `hud-adversites.hbs` | HUD Adversités | ✅ Oui | --- ## Templates principaux ### Fiches d'acteurs : - `actor-sheet.hbs` - Feuille de personnage - `creature-sheet.hbs` - Feuille de créature ### Fiches d'items : - `item-arme-sheet.hbs` - `item-capaciteautomata-sheet.hbs` - `item-competence-sheet.hbs` - `item-don-sheet.hbs` - `item-equipement-sheet.hbs` - `item-historique-sheet.hbs` - `item-monnaie-sheet.hbs` - `item-pacte-sheet.hbs` - `item-pouvoirselementaire-sheet.hbs` - `item-profil-sheet.hbs` - `item-protection-sheet.hbs` - `item-ressource-sheet.hbs` - `item-rune-sheet.hbs` - `item-runeeffect-sheet.hbs` - `item-talent-sheet.hbs` - `item-tendance-sheet.hbs` - `item-traitchaotique-sheet.hbs` - `item-traitdemoniaque-sheet.hbs` - `item-traitespece-sheet.hbs` --- ## Outils de test Un script de test a été créé pour valider les corrections : - **Fichier :** `test-templates.js` - **Exécution :** `node test-templates.js` **Fonctionnalités du test :** 1. ✅ Vérifie que tous les templates préchargés existent 2. ✅ Scanne tous les templates pour trouver les partials utilisés 3. ✅ Vérifie que tous les partials utilisés sont préchargés 4. ✅ Valide le fichier de localisation JSON --- ## Bonnes pratiques rappelées ### Pré-chargement des templates Handlebars En Foundry VTT v12+, il est **obligatoire** de pré-charger tous les partials Handlebars utilisés via la fonction `foundry.applications.handlebars.loadTemplates()` dans le hook `init`. **Pourquoi ?** - Les partials ne sont pas chargés automatiquement - Sans pré-chargement, le rendu échouera avec une erreur "partial could not be found" - Le pré-chargement améliore les performances en cacheant les templates **Où ?** Dans le hook `init`, avant l'enregistrement des feuilles (sheets) : ```javascript Hooks.once("init", async function () { // Pré-charger les templates AVANT d'enregistrer les feuilles await MournbladeCYD2Utility.preloadHandlebarsTemplates(); // Ensuite enregistrer les feuilles Actors.registerSheet(...); Items.registerSheet(...); }); ``` ### Gestion des chemins des templates Les chemins doivent être **relatifs au répertoire `systems/`** : - ✅ Bon : `'systems/fvtt-mournblade-cyd-2-0/templates/partial-active-effects.hbs'` - ❌ Mauvais : `'./templates/partial-active-effects.hbs'` --- ## Impact des corrections ### Avant les corrections : - ❌ Ouverture des feuilles de personnage → Erreur - ❌ Ouverture des feuilles de créature → Erreur - ❌ Affichage des effets actifs → Impossible - ❌ Utilisation des effets d'items → Problèmes potentiels - ❌ Création d'effets actifs → Erreur TypeError - ❌ Boucle infinie de 404 sur effect.webp - ❌ Avertissements duration.type déprécié - ❌ Helper subtract manquant → Erreur de rendu - ❌ Clés i18n manquantes → Messages en anglais - ❌ Clés MNBL.details et MNBL.description manquantes - ❌ Onglet "Effets" manquant dans les fiches d'items ### Après les corrections : - ✅ Toutes les feuilles s'ouvrent correctement - ✅ Les effets actifs s'affichent correctement - ✅ Tous les items affichent leurs effets - ✅ Plus d'erreurs de templates manquants - ✅ Création d'effets actifs fonctionne correctement - ✅ Plus de boucles infinies de chargement d'icônes - ✅ Plus d'avertissements de compatibilité - ✅ Helper subtract disponible et fonctionnel - ✅ Toutes les clés i18n présentes → Localisation complète - ✅ Toutes les clés MNBL présentes - ✅ Onglet "Effets" toujours visible dans les fiches d'items --- ## Recommandations pour le développement futur 1. **Toujours pré-charger les nouveaux partials** lorsqu'ils sont ajoutés 2. **Utiliser un script de test** pour valider les templates après modification 3. **Maintenir une liste à jour** des partials utilisés dans le projet 4. **Vérifier les erreurs de console** lors du développement 5. **Tester toutes les feuilles** après ajout de nouveaux partials --- ## Fichiers modifiés | Fichier | Modification | Statut | |---------|--------------|--------| | `modules/mournblade-cyd2-utility.js` | Ajout partials + helper subtract | ✅ Corrigé | | `modules/applications/sheets/base-actor-sheet.mjs` | Correction création effets + icône | ✅ Corrigé | | `modules/applications/sheets/base-item-sheet.mjs` | Correction création effets + icône | ✅ Corrigé | | `modules/mournblade-cyd2-effects.js` | Remplacement effect.webp par capacite.webp | ✅ Corrigé | | `templates/partial-active-effects.hbs` | Remplacement effect.webp + duration.type → duration.units | ✅ Corrigé | | `templates/partial-item-effects.hbs` | Remplacement effect.webp + duration.type → duration.units | ✅ Corrigé | | `templates/partial-item-nav.hbs` | Affichage permanent onglet Effets + clés MNBL | ✅ Corrigé | | `test-templates.js` | Nouveau fichier de test | ✅ Ajouté | | `CORRECTIONS.md` | Documentation des corrections | ✅ Ajouté | | `lang/fr.json` | Ajout des clés i18n EFFECT + MNBL manquantes | ✅ Corrigé | ## Fichiers modifiés (Nouveautés 2026-06-07) | Fichier | Modification | Statut | |---------|--------------|--------| | `modules/mournblade-cyd2-main.js` | Simplification mention Titam dans popup | ✅ Corrigé | | `modules/models/personnage.mjs` | Ajout champ coutPouvoirInvocations | ✅ Corrigé | | `lang/fr.json` | Ajout clé SORCELLERIE.coutPouvoirInvocations | ✅ Corrigé | | `templates/actor-sheet.hbs` | Ajout champ coût Pouvoir dans onglet Sorcellerie | ✅ Corrigé | | `templates/item-profil-sheet.hbs` | Amélioration rendu sections avec sheet-box | ✅ Corrigé | ## État des fonctionnalités demandées | Fonctionnalité | Statut | Remarques | |---------------|--------|----------| | Clés i18n manquantes | ✅ Complété | Toutes les clés EFFECT et MNBL sont présentes | | Onglet Effets des items | ✅ Complété | Toujours visible, même sans effets | | Popup de lancement | ✅ Complété | Lien vers règles PAO 0.9 présent, mention Titam simplifiée | | Onglet Sorcellerie | ✅ Déjà présent | Avec sections Runes, Créatures invoquées, Démons liés, Enchantements/Automata | | Section Invocations en cours | ✅ Complété | Avec champ coût en Pouvoir ajouté | | Case bleue Combat | ✅ Déjà présente | Affiche Initiative, Défense, Protection sur fiche personnage | | Cases PO/PA/SC sur items | ✅ Déjà présent | Via partial-item-prix.hbs avec calcul automatique | | Sections blanches dans Profils | ✅ Complété | Remplacement des blocs simples par sheet-box | --- ## Auteurs Corrections réalisées par : Mistral Vibe (via Vibe CLI) Date : 2026-06-07