Files
fvtt-hamalron/macro-create-tarot-deck.js
2025-12-25 23:08:06 +01:00

278 lines
7.3 KiB
JavaScript

/**
* Macro FoundryVTT - Création des 78 cartes de Tarot
* Cette macro crée automatiquement toutes les cartes du tarot
* en se basant sur les images présentes dans assets/tarots/
*/
// Configuration des symboles et leurs variantes de noms
const SYMBOLES_MAP = {
'baton': 'baton',
'coupe': 'coupe',
'denier': 'denier',
'epee': 'epee',
'd-epee': 'epee'
};
// Configuration des valeurs et leurs variantes
const VALEURS_MAP = {
'as': '1',
'deux': '2',
'trois': '3',
'quatre': '4',
'cinq': '5',
'six': '6',
'sept': '7',
'huit': '8',
'neuf': '9',
'dix': '10',
'valet': 'valet',
'cavalier': 'cavalier',
'reine': 'reine',
'roi': 'roi'
};
// Noms des atouts majeurs (1 à 22)
const ATOUTS = {
'1': 'Le Bateleur',
'2': 'La Papesse',
'3': 'L\'Impératrice',
'4': 'L\'Empereur',
'5': 'Le Pape',
'6': 'L\'Amoureux',
'7': 'Le Chariot',
'8': 'La Justice',
'9': 'L\'Hermite',
'10': 'La Roue de Fortune',
'11': 'La Force',
'12': 'Le Pendu',
'13': 'L\'Arcane sans Nom',
'14': 'La Tempérance',
'15': 'Le Diable',
'16': 'La Maison Dieu',
'17': 'L\'Étoile',
'18': 'La Lune',
'19': 'Le Soleil',
'20': 'Le Jugement',
'21': 'Le Monde',
'22': 'Le Mat'
};
// Fonction pour parser le nom de fichier et déterminer les propriétés
function parseCardFileName(filename) {
// Retirer le numéro initial et l'extension
const nameWithoutExt = filename.replace(/\.jpg$/i, '').replace(/^\d+-/, '');
// Cas spécial pour le duplicata de l'Amoureux
if (filename.includes('_1.jpg')) {
return null; // Ignorer le duplicata
}
// Détection des atouts majeurs (fichiers 1 à 22)
const atoutMatch = filename.match(/^(\d+)-/);
if (atoutMatch) {
const num = atoutMatch[1];
if (parseInt(num) <= 22 && ATOUTS[num]) {
return {
name: ATOUTS[num],
type: 'atout',
symbole: 'coupe', // Valeur par défaut pour les atouts
valeur: '1',
image: `systems/fvtt-hamalron/assets/tarots/${filename}`
};
}
}
// Détection des cartes mineures (figures et numéros)
for (const [key, value] of Object.entries(VALEURS_MAP)) {
if (nameWithoutExt.includes(key)) {
// Chercher le symbole
for (const [symboleKey, symboleValue] of Object.entries(SYMBOLES_MAP)) {
if (nameWithoutExt.includes(symboleKey)) {
// Déterminer si c'est une figure ou un numéro
const isFigure = ['valet', 'cavalier', 'reine', 'roi'].includes(key);
// Construire le nom de la carte
let cardName = key.charAt(0).toUpperCase() + key.slice(1);
cardName += ' de ' + SYMBOLES_MAP[symboleKey].charAt(0).toUpperCase() + SYMBOLES_MAP[symboleKey].slice(1);
return {
name: cardName,
type: isFigure ? 'figure' : 'numéro',
symbole: symboleValue,
valeur: value,
image: `systems/fvtt-hamalron/assets/tarots/${filename}`
};
}
}
}
}
return null;
}
// Fonction principale pour créer les cartes
async function createTarotDeck() {
ui.notifications.info("Début de la création du jeu de Tarot...");
// Créer ou récupérer le dossier pour les tarots
let tarotFolder = game.folders.find(f => f.name === "Cartes de Tarot" && f.type === "Item");
if (!tarotFolder) {
tarotFolder = await Folder.create({
name: "Cartes de Tarot",
type: "Item",
color: "#8b4513",
sorting: "a"
});
console.log("Dossier 'Cartes de Tarot' créé");
} else {
console.log("Dossier 'Cartes de Tarot' existant trouvé");
}
// Liste des fichiers d'images (à adapter selon votre arborescence)
const imageFiles = [
'1-le-bateleur.jpg',
'2-la-papesse.jpg',
'3-l-imperatrice.jpg',
'4-l-empereur.jpg',
'5-le-pape.jpg',
'6-l-amoureux.jpg',
'7-le-chariot.jpg',
'8-la-justice.jpg',
'9-l-hermite.jpg',
'10-la-roue-de-fortune.jpg',
'11-la-force.jpg',
'12-le-pendu.jpg',
'13-l-arcane-sans-nom.jpg',
'14-la-temperance.jpg',
'15-le-diable.jpg',
'16-la-maison-dieu.jpg',
'17-l-etoile.jpg',
'18-la-lune.jpg',
'19-le-soleil.jpg',
'20-le-jugement.jpg',
'21-le-monde.jpg',
'22-le-mat.jpg',
'23-as-de-baton.jpg',
'24-deux-de-baton.jpg',
'25-trois-de-baton.jpg',
'26-quatre-de-baton.jpg',
'27-cinq-de-baton.jpg',
'28-six-de-baton.jpg',
'29-sept-de-baton.jpg',
'30-huit-de-baton.jpg',
'31-neuf-de-baton.jpg',
'32-dix-de-baton.jpg',
'33-valet-de-baton.jpg',
'34-cavalier-de-baton.jpg',
'35-reine-de-baton.jpg',
'36-roi-de-baton.jpg',
'37-as-de-coupe.jpg',
'38-deux-de-coupe.jpg',
'39-trois-de-coupe.jpg',
'40-quatre-de-coupe.jpg',
'41-cinq-de-coupe.jpg',
'42-six-de-coupe.jpg',
'43-sept-de-coupe.jpg',
'44-huit-de-coupe.jpg',
'45-neuf-de-coupe.jpg',
'46-dix-de-coupe.jpg',
'47-valet-de-coupe.jpg',
'48-cavalier-de-coupe.jpg',
'49-reine-de-coupe.jpg',
'50-roi-de-coupe.jpg',
'51-as-de-denier.jpg',
'52-deux-de-denier.jpg',
'53-trois-de-denier.jpg',
'54-quatre-de-denier.jpg',
'55-cinq-de-denier.jpg',
'56-six-de-denier.jpg',
'57-sept-de-denier.jpg',
'58-huit-de-denier.jpg',
'59-neuf-de-denier.jpg',
'60-dix-de-denier.jpg',
'61-valet-de-denier.jpg',
'62-cavalier-de-denier.jpg',
'63-reine-de-denier.jpg',
'64-roi-de-denier.jpg',
'65-as-d-epee.jpg',
'66-deux-d-epee.jpg',
'67-trois-d-epee.jpg',
'68-quatre-d-epee.jpg',
'69-cinq-d-epee.jpg',
'70-six-d-epee.jpg',
'71-sept-d-epee.jpg',
'72-huit-d-epee.jpg',
'73-neuf-d-epee.jpg',
'74-dix-d-epee.jpg',
'75-valet-d-epee.jpg',
'76-cavalier-d-epee.jpg',
'77-reine-d-epee.jpg',
'78-roi-d-epee.jpg'
];
let created = 0;
let skipped = 0;
let errors = 0;
for (const filename of imageFiles) {
const cardData = parseCardFileName(filename);
if (!cardData) {
console.log(`Fichier ignoré: ${filename}`);
skipped++;
continue;
}
try {
// Vérifier si la carte existe déjà
const existing = game.items.find(i => i.name === cardData.name && i.type === 'tarot');
if (existing) {
console.log(`Carte déjà existante: ${cardData.name}`);
skipped++;
continue;
}
// Créer l'item de type tarot dans le dossier
await Item.create({
name: cardData.name,
type: 'tarot',
img: cardData.image,
folder: tarotFolder.id,
system: {
type: cardData.type,
symbole: cardData.symbole,
valeur: cardData.valeur,
description: `<p>${cardData.name}</p>`,
image: cardData.image
}
});
console.log(`✓ Créé: ${cardData.name}`);
created++;
} catch (error) {
console.error(`Erreur lors de la création de ${cardData.name}:`, error);
errors++;
}
}
// Afficher un résumé
const message = `
<h3>Création du jeu de Tarot terminée</h3>
<p><strong>Cartes créées:</strong> ${created}</p>
<p><strong>Cartes ignorées:</strong> ${skipped}</p>
<p><strong>Erreurs:</strong> ${errors}</p>
`;
ChatMessage.create({
user: game.user.id,
content: message
});
ui.notifications.info(`Création terminée: ${created} cartes créées, ${skipped} ignorées, ${errors} erreurs.`);
}
// Exécution de la macro
createTarotDeck();