feat: tarot deck auto-import depuis compendium/data JSON

resetDeck() cherche les cartes dans cet ordre :
1. game.items (items monde existants)
2. Compendium système fvtt-hamalron.hamalron-items
3. assets/data/tarot.json (création automatique)

Ajout de assets/data/tarot.json : 78 cartes standard
This commit is contained in:
2026-07-10 23:49:31 +02:00
parent b480ab3cae
commit 29b93b5ed1
2 changed files with 606 additions and 23 deletions
+548
View File
@@ -0,0 +1,548 @@
[
{
"name": "Le Bateleur",
"type": "atout",
"symbole": "coupe",
"valeur": "1",
"description": "<p>Le Bateleur</p>"
},
{
"name": "La Papesse",
"type": "atout",
"symbole": "coupe",
"valeur": "2",
"description": "<p>La Papesse</p>"
},
{
"name": "L'Impératrice",
"type": "atout",
"symbole": "coupe",
"valeur": "3",
"description": "<p>L'Impératrice</p>"
},
{
"name": "L'Empereur",
"type": "atout",
"symbole": "coupe",
"valeur": "4",
"description": "<p>L'Empereur</p>"
},
{
"name": "Le Pape",
"type": "atout",
"symbole": "coupe",
"valeur": "5",
"description": "<p>Le Pape</p>"
},
{
"name": "L'Amoureux",
"type": "atout",
"symbole": "coupe",
"valeur": "6",
"description": "<p>L'Amoureux</p>"
},
{
"name": "Le Chariot",
"type": "atout",
"symbole": "coupe",
"valeur": "7",
"description": "<p>Le Chariot</p>"
},
{
"name": "La Justice",
"type": "atout",
"symbole": "coupe",
"valeur": "8",
"description": "<p>La Justice</p>"
},
{
"name": "L'Hermite",
"type": "atout",
"symbole": "coupe",
"valeur": "9",
"description": "<p>L'Hermite</p>"
},
{
"name": "La Roue de Fortune",
"type": "atout",
"symbole": "coupe",
"valeur": "10",
"description": "<p>La Roue de Fortune</p>"
},
{
"name": "La Force",
"type": "atout",
"symbole": "coupe",
"valeur": "11",
"description": "<p>La Force</p>"
},
{
"name": "Le Pendu",
"type": "atout",
"symbole": "coupe",
"valeur": "12",
"description": "<p>Le Pendu</p>"
},
{
"name": "L'Arcane sans Nom",
"type": "atout",
"symbole": "coupe",
"valeur": "13",
"description": "<p>L'Arcane sans Nom</p>"
},
{
"name": "La Tempérance",
"type": "atout",
"symbole": "coupe",
"valeur": "14",
"description": "<p>La Tempérance</p>"
},
{
"name": "Le Diable",
"type": "atout",
"symbole": "coupe",
"valeur": "15",
"description": "<p>Le Diable</p>"
},
{
"name": "La Maison Dieu",
"type": "atout",
"symbole": "coupe",
"valeur": "16",
"description": "<p>La Maison Dieu</p>"
},
{
"name": "L'Étoile",
"type": "atout",
"symbole": "coupe",
"valeur": "17",
"description": "<p>L'Étoile</p>"
},
{
"name": "La Lune",
"type": "atout",
"symbole": "coupe",
"valeur": "18",
"description": "<p>La Lune</p>"
},
{
"name": "Le Soleil",
"type": "atout",
"symbole": "coupe",
"valeur": "19",
"description": "<p>Le Soleil</p>"
},
{
"name": "Le Jugement",
"type": "atout",
"symbole": "coupe",
"valeur": "20",
"description": "<p>Le Jugement</p>"
},
{
"name": "Le Monde",
"type": "atout",
"symbole": "coupe",
"valeur": "21",
"description": "<p>Le Monde</p>"
},
{
"name": "Le Mat",
"type": "atout",
"symbole": "coupe",
"valeur": "lemat",
"description": "<p>Le Mat</p>"
},
{
"name": "As de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "1",
"description": "<p>As de Bâton</p>"
},
{
"name": "2 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "2",
"description": "<p>2 de Bâton</p>"
},
{
"name": "3 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "3",
"description": "<p>3 de Bâton</p>"
},
{
"name": "4 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "4",
"description": "<p>4 de Bâton</p>"
},
{
"name": "5 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "5",
"description": "<p>5 de Bâton</p>"
},
{
"name": "6 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "6",
"description": "<p>6 de Bâton</p>"
},
{
"name": "7 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "7",
"description": "<p>7 de Bâton</p>"
},
{
"name": "8 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "8",
"description": "<p>8 de Bâton</p>"
},
{
"name": "9 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "9",
"description": "<p>9 de Bâton</p>"
},
{
"name": "10 de Bâton",
"type": "numéro",
"symbole": "baton",
"valeur": "10",
"description": "<p>10 de Bâton</p>"
},
{
"name": "As de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "1",
"description": "<p>As de Coupe</p>"
},
{
"name": "2 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "2",
"description": "<p>2 de Coupe</p>"
},
{
"name": "3 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "3",
"description": "<p>3 de Coupe</p>"
},
{
"name": "4 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "4",
"description": "<p>4 de Coupe</p>"
},
{
"name": "5 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "5",
"description": "<p>5 de Coupe</p>"
},
{
"name": "6 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "6",
"description": "<p>6 de Coupe</p>"
},
{
"name": "7 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "7",
"description": "<p>7 de Coupe</p>"
},
{
"name": "8 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "8",
"description": "<p>8 de Coupe</p>"
},
{
"name": "9 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "9",
"description": "<p>9 de Coupe</p>"
},
{
"name": "10 de Coupe",
"type": "numéro",
"symbole": "coupe",
"valeur": "10",
"description": "<p>10 de Coupe</p>"
},
{
"name": "As de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "1",
"description": "<p>As de Denier</p>"
},
{
"name": "2 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "2",
"description": "<p>2 de Denier</p>"
},
{
"name": "3 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "3",
"description": "<p>3 de Denier</p>"
},
{
"name": "4 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "4",
"description": "<p>4 de Denier</p>"
},
{
"name": "5 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "5",
"description": "<p>5 de Denier</p>"
},
{
"name": "6 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "6",
"description": "<p>6 de Denier</p>"
},
{
"name": "7 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "7",
"description": "<p>7 de Denier</p>"
},
{
"name": "8 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "8",
"description": "<p>8 de Denier</p>"
},
{
"name": "9 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "9",
"description": "<p>9 de Denier</p>"
},
{
"name": "10 de Denier",
"type": "numéro",
"symbole": "denier",
"valeur": "10",
"description": "<p>10 de Denier</p>"
},
{
"name": "As d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "1",
"description": "<p>As d'Épée</p>"
},
{
"name": "2 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "2",
"description": "<p>2 d'Épée</p>"
},
{
"name": "3 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "3",
"description": "<p>3 d'Épée</p>"
},
{
"name": "4 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "4",
"description": "<p>4 d'Épée</p>"
},
{
"name": "5 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "5",
"description": "<p>5 d'Épée</p>"
},
{
"name": "6 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "6",
"description": "<p>6 d'Épée</p>"
},
{
"name": "7 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "7",
"description": "<p>7 d'Épée</p>"
},
{
"name": "8 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "8",
"description": "<p>8 d'Épée</p>"
},
{
"name": "9 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "9",
"description": "<p>9 d'Épée</p>"
},
{
"name": "10 d'Épée",
"type": "numéro",
"symbole": "epee",
"valeur": "10",
"description": "<p>10 d'Épée</p>"
},
{
"name": "Valet de Bâton",
"type": "figure",
"symbole": "baton",
"valeur": "valet",
"description": "<p>Valet de Bâton</p>"
},
{
"name": "Cavalier de Bâton",
"type": "figure",
"symbole": "baton",
"valeur": "cavalier",
"description": "<p>Cavalier de Bâton</p>"
},
{
"name": "Reine de Bâton",
"type": "figure",
"symbole": "baton",
"valeur": "reine",
"description": "<p>Reine de Bâton</p>"
},
{
"name": "Roi de Bâton",
"type": "figure",
"symbole": "baton",
"valeur": "roi",
"description": "<p>Roi de Bâton</p>"
},
{
"name": "Valet de Coupe",
"type": "figure",
"symbole": "coupe",
"valeur": "valet",
"description": "<p>Valet de Coupe</p>"
},
{
"name": "Cavalier de Coupe",
"type": "figure",
"symbole": "coupe",
"valeur": "cavalier",
"description": "<p>Cavalier de Coupe</p>"
},
{
"name": "Reine de Coupe",
"type": "figure",
"symbole": "coupe",
"valeur": "reine",
"description": "<p>Reine de Coupe</p>"
},
{
"name": "Roi de Coupe",
"type": "figure",
"symbole": "coupe",
"valeur": "roi",
"description": "<p>Roi de Coupe</p>"
},
{
"name": "Valet de Denier",
"type": "figure",
"symbole": "denier",
"valeur": "valet",
"description": "<p>Valet de Denier</p>"
},
{
"name": "Cavalier de Denier",
"type": "figure",
"symbole": "denier",
"valeur": "cavalier",
"description": "<p>Cavalier de Denier</p>"
},
{
"name": "Reine de Denier",
"type": "figure",
"symbole": "denier",
"valeur": "reine",
"description": "<p>Reine de Denier</p>"
},
{
"name": "Roi de Denier",
"type": "figure",
"symbole": "denier",
"valeur": "roi",
"description": "<p>Roi de Denier</p>"
},
{
"name": "Valet d'Épée",
"type": "figure",
"symbole": "epee",
"valeur": "valet",
"description": "<p>Valet d'Épée</p>"
},
{
"name": "Cavalier d'Épée",
"type": "figure",
"symbole": "epee",
"valeur": "cavalier",
"description": "<p>Cavalier d'Épée</p>"
},
{
"name": "Reine d'Épée",
"type": "figure",
"symbole": "epee",
"valeur": "reine",
"description": "<p>Reine d'Épée</p>"
},
{
"name": "Roi d'Épée",
"type": "figure",
"symbole": "epee",
"valeur": "roi",
"description": "<p>Roi d'Épée</p>"
}
]
+58 -23
View File
@@ -5,7 +5,7 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
super(options)
this.deck = []
this.discard = []
this.loadDeckState()
this.loadDeckState().catch(e => console.warn("Deck init error:", e))
}
/** @override */
@@ -58,46 +58,81 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
/**
* Load the deck state from settings
*/
loadDeckState() {
async loadDeckState() {
const state = game.settings.get("fvtt-hamalron", "tarotDeckState")
if (state && state.deck && state.deck.length > 0) {
this.deck = state.deck
this.discard = state.discard || []
console.log("Deck state loaded:", state)
} else {
// Si aucun état sauvegardé, initialiser un nouveau deck
this.resetDeck()
await this.resetDeck()
}
}
/**
* Reset the deck to a full tarot deck
*/
resetDeck() {
async resetDeck() {
this.deck = []
this.discard = []
// Créer toutes les cartes du jeu de tarot
const items = game.items.filter(i => i.type === "tarot")
let items = game.items.filter(i => i.type === "tarot")
if (items.length > 0) {
// Utiliser les items existants
this.deck = items.map(item => ({
id: item.id,
name: item.name,
img: item.img,
symbole: item.system.symbole,
valeur: item.system.valeur,
type: item.system.type,
description: item.system.description,
}))
} else {
ui.notifications.warn("HAMALRON.TarotDeck.NoCardsFound", { localize: true })
// Si aucune carte dans le monde, importer depuis le compendium système
if (items.length === 0) {
const pack = game.packs.get("fvtt-hamalron.hamalron-items")
if (pack) {
const docs = await pack.getDocuments()
const tarotDocs = docs.filter(d => d.type === "tarot")
if (tarotDocs.length > 0) {
for (const doc of tarotDocs) {
const imported = await Item.create(doc.toObject(), { temporary: false })
if (imported) items.push(imported)
}
}
}
}
// Dernier recours : créer les cartes depuis les données JSON
if (items.length === 0) {
try {
const resp = await fetch("systems/fvtt-hamalron/assets/data/tarot.json")
const data = await resp.json()
if (Array.isArray(data) && data.length > 0) {
for (const card of data) {
const created = await Item.create({
name: card.name,
type: "tarot",
img: "icons/svg/treasure.svg",
system: {
type: card.type,
symbole: card.symbole,
valeur: card.valeur,
description: card.description || `<p>${card.name}</p>`,
image: "icons/svg/treasure.svg",
},
})
if (created) items.push(created)
}
}
} catch (e) {
console.warn("Hamalron | Failed to load tarot.json:", e)
}
}
// Construire le deck
this.deck = items.map(item => ({
id: item.id,
name: item.name,
img: item.img,
symbole: item.system.symbole,
valeur: item.system.valeur,
type: item.system.type,
description: item.system.description,
}))
// Mélanger le deck
this.shuffleDeck()
this.saveDeckState()
await this.saveDeckState()
this.render()
}
@@ -186,7 +221,7 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
})
if (confirmed) {
this.resetDeck()
await this.resetDeck()
ui.notifications.info("HAMALRON.TarotDeck.DeckReset", { localize: true })
}
}