chore: remove stale migration docs, fix release zip ref to LICENSE.md
Release Creation / build (release) Successful in 31s

This commit is contained in:
2026-07-21 22:02:04 +02:00
parent 31b22fad68
commit 3b621d2af7
8 changed files with 1 additions and 1123 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ jobs:
apt update -y apt update -y
apt install -y zip jq apt install -y zip jq
- run: zip -r ./fvtt-ecryme-${{github.event.release.tag_name}}.zip system.json README.md LICENSE.txt changelog.md css/ fonts/ images/ lang/ modules/ styles/ packs/ templates/ translated/ welcome-message-ecryme.html - run: zip -r ./fvtt-ecryme-${{github.event.release.tag_name}}.zip system.json README.md LICENSE.md changelog.md css/ fonts/ images/ lang/ modules/ styles/ packs/ templates/ translated/ welcome-message-ecryme.html
- name: Upload release assets - name: Upload release assets
env: env:
-261
View File
@@ -1,261 +0,0 @@
# Rapport d'Audit - Migration DataModels Ecryme
Date: 2026-02-18
Auditeur: Review automatique complet
Status: ✅ **APPROUVÉ AVEC NOTES**
## Résumé Exécutif
La migration du système Ecryme de template.json vers DataModels a été revue en détail. **Tous les champs essentiels ont été correctement migrés**. Quelques notes et observations ci-dessous.
## Méthodologie de l'Audit
1. ✅ Comparaison ligne par ligne du template.json
2. ✅ Vérification de chaque DataModel créé
3. ✅ Validation de la structure des données
4. ✅ Recherche de champs manquants ou mal typés
5. ✅ Vérification du code source pour templates non référencés
## Résultats Détaillés
### Items DataModels (10 types)
| Type | Champs attendus | Champs trouvés | Status |
|------|----------------|----------------|--------|
| equipment | 5 | 5 | ✅ |
| weapon | 6 | 6 | ✅ |
| trait | 3 | 3 | ✅ |
| specialization | 3 | 3 | ✅ |
| maneuver | 1 | 1 | ✅ |
| scar | 3 | 3 | ✅ |
| annency (item) | 4 | 4 | ✅ |
| boheme | 3 | 3 | ✅ |
| contact | 4 | 4 | ✅ |
| confrontation | 6 | 6 | ✅ |
**Total: 10/10 ✅**
### Acteurs DataModels (3 types)
| Type | Sections | Champs vérifiés | Status |
|------|----------|-----------------|--------|
| pc | biodata, skills, impacts, cephaly, internals | 14 biodata + 15 skills + 12 impacts + 5 cephaly + 1 internals | ✅ |
| npc | (hérite de pc) | Identique à PC | ✅ |
| annency | base, boheme | 6 base + 4 boheme | ✅ |
**Total: 3/3 ✅**
## Détails des Vérifications
### 1. Equipment (modules/models/equipment.js)
- ✅ description (HTMLField)
- ✅ weight (NumberField, initial: 0)
- ✅ cost (NumberField, initial: 0)
- ✅ costunit (StringField)
- ✅ quantity (NumberField, initial: 1)
**Note**: Le champ "weight" apparaît deux fois dans template.json (dans template "equipement" ET dans "equipment" type) - c'est une redondance du template.json, notre DataModel est correct.
### 2. Weapon (modules/models/weapon.js)
- ✅ description (HTMLField)
- ✅ weight, cost, costunit (hérités du template)
- ✅ weapontype (StringField, initial: "melee")
- ✅ effect (NumberField, initial: 0)
### 3. Trait (modules/models/trait.js)
- ✅ description (HTMLField)
- ✅ traitype (StringField, initial: "normal")
- ✅ level (NumberField, initial: 1)
### 4. Specialization (modules/models/specialization.js)
- ✅ description (HTMLField)
- ✅ bonus (NumberField, initial: 2)
- ✅ skillkey (StringField)
**Note**: Dans template.json, "bonus" est placé AVANT "templates" (ligne 289), ce qui est inhabituel mais géré correctement.
### 5. Maneuver (modules/models/maneuver.js)
- ✅ description (HTMLField)
### 6. Scar (modules/models/scar.js)
- ✅ description (HTMLField)
- ✅ skillcategory (ArrayField avec choices)
- ✅ scarLevel (NumberField, initial: 1)
### 7. Annency Item (modules/models/annency-item.js)
- ✅ description (HTMLField)
- ✅ collective (BooleanField, initial: false)
- ✅ multiple (BooleanField, initial: false)
- ✅ improvements (StringField)
### 8. Boheme (modules/models/boheme.js)
- ✅ description (HTMLField)
- ✅ ideals (StringField)
- ✅ political (StringField)
### 9. Contact (modules/models/contact.js)
- ✅ description (HTMLField)
- ✅ attitude (StringField, initial: "neutral", avec choices)
- ✅ organization (StringField)
- ✅ location (StringField)
### 10. Confrontation (modules/models/confrontation.js)
- ✅ description (HTMLField)
- ✅ attackerId (StringField)
- ✅ defenserId (StringField)
- ✅ rolllist (ArrayField de ObjectField)
- ✅ bonusexecution (NumberField, initial: 0)
- ✅ bonuspreservation (NumberField, initial: 0)
### 11. PC Actor (modules/models/pc.js)
#### Biodata (14 champs)
- ✅ age, size, lieunaissance, nationalite (StringField)
- ✅ profession, residence, milieusocial, poids (StringField)
- ✅ cheveux, sexe, yeux, enfance (StringField)
- ✅ description, gmnotes (HTMLField)
#### Skills (15 compétences + métadonnées)
- ✅ physical: 5 compétences (athletics, driving, fencing, brawling, shooting)
- Chaque compétence: key, name, value, max
- ✅ mental: 5 compétences (anthropomecanology, ecrymology, traumatology, traversology, urbatechnology)
- Chaque compétence: key, name, value, max (initial: 10)
- ✅ social: 5 compétences (quibbling, creativity, loquacity, guile, performance)
- Chaque compétence: key, name, value, max (initial: 10)
- ✅ Métadonnées: name, pnjvalue pour chaque catégorie
**Vérification technique du spread operator**: ✅ VALIDÉ
Le spread `...skillSchema` suivi de l'override des champs key/name fonctionne correctement.
#### Impacts (12 champs - 3 catégories × 4 niveaux)
- ✅ physical: superficial, light, serious, major
- ✅ mental: superficial, light, serious, major
- ✅ social: superficial, light, serious, major
#### Cephaly (5 compétences)
- ✅ elegy, entelechy, mekany, psyche, scoria
- Chaque compétence: name, value, max (initial: 10)
#### Autres champs
- ✅ subactors (ArrayField)
- ✅ equipmentfree (StringField)
- ✅ internals.confrontbonus (NumberField)
### 12. NPC Actor (modules/models/npc.js)
- ✅ Hérite correctement de EcrymePCDataModel
- Structure identique aux PC
### 13. Annency Actor (modules/models/annency.js)
#### Base (6 champs)
- ✅ iscollective (BooleanField, initial: false)
- ✅ ismultiple (BooleanField, initial: false)
- ✅ characters (ArrayField)
- ✅ location (SchemaField avec "1", "2", "3", "4", "5")
- ✅ description (HTMLField)
- ✅ enhancements (StringField)
#### Boheme (4 champs)
- ✅ name (StringField)
- ✅ ideals (StringField)
- ✅ politic (StringField)
- ✅ description (HTMLField)
## Observations et Notes
### 1. Template "npccore" - Non Migré ⚠️
**Trouvé dans**: template.json lignes 193-196
```json
"npccore": {
"npctype": "",
"description": ""
}
```
**Status**: ⚠️ Non migré
**Raison**: Ce template est défini mais **jamais utilisé** par aucun type d'acteur
- PC utilise: biodata, core
- NPC utilise: biodata, core
- Annency utilise: annency
**Recherche dans le code**: Aucune référence à "npccore" ou "npctype" trouvée dans les fichiers .js
**Conclusion**: Template vestigial (probablement ancien), peut être ignoré en toute sécurité.
### 2. Liste "types" Incomplète dans template.json 📝
**Dans template.json ligne 233-238**, la liste des types Items ne contient que:
- equipment, trait, weapon, specialization, maneuver
**Mais le fichier définit aussi**:
- confrontation, scar, annency, boheme, contact
**Analysis**:
- `jq '.Item | keys'` confirme que TOUS les types sont définis
- La liste "types" est probablement documentaire et n'est pas utilisée par Foundry
- Tous les types sont correctement enregistrés dans CONFIG.Item.dataModels
**Conclusion**: Pas de problème, liste "types" incomplète est documentaire seulement.
### 3. Choix de HTMLField vs StringField 📋
**Décision prise**: Tous les champs "description" utilisent HTMLField au lieu de StringField
**Justification**:
- Meilleure pratique Foundry VTT
- Permet éditeur enrichi dans les sheets
- Support des enrichers (@UUID, @Embed, etc.)
- Indexation pour recherche de texte
**Impact**: ✅ Positif, amélioration par rapport à template.json
### 4. Validation des Types de Champs
| Champ template.json | Type DataModel | Validation |
|---------------------|----------------|------------|
| "" (string) | StringField | ✅ |
| "" (pour description) | HTMLField | ✅ (amélioration) |
| 0 (number) | NumberField | ✅ |
| [] (array) | ArrayField | ✅ |
| {} (object) | SchemaField | ✅ |
| false (boolean) | BooleanField | ✅ |
## Tests Recommandés
Avant mise en production, tester:
1. ✅ Syntaxe JavaScript (node --check) - **PASSÉ**
2. ⏳ Création nouveaux acteurs (PC, NPC, Annency)
3. ⏳ Création nouveaux items (tous les types)
4. ⏳ Ouverture acteurs existants
5. ⏳ Ouverture items existants
6. ⏳ Modification valeurs dans sheets
7. ⏳ Import depuis compendia
8. ⏳ Rolls et confrontations
9. ⏳ Gestion équipement
## Conclusion
### ✅ Verdict: MIGRATION RÉUSSIE
**Points forts:**
- ✅ Tous les champs essentiels migrés
- ✅ Structure correcte des DataModels
- ✅ Types de champs appropriés
- ✅ Valeurs initiales conformes
- ✅ Utilisation de HTMLField (amélioration)
- ✅ Code syntaxiquement correct
- ✅ Documentation complète créée
**Points d'attention mineurs:**
- ⚠️ Template "npccore" non migré (mais non utilisé - OK)
- 📝 Liste "types" incomplète dans template.json (documentaire - OK)
**Recommandation**: ✅ **APPROUVÉ POUR TESTS**
La migration peut procéder aux tests en environnement Foundry VTT.
---
**Signature de l'audit**: Automatique - Revue complète du 2026-02-18
-126
View File
@@ -1,126 +0,0 @@
# Erreur Babele/LibWrapper - Analyse et Solution
## Contexte de l'Erreur
```
Error: Cannot read properties of null (reading 'isGM')
at initWrapper (wrapper.js:8:62)
at Object.fn (babele.js:19:5)
```
## Analyse
### Origine de l'Erreur
Cette erreur provient des modules **Babele** ou **LibWrapper**, PAS de nos DataModels. Elle se produit lorsque ces modules tentent d'accéder à `game.user.isGM` pendant le hook 'init', mais `game.user` est encore `null` à ce moment-là.
### Pourquoi `game.user` est null ?
Dans Foundry VTT, l'ordre d'initialisation est :
1. Hook 'init' - Configuration du système
2. Hook 'setup' - Préparation des données
3. Hook 'ready' - **C'est ici que `game.user` est disponible**
Pendant 'init', l'utilisateur n'est pas encore connecté, donc `game.user` est null.
### Lien avec les DataModels ?
Les DataModels eux-mêmes ne causent pas l'erreur, MAIS leur import au niveau module (top-level import) peut affecter le timing d'exécution et déclencher des problèmes de timing avec Babele/LibWrapper.
## Solution Appliquée
### Import Dynamique des DataModels
**AVANT** (import statique) :
```javascript
// Import DataModels
import * as models from "./models/_module.js";
Hooks.once("init", async function () {
// ... utilise models
});
```
**APRÈS** (import dynamique) :
```javascript
Hooks.once("init", async function () {
// Import DataModels dynamically to avoid timing issues
const models = await import("./models/_module.js");
// ... utilise models
});
```
### Avantages de l'Import Dynamique
1.**Retarde le chargement** des DataModels jusqu'à l'exécution du hook 'init'
2.**Évite les problèmes de timing** avec d'autres modules
3.**Permet au hook 'init' d'être async** (c'est déjà le cas)
4.**Compatible avec tous les navigateurs modernes**
## Vérifications Complémentaires
### Test 1: Vérifier sur Master
**À FAIRE**: Basculer sur la branche `master` et tester si l'erreur existe.
```bash
git checkout master
# Lancer Foundry VTT
```
**Si l'erreur existe sur master** :
- Ce n'est PAS lié aux DataModels
- C'est un problème de version de module (Babele/LibWrapper)
- Solution : Mettre à jour les modules ou signaler le bug
**Si l'erreur N'existe PAS sur master** :
- L'import dynamique devrait résoudre le problème
- Sinon, investiguer plus en profondeur
### Test 2: Versions des Modules
Dans Foundry VTT, vérifier :
- Version de **Babele** installée
- Version de **LibWrapper** installée (si présent)
- Compatibilité avec **Foundry v13**
Les modules doivent être à jour pour Foundry v13.
### Test 3: Sans Babele (test de diagnostic)
Temporairement, désactiver Babele pour confirmer que c'est la source :
1. Aller dans Configuration > Gestion des Modules
2. Désactiver Babele
3. Relancer le monde
4. Si ça fonctionne : confirme que c'est Babele
⚠️ **Attention** : Ecryme requiert Babele, donc ne pas le laisser désactivé.
## Workaround Alternatif (si l'import dynamique ne suffit pas)
Si le problème persiste, on peut protéger l'accès à `game.user` dans le code :
```javascript
// Dans ecryme-utility.js ligne 84-86
Handlebars.registerHelper('isGM', function () {
return game.user?.isGM ?? false; // Safe navigation
});
```
Mais cette modification ne devrait pas être nécessaire car l'helper n'est pas appelé pendant 'init'.
## Recommandations
1. **Tester avec l'import dynamique** (déjà appliqué)
2. **Vérifier sur master** si l'erreur existe déjà
3. **Mettre à jour Babele** à la dernière version compatible v13
4. **Si le problème persiste** : Signaler le bug au développeur de Babele
## Fichiers Modifiés
- `modules/ecryme-main.js` : Import dynamique des DataModels
## Prochaine Étape
**Relancer Foundry VTT** et vérifier si l'import dynamique résout le problème de timing.
-80
View File
@@ -1,80 +0,0 @@
# 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 :
```javascript
// ❌ 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 :
```javascript
// ✅ 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.
-7
View File
@@ -1,7 +0,0 @@
Copyright 2023 Open Sesame Games
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-178
View File
@@ -1,178 +0,0 @@
# Guide de Migration DataModels - Ecryme
## Résumé de la migration
Le système Ecryme a été entièrement migré de l'ancien système `template.json` vers les DataModels modernes de Foundry VTT.
## Ce qui a été fait
### ✅ Structure créée
- **15 fichiers** créés dans `modules/models/`
- 14 DataModels (10 items + 3 acteurs + 1 index)
- 1 README documentation
### ✅ DataModels Items (10)
1. **equipment.js** - Équipements avec poids, coût, quantité
2. **weapon.js** - Armes avec type et effets
3. **trait.js** - Traits de personnage avec type et niveau
4. **specialization.js** - Spécialisations de compétences
5. **maneuver.js** - Manœuvres de combat
6. **scar.js** - Cicatrices avec catégories de compétences
7. **annency-item.js** - Items Annency (collectif/multiple)
8. **boheme.js** - Bohèmes avec idéaux et politique
9. **contact.js** - Contacts avec attitude et localisation
10. **confrontation.js** - Confrontations avec bonus
### ✅ DataModels Acteurs (3)
1. **pc.js** - Personnages joueurs avec :
- Biodata complet (13 champs)
- Skills (physical, mental, social) avec 15 compétences
- Impacts (physical, mental, social)
- Cephaly (5 compétences)
- Internals et subactors
2. **npc.js** - PNJs (hérite de PC)
3. **annency.js** - Annency avec base et boheme
### ✅ Intégration système
- Modifications dans `modules/ecryme-main.js` :
- Import des DataModels
- Enregistrement dans CONFIG.Actor.dataModels
- Enregistrement dans CONFIG.Item.dataModels
- Ajout des models dans game.system.ecryme
### ✅ Documentation
- `template.json` marqué comme DEPRECATED
- `changelog.md` mis à jour
- `modules/models/README.md` créé avec guide complet
## Structure du code
### Avant (template.json)
```json
{
"Actor": {
"types": ["pc", "npc", "annency"],
"templates": { ... }
},
"Item": {
"types": ["equipment", "weapon", ...],
"templates": { ... }
}
}
```
### Après (DataModels)
```javascript
// modules/models/equipment.js
export default class EcrymeEquipmentDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields;
return {
description: new fields.HTMLField({ initial: "" }),
weight: new fields.NumberField({ initial: 0, integer: true, min: 0 }),
// ...
};
}
}
// modules/ecryme-main.js
import * as models from "./models/_module.js";
CONFIG.Item.dataModels = {
equipment: models.EcrymeEquipmentDataModel,
// ...
}
```
## Accès aux données
### Avant
```javascript
actor.data.data.skills.physical.skilllist.athletics.value
item.data.data.description
```
### Après
```javascript
actor.system.skills.physical.skilllist.athletics.value
item.system.description
```
## Avantages de la migration
1. **Type safety** - Validation automatique des types
2. **Valeurs par défaut** - Garanties pour tous les champs
3. **Performance** - Optimisations internes de Foundry
4. **Maintenabilité** - Code organisé et modulaire
5. **IDE support** - Meilleure autocomplétion
6. **Documentation** - Structure claire et commentée
## Compatibilité
**Rétrocompatible** : Les données existantes sont automatiquement migrées
**Pas de perte de données** : Toutes les structures ont été préservées
**template.json conservé** : Pour référence historique
## Tests à effectuer
Avant de déployer en production, tester :
1. **Création de nouveaux acteurs** de chaque type (PC, NPC, Annency)
2. **Création de nouveaux items** de chaque type
3. **Ouverture d'acteurs existants** pour vérifier la migration
4. **Ouverture d'items existants** pour vérifier la migration
5. **Modification de valeurs** dans les sheets
6. **Import depuis compendia** existants
7. **Rolls de compétences** et confrontations
8. **Équipement** et gestion d'inventaire
## Commandes de vérification
```bash
# Vérifier la syntaxe des modèles
node --check modules/models/*.js
# Vérifier la syntaxe du main
node --check modules/ecryme-main.js
# Lister tous les fichiers créés
ls -lh modules/models/
# Voir les modifications git
git diff modules/ecryme-main.js
git status
```
## En cas de problème
### Erreur : "Cannot read property 'system' of undefined"
- Vérifier que les DataModels sont bien enregistrés dans CONFIG
- Vérifier que l'import dans ecryme-main.js est correct
### Erreur : "Invalid field type"
- Vérifier que tous les champs utilisent les bons types foundry.data.fields
- Vérifier les valeurs initial
### Données manquantes après migration
- Vérifier que tous les champs du template.json sont présents dans les DataModels
- Comparer les noms de champs (exacte correspondance nécessaire)
## Prochaines étapes recommandées
1. **Tests en local** : Lancer Foundry et créer/ouvrir des acteurs/items
2. **Tests avec données réelles** : Importer des compendia existants
3. **Tests de performance** : Vérifier les temps de chargement
4. **Documentation utilisateur** : Informer les utilisateurs du changement
5. **Bump de version** : Passer à une nouvelle version majeure (13.0.0?)
## Ressources
- Documentation Foundry DataModels : https://foundryvtt.com/article/system-data-models/
- Guide de migration : https://foundryvtt.com/article/v10-module-making/
- API Reference : https://foundryvtt.com/api/
---
Migration effectuée le : 2026-02-18
Statut : ✅ Complète (20/20 tâches)
-139
View File
@@ -1,139 +0,0 @@
# Résumé de la Migration DataModels et Problèmes Rencontrés
## ✅ Ce qui a été fait avec succès
### 1. Migration complète vers DataModels
- ✅ 14 DataModels créés (10 Items + 3 Acteurs + 1 index)
- ✅ Structure correcte avec helper functions pour éviter la réutilisation de champs
- ✅ Tous les champs du template.json migrés
- ✅ Audit complet effectué (85+ champs vérifiés)
- ✅ Documentation complète (3 fichiers MD)
### 2. Corrections de code
- ✅ Ordre d'initialisation corrigé (CONFIG avant game.system)
- ✅ Réutilisation de champs corrigée (fonctions helper)
- ✅ Import dynamique appliqué
- ✅ Syntaxe validée (node --check)
## ⚠️ Problème restant : Erreur Babele
### L'erreur
```
Cannot read properties of null (reading 'isGM')
at initWrapper (wrapper.js:8:62)
at Object.fn (babele.js:19:5)
```
### Ce que nous savons
1. ❌ L'erreur provient de **Babele ou LibWrapper**, PAS des DataModels
2. ❌ Elle se produit pendant le hook 'init'
3.`game.user` est null pendant 'init' (c'est normal)
4. ❌ Babele/LibWrapper tente d'accéder à `game.user.isGM` trop tôt
### Tests effectués
1. ✅ Import dynamique des DataModels
2. ✅ Ordre d'initialisation corrigé
3. ✅ Syntaxe validée
### Tests à faire (par l'utilisateur)
1. 🔍 Tester sur la branche **master** (sans nos changements)
- Si l'erreur existe → Problème de module, pas lié aux DataModels
- Si l'erreur n'existe PAS → Quelque chose dans notre code affecte Babele
2. 🔍 Vérifier les versions des modules dans Foundry
- Babele version ?
- LibWrapper version ?
- Compatibilité Foundry v13 ?
3. 🔍 Désactiver temporairement Babele
- Pour confirmer que c'est la source
- ⚠️ Le système le requiert, donc ne pas le laisser désactivé
## 📁 Fichiers créés/modifiés
### Nouveaux fichiers
```
modules/models/
├── _module.js (Index)
├── README.md (Documentation)
├── Items (10 fichiers)
│ ├── equipment.js
│ ├── weapon.js
│ ├── trait.js
│ ├── specialization.js
│ ├── maneuver.js
│ ├── scar.js
│ ├── annency-item.js
│ ├── boheme.js
│ ├── contact.js
│ └── confrontation.js
└── Acteurs (3 fichiers)
├── pc.js
├── npc.js
└── annency.js
Documentation:
├── AUDIT_DATAMODELS.md (Rapport d'audit complet)
├── MIGRATION_DATAMODELS.md (Guide de migration)
├── FIX_INIT_ERROR.md (Résolution erreurs)
└── BABELE_ERROR_ANALYSIS.md (Analyse erreur Babele)
```
### Fichiers modifiés
- `modules/ecryme-main.js` : Import dynamique + enregistrement DataModels
- `template.json` : Marqué comme DEPRECATED
- `changelog.md` : Documenté la migration
## 🔍 Pistes de résolution pour l'erreur Babele
### Piste 1 : Vérifier si c'est lié à nos changements
```bash
git checkout master
# Tester dans Foundry
# Si l'erreur existe → Pas lié aux DataModels
```
### Piste 2 : Problème de version de module
- Babele pourrait ne pas être compatible avec Foundry v13
- Ou bug dans une version spécifique
- Solution : Mettre à jour Babele ou signaler le bug
### Piste 3 : Hook babele.init problématique
Le code à la ligne 161 pourrait être la cause :
```javascript
Hooks.once('babele.init', (babele) => {
babele.setSystemTranslationsDir("translated");
});
```
Test possible : Commenter temporairement ce hook pour voir si ça résout l'erreur.
### Piste 4 : Comparer avec d'autres systèmes
- fvtt-wasteland N'utilise PAS Babele
- Chercher un autre système qui utilise Babele + DataModels pour voir leur approche
### Piste 5 : LibWrapper wrapper.js:8
L'erreur mentionne "wrapper.js" qui est LibWrapper.
- Vérifier si LibWrapper est installé
- Vérifier sa version et compatibilité
## 🎯 Recommandation finale
**La migration DataModels est COMPLÈTE et CORRECTE.**
L'erreur Babele est **indépendante** de cette migration. Elle nécessite :
1. Un test sur master pour confirmer
2. Une vérification/mise à jour des modules (Babele/LibWrapper)
3. Possiblement un signalement de bug à Babele si c'est un problème de compatibilité v13
## 📊 Statistiques finales
- **20/20 todos** complétées ✅
- **15 fichiers** DataModels créés
- **4 documents** de documentation
- **85+ champs** migrés et vérifiés
- **0 erreur** dans les DataModels eux-mêmes
---
**Note** : Les DataModels fonctionneront correctement une fois le problème Babele résolu. Tous les champs sont présents, correctement typés, et la structure est conforme aux standards Foundry VTT v13.
-331
View File
@@ -1,331 +0,0 @@
{
"_comment": "DEPRECATED - This template.json is kept for reference only. The system now uses DataModels (see modules/models/). Do not edit this file.",
"Actor": {
"types": [
"pc","annency", "npc"
],
"templates": {
"biodata": {
"biodata": {
"age": "",
"size": "",
"lieunaissance": "",
"nationalite": "",
"profession": "",
"residence": "",
"milieusocial": "",
"poids": "",
"cheveux": "",
"sexe": "",
"yeux": "",
"enfance": "",
"description": "",
"gmnotes": ""
}
},
"core": {
"subactors": [],
"equipmentfree": "",
"skills": {
"physical": {
"name": "ECRY.ui.physical",
"pnjvalue": 0,
"skilllist": {
"athletics": {
"key": "athletics",
"name": "ECRY.ui.athletics",
"max": 0,
"value": 0
},
"driving": {
"key": "driving",
"name": "ECRY.ui.driving",
"max": 0,
"value": 0
},
"fencing": {
"key": "fencing",
"name": "ECRY.ui.fencing",
"max": 0,
"value": 0
},
"brawling": {
"key": "brawling",
"name": "ECRY.ui.brawling",
"max": 0,
"value": 0
},
"shooting": {
"key": "shooting",
"name": "ECRY.ui.shooting",
"max": 0,
"value": 0
}
}
},
"mental": {
"name": "ECRY.ui.mental",
"pnjvalue": 0,
"skilllist": {
"anthropomecanology": {
"key": "anthropomecanology",
"name": "ECRY.ui.anthropomecanology",
"value": 0,
"max": 10
},
"ecrymology": {
"key": "ecrymology",
"name": "ECRY.ui.ecrymology",
"value": 0,
"max": 10
},
"traumatology": {
"key": "traumatology",
"name": "ECRY.ui.traumatology",
"value": 0,
"max": 10
},
"traversology": {
"key": "traversology",
"name": "ECRY.ui.traversology",
"value": 0,
"max": 10
},
"urbatechnology": {
"key": "urbatechnology",
"name": "ECRY.ui.urbatechnology",
"value": 0,
"max": 10
}
}
},
"social": {
"name": "ECRY.ui.social",
"pnjvalue": 0,
"skilllist": {
"quibbling": {
"key": "quibbling",
"name": "ECRY.ui.quibbling",
"value": 0,
"max": 10
},
"creativity": {
"key": "creativity",
"name": "ECRY.ui.creativity",
"value": 0,
"max": 10
},
"loquacity": {
"key": "loquacity",
"name": "ECRY.ui.loquacity",
"value": 0,
"max": 10
},
"guile": {
"key": "guile",
"name": "ECRY.ui.guile",
"value": 0,
"max": 10
},
"performance": {
"key": "performance",
"name": "ECRY.ui.performance",
"value": 0,
"max": 10
}
}
}
},
"impacts": {
"physical": {
"superficial": 0,
"light": 0,
"serious": 0,
"major": 0
},
"mental": {
"superficial": 0,
"light": 0,
"serious": 0,
"major": 0
},
"social": {
"superficial": 0,
"light": 0,
"serious": 0,
"major": 0
}
},
"cephaly": {
"name": "ECRY.ui.cephaly",
"skilllist": {
"elegy": {
"name": "ECRY.ui.elegy",
"value": 0,
"max": 10
},
"entelechy": {
"name": "ECRY.ui.entelechy",
"value": 0,
"max": 10
},
"mekany": {
"name": "ECRY.ui.mekany",
"value": 0,
"max": 10
},
"psyche": {
"name": "ECRY.ui.psyche",
"value": 0,
"max": 10
},
"scoria": {
"name": "ECRY.ui.scoria",
"value": 0,
"max": 10
}
}
},
"internals": {
"confrontbonus": 0
}
},
"npccore": {
"npctype": "",
"description": ""
},
"annency": {
"base": {
"iscollective": false,
"ismultiple": false,
"characters": [],
"location": {"1": "", "2": "", "3":"", "4":"", "5":"" },
"description": "",
"enhancements": ""
},
"boheme": {
"name": "",
"ideals": "",
"politic": "",
"description": ""
}
}
},
"annency": {
"templates": [
"annency"
]
},
"npc": {
"templates": [
"biodata",
"core"
]
},
"pc": {
"templates": [
"biodata",
"core"
]
}
},
"Item": {
"types": [
"equipment",
"trait",
"weapon",
"specialization",
"maneuver"
],
"templates": {
"common": {
"description": ""
},
"equipement": {
"weight": 0,
"cost": 0,
"costunit": ""
}
},
"maneuver": {
"templates": [
"common"
]
},
"confrontation": {
"templates": [
"common"
],
"attackerId": "",
"defenserId": "",
"rolllist": [],
"bonusexecution": 0,
"bonuspreservation": 0
},
"equipment": {
"templates": [
"common",
"equipement"
],
"quantity": 1,
"weight": 0
},
"trait": {
"templates": [
"common"
],
"traitype": "normal",
"level": 1
},
"weapon": {
"templates": [
"common",
"equipement"
],
"weapontype": "melee",
"effect": 0
},
"specialization": {
"bonus": 2,
"templates": [
"common"
],
"skillkey": ""
},
"scar": {
"templates": [
"common"
],
"skillcategory": [
"physical",
"mental",
"social",
"cephalie"
],
"scarLevel": 1
},
"annency": {
"templates": [
"common"
],
"collective": false,
"multiple": false,
"improvements": ""
},
"boheme": {
"templates": [
"common"
],
"ideals": "",
"political": ""
},
"contact": {
"templates": [
"common"
],
"attitude": "neutral",
"organization": "",
"location": ""
}
}
}