Files
fvtt-ecryme/FIX_INIT_ERROR.md
LeRatierBretonnier f130f24a23 Migration complète vers DataModels Foundry VTT
- Ajout de 14 DataModels (10 Items + 3 Acteurs)
  * Items: equipment, weapon, trait, specialization, maneuver, scar, annency, boheme, contact, confrontation
  * Acteurs: pc, npc, annency

- Corrections d'initialisation
  * Ordre d'initialisation corrigé (CONFIG.dataModels avant game.system)
  * Import dynamique des DataModels pour éviter timing issues
  * Helper functions pour éviter réutilisation de champs

- Documentation complète
  * AUDIT_DATAMODELS.md: Rapport d'audit complet (85+ champs vérifiés)
  * MIGRATION_DATAMODELS.md: Guide de migration
  * FIX_INIT_ERROR.md: Résolution des erreurs
  * BABELE_ERROR_ANALYSIS.md: Analyse erreur Babele
  * RESUME_MIGRATION.md: Résumé complet
  * modules/models/README.md: Documentation des DataModels

- template.json marqué comme DEPRECATED
- changelog.md mis à jour

Note: Erreur Babele/LibWrapper non résolue (problème de module externe)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-18 11:32:29 +01:00

2.8 KiB

Résolution Erreurs d'Initialisation

Problèmes Rencontrés et Solutions

Erreur 1: Cannot read properties of null (reading 'isGM')

Problème: L'ordre d'initialisation dans le hook 'init' n'était pas optimal.

Solution: Réorganisation de modules/ecryme-main.js pour enregistrer les DataModels AVANT de définir game.system.ecryme.

Erreur 2: The "value" field already belongs to some other parent

Problème: Les instances de champs étaient réutilisées au lieu de créer de nouvelles instances.

Explication Technique

En JavaScript, le spread operator (...) copie les références aux objets, pas les objets eux-mêmes :

// ❌ INCORRECT - Partage les mêmes instances
const skillSchema = {
  value: new fields.NumberField({ initial: 0 })
};

const skills = {
  athletics: new fields.SchemaField({ ...skillSchema }), // Réutilise la même instance de 'value'
  driving: new fields.SchemaField({ ...skillSchema })    // Réutilise la même instance de 'value'
};

Foundry interdit la réutilisation d'une instance de champ dans plusieurs parents.

Solution Appliquée

Création de fonctions helper qui retournent de nouvelles instances à chaque appel :

// ✅ CORRECT - Crée de nouvelles instances
const createSkillSchema = (keyValue, nameValue, maxValue = 0) => ({
  key: new fields.StringField({ initial: keyValue }),
  name: new fields.StringField({ initial: nameValue }),
  value: new fields.NumberField({ initial: 0, integer: true, min: 0 }),
  max: new fields.NumberField({ initial: maxValue, integer: true, min: 0 })
});

const skills = {
  athletics: new fields.SchemaField(createSkillSchema("athletics", "ECRY.ui.athletics")),
  driving: new fields.SchemaField(createSkillSchema("driving", "ECRY.ui.driving"))
};

Corrections dans modules/models/pc.js

  1. createSkillSchema() - Pour les 15 compétences (physical, mental, social)
  2. createCephalySkillSchema() - Pour les 5 compétences cephaly
  3. createImpactSchema() - Pour les 3 catégories d'impacts (physical, mental, social)

Chaque fonction crée de nouvelles instances de champs à chaque appel, évitant ainsi le partage de références.

Changements Effectués

Fichier: modules/ecryme-main.js

  • Réorganisation de l'ordre d'initialisation
  • CONFIG.Actor/Item.dataModels enregistrés avant game.system.ecryme

Fichier: modules/models/pc.js

  • Remplacement des objets partagés par des fonctions helper
  • createSkillSchema() pour skills
  • createCephalySkillSchema() pour cephaly
  • createImpactSchema() pour impacts

Validation

  • Syntaxe JavaScript vérifiée (node --check)
  • Pattern correctement appliqué (fonctions au lieu d'objets partagés)
  • Conforme aux meilleures pratiques Foundry VTT

Prochaine Étape

Relancer Foundry VTT pour vérifier que les deux erreurs sont résolues.