From 347504f544da61358ba8d36c76c6942b453d24ce Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Fri, 10 Jul 2026 23:23:44 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20boutons=20Sous=20tension=20et=20Oppos?= =?UTF-8?q?=C3=A9=20fonctionnels=20dans=20le=20chat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Clic 'Sous tension' : tire une carte du deck, compare avec le score - Clic 'Opposé' : idem avec libellé Opposant - Résultat affiché dans un nouveau message de chat --- fvtt-hamalron.mjs | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/fvtt-hamalron.mjs b/fvtt-hamalron.mjs index f087d53..07387a0 100644 --- a/fvtt-hamalron.mjs +++ b/fvtt-hamalron.mjs @@ -243,6 +243,75 @@ Hooks.on("createChatMessage", async (message, options, userId) => { }) +// Chat action buttons (Sous tension / Opposé) +$(document).on("click", "[data-action='sousTension']", async function () { + const msgEl = $(this).closest(".chat-message") + const msgId = msgEl?.data("messageId") + const msg = game.messages?.get(msgId) + if (!msg) return + + // Extract the player's total from the message content + const totalText = msgEl.find(".calc-total")?.text()?.trim() + const totalJoueur = Number(totalText) || 0 + const actorName = msg.speaker?.alias || "Inconnu" + + // Draw a card and apply tension modifier (default 0) + const deckManager = globalThis.HamalronTarotDeckManager?._instance + if (!deckManager || deckManager.deck.length === 0) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.deckEmpty")) + return + } + const drawn = deckManager.drawCards(1) + if (!drawn.length) return + const card = drawn[0] + const valData = SYSTEM.TAROT_VALEURS[card.valeur] + const valeurMJ = valData?.value ?? 0 + deckManager.addToDiscard(card) + await deckManager.saveDeckState() + + const totalMJ = valeurMJ + const success = totalJoueur >= totalMJ + ChatMessage.create({ + content: `

${game.i18n.localize("HAMALRON.Label.sousTension")}

+

${actorName}: ${totalJoueur} vs MJ: ${card.name} (${totalMJ})

+

${success ? game.i18n.localize("HAMALRON.Label.success") : game.i18n.localize("HAMALRON.Label.failure")}

`, + style: CONST.CHAT_MESSAGE_STYLES.OTHER, + }) +}) + +$(document).on("click", "[data-action='oppose']", async function () { + const msgEl = $(this).closest(".chat-message") + const msgId = msgEl?.data("messageId") + const msg = game.messages?.get(msgId) + if (!msg) return + + const totalText = msgEl.find(".calc-total")?.text()?.trim() + const totalJoueur = Number(totalText) || 0 + const actorName = msg.speaker?.alias || "Inconnu" + + // Draw opposition card + const deckManager = globalThis.HamalronTarotDeckManager?._instance + if (!deckManager || deckManager.deck.length === 0) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.deckEmpty")) + return + } + const drawn = deckManager.drawCards(1) + if (!drawn.length) return + const card = drawn[0] + const valData = SYSTEM.TAROT_VALEURS[card.valeur] + const valeurOpposant = valData?.value ?? 0 + deckManager.addToDiscard(card) + await deckManager.saveDeckState() + + const success = totalJoueur >= valeurOpposant + ChatMessage.create({ + content: `

${game.i18n.localize("HAMALRON.Label.oppose")}

+

${actorName}: ${totalJoueur} vs Opposant: ${card.name} (${valeurOpposant})

+

${success ? game.i18n.localize("HAMALRON.Label.success") : game.i18n.localize("HAMALRON.Label.failure")}

`, + style: CONST.CHAT_MESSAGE_STYLES.OTHER, + }) +}) + Hooks.on("hotbarDrop", (bar, data, slot) => { if (data.type === "Actor") { const actor = fromUuidSync(data.uuid)