Initial system import
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
/**
|
||||
* 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();
|
||||
Reference in New Issue
Block a user