/** * 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: `

${cardData.name}

`, 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 = `

Création du jeu de Tarot terminée

Cartes créées: ${created}

Cartes ignorées: ${skipped}

Erreurs: ${errors}

`; 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();