diff --git a/assets/ui/banner_compendium.png b/assets/ui/banner_compendium.png
deleted file mode 100644
index 76c4b08..0000000
Binary files a/assets/ui/banner_compendium.png and /dev/null differ
diff --git a/assets/ui/hellborn_background_01.webp b/assets/ui/hellborn_background_01.webp
deleted file mode 100644
index 853c1d7..0000000
Binary files a/assets/ui/hellborn_background_01.webp and /dev/null differ
diff --git a/assets/ui/hellborn_logo.webp b/assets/ui/hellborn_logo.webp
deleted file mode 100644
index 44235b2..0000000
Binary files a/assets/ui/hellborn_logo.webp and /dev/null differ
diff --git a/assets/ui/illu_alknonost_01.webp b/assets/ui/illu_alknonost_01.webp
new file mode 100644
index 0000000..09a4232
Binary files /dev/null and b/assets/ui/illu_alknonost_01.webp differ
diff --git a/assets/ui/pentagram_logo.webp b/assets/ui/pentagram_logo.webp
deleted file mode 100644
index d5f2720..0000000
Binary files a/assets/ui/pentagram_logo.webp and /dev/null differ
diff --git a/assets/ui/rose_des_vents_01.webp b/assets/ui/rose_des_vents_01.webp
new file mode 100644
index 0000000..1b27db2
Binary files /dev/null and b/assets/ui/rose_des_vents_01.webp differ
diff --git a/css/fvtt-hamalron.css b/css/fvtt-hamalron.css
index 5d3e050..e511305 100644
--- a/css/fvtt-hamalron.css
+++ b/css/fvtt-hamalron.css
@@ -13,7 +13,7 @@
--font-primary: "TimesNewRoman";
--font-secondary: "TimesNewRoman";
--font-title: "EagleLake";
- --logo-standard: url("../assets/ui/pentagram_logo.webp");
+ --logo-standard: url("../assets/ui/rose_des_vents_01.webp");
--title-color: #dea60b;
--background-box: #e0dcdc;
--color-success: #0f7a0f;
@@ -2936,6 +2936,58 @@ i.fvtt-hamalron {
color: #f39c12;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}
+.fvtt-hamalron.chat-tarot-summary {
+ background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf1 100%);
+ border: 2px solid #667eea;
+ border-radius: 0.5rem;
+ padding: 1rem;
+}
+.fvtt-hamalron.chat-tarot-summary .tarot-summary-title {
+ text-align: center;
+ color: #667eea;
+ font-size: 1.2rem;
+ margin: 0 0 1rem 0;
+ font-weight: bold;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+.fvtt-hamalron.chat-tarot-summary .tarot-summary-title i {
+ margin-right: 0.5rem;
+}
+.fvtt-hamalron.chat-tarot-summary .tarot-cards-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 0.5rem;
+}
+.fvtt-hamalron.chat-tarot-summary .tarot-cards-grid .tarot-card-summary-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ background: white;
+ border: 1px solid #ddd;
+ border-radius: 0.25rem;
+ padding: 0.35rem;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s, box-shadow 0.2s;
+}
+.fvtt-hamalron.chat-tarot-summary .tarot-cards-grid .tarot-card-summary-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);
+}
+.fvtt-hamalron.chat-tarot-summary .tarot-cards-grid .tarot-card-summary-item img {
+ width: 35px;
+ height: auto;
+ border-radius: 0.2rem;
+ margin-bottom: 0.3rem;
+ object-fit: contain;
+}
+.fvtt-hamalron.chat-tarot-summary .tarot-cards-grid .tarot-card-summary-item .card-name {
+ font-size: 0.65rem;
+ color: #333;
+ font-weight: 600;
+ line-height: 1.1;
+}
@keyframes pulse-banner {
0%,
100% {
@@ -2952,7 +3004,9 @@ i.fvtt-hamalron {
.application.dialog.fvtt-hamalron button {
background-image: none;
background-color: var(--color-dark-6);
- color: var(--color-light-1);
+ color: #ffffff;
+ font-weight: 500;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.application.dialog.fvtt-hamalron input,
.application.dialog.fvtt-hamalron select {
diff --git a/lang/fr.json b/lang/fr.json
index 1fd6f29..bd99fd0 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -604,7 +604,7 @@
},
"Roll": {
"cancel": "Annuler",
- "roll": "Lancer",
+ "roll": "Lancer l'épreuve",
"rollCompetence": "Jet de compétence",
"skill": "Compétence"
},
@@ -678,10 +678,10 @@
"CollectHandsConfirm": "Récupérer toutes les mains ?",
"CollectHandsWarning": "Cela récupérera toutes les cartes de tarot de tous les personnages joueurs et les réintégrera dans le deck. Les doublons seront supprimés pour garantir un deck de 78 cartes.",
"HandsCollected": "{collected} cartes récupérées. Deck réinitialisé avec {deckSize} cartes uniques.",
- "DistributeCards": "Distribuer 8 cartes",
- "DistributeConfirm": "Distribuer les cartes ?",
- "DistributeWarning": "Cela distribuera 8 cartes du deck à chaque joueur connecté.",
- "CardsDistributed": "{cards} cartes distribuées à {players} joueur(s).",
+ "DistributeCards": "Main de départ",
+ "DistributeConfirm": "Distribuer la main de départ ?",
+ "DistributeWarning": "Cela distribuera 8 cartes du deck à chaque joueur connecté (le Mat est exclu de la distribution initiale).",
+ "CardsDistributed": "{cards} cartes distribuées à {players} joueur(s). Le Mat a été remis dans le deck et le paquet a été remélangé.",
"NotEnoughCards": "Pas assez de cartes dans le deck (minimum 8 requises).",
"DeckEmpty": "Le jeu est vide",
"DeckEmptyWarning": "Le jeu est vide. Veuillez réinitialiser le jeu pour continuer.",
@@ -692,6 +692,16 @@
"DrawOne": "Tirer 1 carte",
"DrawTension": "Tirage sous tension",
"DrawThree": "Tirer 3 cartes",
+ "DrawThreeTrumps": "Tirer 3 atouts",
+ "DrawEightNumbered": "Tirer 8 cartes numérotées",
+ "DrawOneTrump": "Tirer 1 atout",
+ "EightNumberedCardsDrawn": "8 Cartes Numérotées Tirées",
+ "ThreeTrumpsDrawn": "3 atouts tirés et remélangés dans le deck",
+ "EightNumberedDrawn": "8 cartes numérotées tirées et remélangées dans le deck",
+ "OneTrumpDrawn": "1 atout tiré et remélangé dans le deck",
+ "NotEnoughTrumps": "Pas assez d'atouts dans le deck (minimum 3 requis)",
+ "NotEnoughNumbered": "Pas assez de cartes numérotées dans le deck (minimum 8 requises)",
+ "NoTrumpsAvailable": "Aucun atout disponible dans le deck",
"GMOnly": "Seul le MJ peut accéder au gestionnaire de jeu de tarot",
"NoCardsFound": "Aucune carte de tarot trouvée dans le monde. Veuillez d'abord créer des objets tarot.",
"NoDiscard": "La défausse est vide",
diff --git a/module/applications/tarot-deck-manager.mjs b/module/applications/tarot-deck-manager.mjs
index d22c846..9c8fd39 100644
--- a/module/applications/tarot-deck-manager.mjs
+++ b/module/applications/tarot-deck-manager.mjs
@@ -30,6 +30,9 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
collectHands: HamalronTarotDeckManager.#onCollectHands,
distributeCards: HamalronTarotDeckManager.#onDistributeCards,
drawTension: HamalronTarotDeckManager.#onDrawTension,
+ drawThreeTrumps: HamalronTarotDeckManager.#onDrawThreeTrumps,
+ drawEightNumbered: HamalronTarotDeckManager.#onDrawEightNumbered,
+ drawOneTrump: HamalronTarotDeckManager.#onDrawOneTrump,
},
}
@@ -316,7 +319,8 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
}
/**
- * Distribute 8 cards to all connected players
+ * Distribute 8 cards to all connected players (starting hand)
+ * Excludes the Mat from distribution, then returns it to the deck and reshuffles
* @param {Event} event
* @param {HTMLElement} target
*/
@@ -337,6 +341,7 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
let distributedCount = 0
let playersCount = 0
+ let matCard = null
// Récupérer tous les utilisateurs connectés (sauf le GM)
const connectedPlayers = game.users.filter(u => u.active && !u.isGM)
@@ -349,10 +354,22 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
)
if (playerCharacter) {
- // Tirer 8 cartes pour ce personnage
+ // Tirer 8 cartes pour ce personnage (en ignorant le Mat)
const cardsToDistribute = []
- for (let i = 0; i < 8 && this.deck.length > 0; i++) {
+ let attempts = 0
+ const maxAttempts = this.deck.length + 10 // Safety limit
+
+ while (cardsToDistribute.length < 8 && this.deck.length > 0 && attempts < maxAttempts) {
const card = this.deck.shift()
+ attempts++
+
+ // Si c'est le Mat, le mettre de côté
+ if (card.valeur === "lemat") {
+ matCard = card
+ console.log("Le Mat trouvé et mis de côté pour être remis dans le deck après distribution")
+ continue
+ }
+
cardsToDistribute.push(card)
}
@@ -362,14 +379,6 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
if (originalItem) {
await playerCharacter.createEmbeddedDocuments("Item", [originalItem.toObject()])
distributedCount++
-
- // Cas spécial : Le Mat
- if (card.valeur === "lemat") {
- console.log(`Le Mat distributed to ${playerCharacter.name}! Executing special rules...`)
- // Import de TirageTarot pour accéder à la fonction helper
- const { default: HamalronTirageTarot } = await import("../documents/tirage-tarot.mjs")
- await HamalronTirageTarot.handleLeMatEffect(playerCharacter, this)
- }
}
}
@@ -377,6 +386,16 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
}
}
+ // Remettre le Mat dans le deck si il a été trouvé
+ if (matCard) {
+ this.deck.push(matCard)
+ console.log("Le Mat a été remis dans le deck")
+ }
+
+ // Remélanger le deck restant
+ this.shuffleDeck()
+ console.log("Le deck restant a été remélangé")
+
this.saveDeckState()
ui.notifications.info(
@@ -389,6 +408,105 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
this.render()
}
+ /**
+ * Draw 3 trumps (atouts only)
+ * Cards are returned to deck and reshuffled after draw
+ * @param {Event} event
+ * @param {HTMLElement} target
+ */
+ static async #onDrawThreeTrumps(event, target) {
+ const trumpCards = this.deck.filter(card => card.type === "atout")
+
+ if (trumpCards.length < 3) {
+ ui.notifications.warn(game.i18n.localize("HAMALRON.TarotDeck.NotEnoughTrumps"))
+ return
+ }
+
+ // Tirer 3 atouts au hasard
+ const drawnCards = []
+ const availableTrumps = [...trumpCards]
+
+ for (let i = 0; i < 3; i++) {
+ const randomIndex = Math.floor(Math.random() * availableTrumps.length)
+ const card = availableTrumps.splice(randomIndex, 1)[0]
+ drawnCards.push(card)
+ }
+
+ // Envoyer au chat
+ await this.sendCardsToChat(drawnCards)
+
+ // Remélanger le deck (les cartes restent dedans)
+ this.shuffleDeck()
+ this.saveDeckState()
+ this.render()
+
+ ui.notifications.info(game.i18n.localize("HAMALRON.TarotDeck.ThreeTrumpsDrawn"))
+ }
+
+ /**
+ * Draw 8 numbered cards (cards 1-10 from the 4 symbols)
+ * Cards are returned to deck and reshuffled after draw
+ * @param {Event} event
+ * @param {HTMLElement} target
+ */
+ static async #onDrawEightNumbered(event, target) {
+ const numberedCards = this.deck.filter(card => card.type === "numéro")
+
+ if (numberedCards.length < 8) {
+ ui.notifications.warn(game.i18n.localize("HAMALRON.TarotDeck.NotEnoughNumbered"))
+ return
+ }
+
+ // Tirer 8 cartes numérotées au hasard
+ const drawnCards = []
+ const availableNumbered = [...numberedCards]
+
+ for (let i = 0; i < 8; i++) {
+ const randomIndex = Math.floor(Math.random() * availableNumbered.length)
+ const card = availableNumbered.splice(randomIndex, 1)[0]
+ drawnCards.push(card)
+ }
+
+ // Envoyer un résumé au chat
+ await this.sendNumberedCardsSummaryToChat(drawnCards)
+
+ // Remélanger le deck (les cartes restent dedans)
+ this.shuffleDeck()
+ this.saveDeckState()
+ this.render()
+
+ ui.notifications.info(game.i18n.localize("HAMALRON.TarotDeck.EightNumberedDrawn"))
+ }
+
+ /**
+ * Draw 1 trump (atout only)
+ * Card is returned to deck and reshuffled after draw
+ * @param {Event} event
+ * @param {HTMLElement} target
+ */
+ static async #onDrawOneTrump(event, target) {
+ const trumpCards = this.deck.filter(card => card.type === "atout")
+
+ if (trumpCards.length === 0) {
+ ui.notifications.warn(game.i18n.localize("HAMALRON.TarotDeck.NoTrumpsAvailable"))
+ return
+ }
+
+ // Tirer 1 atout au hasard
+ const randomIndex = Math.floor(Math.random() * trumpCards.length)
+ const card = trumpCards[randomIndex]
+
+ // Envoyer au chat
+ await this.sendCardsToChat([card])
+
+ // Remélanger le deck (la carte reste dedans)
+ this.shuffleDeck()
+ this.saveDeckState()
+ this.render()
+
+ ui.notifications.info(game.i18n.localize("HAMALRON.TarotDeck.OneTrumpDrawn"))
+ }
+
/**
* Shuffle discard pile back into deck
* @param {Event} event
@@ -437,7 +555,7 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
const content = `
-
+
@@ -524,6 +642,44 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin
})
}
+ /**
+ * Send numbered cards summary to chat
+ * @param {Array} cards - Array of numbered cards
+ */
+ async sendNumberedCardsSummaryToChat(cards) {
+ const speaker = ChatMessage.getSpeaker({ alias: "Maître du Jeu" })
+
+ // Créer la liste des cartes
+ const cardsList = cards.map(card => {
+ const symboleLabel = game.i18n.localize(`HAMALRON.Tarot.FIELDS.symbole.${card.symbole}`)
+ const valeurLabel = game.i18n.localize(`HAMALRON.Tarot.FIELDS.valeur.${card.valeur}`)
+ return `
+
+

+
${valeurLabel} de ${symboleLabel}
+
+ `
+ }).join('')
+
+ const content = `
+
+
+
+ ${game.i18n.localize("HAMALRON.TarotDeck.EightNumberedCardsDrawn")}
+
+
+ ${cardsList}
+
+
+ `
+
+ await ChatMessage.create({
+ speaker: speaker,
+ content: content,
+ type: CONST.CHAT_MESSAGE_TYPES.OTHER,
+ })
+ }
+
/**
* Open the Tarot Deck Manager application
* @returns {HamalronTarotDeckManager}
diff --git a/module/documents/tirage-tarot.mjs b/module/documents/tirage-tarot.mjs
index e419a00..8cc79b2 100644
--- a/module/documents/tirage-tarot.mjs
+++ b/module/documents/tirage-tarot.mjs
@@ -76,12 +76,16 @@ export default class HamalronTirageTarot {
// Marquer les cartes de succès
if (options.tarotCards && actor.system.cartesSucces) {
+ const competenceSymbole = options.rollItem.system.carteSymbole
options.tarotCards = options.tarotCards.map(card => {
- const isSuccessCard = card.system.type !== "atout" && Object.keys(actor.system.cartesSucces).some(symbole => {
- const successCardData = actor.system.cartesSucces[symbole]
- return card.system.symbole === symbole &&
- card.system.valeur === successCardData.value.toString()
- })
+ // Pour qu'une carte soit une carte de succès :
+ // 1. Elle ne doit pas être un atout
+ // 2. Son symbole doit correspondre à celui de la compétence
+ // 3. Sa valeur doit correspondre à celle d'une carte de succès pour ce symbole
+ const isSuccessCard = card.system.type !== "atout" &&
+ card.system.symbole === competenceSymbole &&
+ actor.system.cartesSucces[competenceSymbole] &&
+ card.system.valeur === actor.system.cartesSucces[competenceSymbole].value.toString()
// Créer un objet simple avec toutes les propriétés nécessaires
return {
id: card.id,
@@ -339,12 +343,15 @@ export default class HamalronTirageTarot {
cardSymboleMatch = selectedCard.system.symbole === options.rollItem.system.carteSymbole
// Vérifier si c'est une carte de succès (les atouts ne peuvent jamais être des cartes de succès)
+ // Pour qu'une carte soit une carte de succès :
+ // 1. Elle ne doit pas être un atout
+ // 2. Son symbole doit correspondre à celui de la compétence
+ // 3. Sa valeur doit correspondre à celle d'une carte de succès pour ce symbole
if (actor.system.cartesSucces && selectedCard.system.type !== "atout") {
- isAutomaticSuccess = Object.keys(actor.system.cartesSucces).some(symbole => {
- const successCardData = actor.system.cartesSucces[symbole]
- return selectedCard.system.symbole === symbole &&
- selectedCard.system.valeur === successCardData.value.toString()
- })
+ const competenceSymbole = options.rollItem.system.carteSymbole
+ isAutomaticSuccess = selectedCard.system.symbole === competenceSymbole &&
+ actor.system.cartesSucces[competenceSymbole] &&
+ selectedCard.system.valeur === actor.system.cartesSucces[competenceSymbole].value.toString()
}
}
}
diff --git a/module/models/personnage.mjs b/module/models/personnage.mjs
index 33a6a83..9e70596 100644
--- a/module/models/personnage.mjs
+++ b/module/models/personnage.mjs
@@ -44,6 +44,7 @@ export default class HamalronPersonnage extends foundry.abstract.TypeDataModel {
hair: new fields.StringField({ required: true, nullable: false, initial: "" }),
home: new fields.StringField({ required: true, nullable: false, initial: "" }),
weight: new fields.StringField({ required: true, nullable: false, initial: "" }),
+ origineSociale: new fields.StringField({ required: true, nullable: false, initial: "" }),
})
return schema
diff --git a/packs-system/hamalron-items/CURRENT b/packs-system/hamalron-items/CURRENT
index 32108be..ecb0b4b 100644
--- a/packs-system/hamalron-items/CURRENT
+++ b/packs-system/hamalron-items/CURRENT
@@ -1 +1 @@
-MANIFEST-000016
+MANIFEST-000036
diff --git a/packs-system/hamalron-items/LOG b/packs-system/hamalron-items/LOG
index 68621cc..3029c78 100644
--- a/packs-system/hamalron-items/LOG
+++ b/packs-system/hamalron-items/LOG
@@ -1,7 +1,7 @@
-2026/01/02-10:10:10.253712 7f93ebfff6c0 Recovering log #15
-2026/01/02-10:10:10.307712 7f93ebfff6c0 Delete type=0 #15
-2026/01/02-10:10:10.307764 7f93ebfff6c0 Delete type=3 #14
-2026/01/02-20:13:00.317288 7f93e9ffb6c0 Level-0 table #19: started
-2026/01/02-20:13:00.317383 7f93e9ffb6c0 Level-0 table #19: 0 bytes OK
-2026/01/02-20:13:00.324182 7f93e9ffb6c0 Delete type=0 #17
-2026/01/02-20:13:00.343771 7f93e9ffb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+2026/04/23-21:08:40.433784 7f9ca63fd6c0 Recovering log #34
+2026/04/23-21:08:40.485675 7f9ca63fd6c0 Delete type=3 #32
+2026/04/23-21:08:40.485751 7f9ca63fd6c0 Delete type=0 #34
+2026/04/24-08:02:08.256846 7f9ca53fb6c0 Level-0 table #39: started
+2026/04/24-08:02:08.256902 7f9ca53fb6c0 Level-0 table #39: 0 bytes OK
+2026/04/24-08:02:08.263739 7f9ca53fb6c0 Delete type=0 #37
+2026/04/24-08:02:08.263920 7f9ca53fb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
diff --git a/packs-system/hamalron-items/LOG.old b/packs-system/hamalron-items/LOG.old
index 9e33e46..5937ba5 100644
--- a/packs-system/hamalron-items/LOG.old
+++ b/packs-system/hamalron-items/LOG.old
@@ -1,3 +1,7 @@
-2025/12/28-22:58:25.963740 7f4a83fff6c0 Recovering log #12
-2025/12/28-22:58:25.975413 7f4a83fff6c0 Delete type=3 #10
-2025/12/28-22:58:25.975552 7f4a83fff6c0 Delete type=0 #12
+2026/01/05-22:50:34.529979 7f93eaffd6c0 Recovering log #30
+2026/01/05-22:50:34.539962 7f93eaffd6c0 Delete type=3 #28
+2026/01/05-22:50:34.540010 7f93eaffd6c0 Delete type=0 #30
+2026/01/05-22:53:30.707035 7f93e9ffb6c0 Level-0 table #35: started
+2026/01/05-22:53:30.707107 7f93e9ffb6c0 Level-0 table #35: 0 bytes OK
+2026/01/05-22:53:30.713792 7f93e9ffb6c0 Delete type=0 #33
+2026/01/05-22:53:30.735909 7f93e9ffb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
diff --git a/packs-system/hamalron-items/MANIFEST-000016 b/packs-system/hamalron-items/MANIFEST-000016
deleted file mode 100644
index 5fc379e..0000000
Binary files a/packs-system/hamalron-items/MANIFEST-000016 and /dev/null differ
diff --git a/packs-system/hamalron-items/MANIFEST-000036 b/packs-system/hamalron-items/MANIFEST-000036
new file mode 100644
index 0000000..6ad80af
Binary files /dev/null and b/packs-system/hamalron-items/MANIFEST-000036 differ
diff --git a/styles/chat.less b/styles/chat.less
index e7aca5b..d330749 100644
--- a/styles/chat.less
+++ b/styles/chat.less
@@ -713,6 +713,69 @@
}
}
}
+
+ // Style pour le résumé des cartes numérotées
+ &.chat-tarot-summary {
+ background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf1 100%);
+ border: 2px solid #667eea;
+ border-radius: 0.5rem;
+ padding: 1rem;
+
+ .tarot-summary-title {
+ text-align: center;
+ color: #667eea;
+ font-size: 1.2rem;
+ margin: 0 0 1rem 0;
+ font-weight: bold;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+
+ i {
+ margin-right: 0.5rem;
+ }
+ }
+
+ .tarot-cards-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 0.5rem;
+
+ .tarot-card-summary-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ background: white;
+ border: 1px solid #ddd;
+ border-radius: 0.25rem;
+ padding: 0.35rem;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+ transition:
+ transform 0.2s,
+ box-shadow 0.2s;
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);
+ }
+
+ img {
+ width: 35px;
+ height: auto;
+ border-radius: 0.2rem;
+ margin-bottom: 0.3rem;
+ object-fit: contain;
+ }
+
+ .card-name {
+ font-size: 0.65rem;
+ color: #333;
+ font-weight: 600;
+ line-height: 1.1;
+ }
+ }
+ }
+ }
}
@keyframes pulse-banner {
diff --git a/styles/global.less b/styles/global.less
index 873e342..35e11ff 100644
--- a/styles/global.less
+++ b/styles/global.less
@@ -5,7 +5,7 @@
--font-primary: "TimesNewRoman";
--font-secondary: "TimesNewRoman";
--font-title: "EagleLake";
- --logo-standard: url("../assets/ui/pentagram_logo.webp");
+ --logo-standard: url("../assets/ui/rose_des_vents_01.webp");
--title-color: #dea60b;
--background-box: #e0dcdc;
--color-success: rgb(15, 122, 15);
diff --git a/styles/roll.less b/styles/roll.less
index 3d21bdc..a684586 100644
--- a/styles/roll.less
+++ b/styles/roll.less
@@ -5,7 +5,9 @@
button {
background-image: none;
background-color: var(--color-dark-6);
- color: var(--color-light-1);
+ color: #ffffff;
+ font-weight: 500;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
input,
diff --git a/system.json b/system.json
index 8fedf76..7f00e3e 100644
--- a/system.json
+++ b/system.json
@@ -6,7 +6,7 @@
"download": "#{DOWNLOAD}#",
"url": "https://www.uberwald.me/gitea/public/fvtt-hamalron",
"license": "LICENSE",
- "version": "13.0.0",
+ "version": "14.0.0",
"authors": [
{
"name": "Uberwald",
@@ -20,7 +20,7 @@
} },
"compatibility": {
"minimum": "13",
- "verified": "13"
+ "verified": "14"
},
"esmodules": ["fvtt-hamalron.mjs"],
"styles": ["css/fvtt-hamalron.css"],
@@ -65,5 +65,5 @@
},
"primaryTokenAttribute": "hp",
"socket": true,
- "background": "systems/fvtt-hamalron/assets/ui/hamalron_background_01.webp"
+ "background": "systems/fvtt-hamalron/assets/ui/illu_alknonost_01.webp"
}
diff --git a/templates/personnage-biographie.hbs b/templates/personnage-biographie.hbs
index 563281c..d0bc402 100644
--- a/templates/personnage-biographie.hbs
+++ b/templates/personnage-biographie.hbs
@@ -68,6 +68,12 @@
rootId=partId
disabled=isPlayMode
}}
+ {{formField
+ systemFields.biodata.fields.origineSociale
+ value=system.biodata.origineSociale
+ rootId=partId
+ disabled=isPlayMode
+ }}
@@ -82,142 +88,6 @@
}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/templates/tarot-deck-manager.hbs b/templates/tarot-deck-manager.hbs
index 2fe837b..0f3ecd5 100644
--- a/templates/tarot-deck-manager.hbs
+++ b/templates/tarot-deck-manager.hbs
@@ -50,6 +50,21 @@
{{localize "HAMALRON.TarotDeck.DrawTension"}}
+
+
+
+
+
+
{{#unless hasCards}}