278 lines
7.3 KiB
JavaScript
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();
|