Full reroll management
Release Creation / build (release) Successful in 43s

This commit is contained in:
2026-06-28 08:39:55 +02:00
parent bb005ee9fc
commit 05c93f9475
2 changed files with 16 additions and 15 deletions
+15 -14
View File
@@ -553,6 +553,17 @@ Hooks.on("preCreateChatMessage", (message) => {
}
})
// Build dice breakdown HTML from a reroll result
function formatRerollBreakdown(reroll) {
const breakdown = (reroll.options?.diceResults || [])
.map(r => `<span class="dice-item"><span class="dice-type">${r.dice}</span><span class="dice-separator">→</span><span class="dice-value">${r.value}</span></span>`)
.join("")
const d30 = reroll.options?.D30message
? `<div class="d30-result"><span class="d30-value">D30 → ${reroll.options.D30result || "?"}</span> — ${reroll.options.D30message.description}</div>`
: ""
return { breakdown, d30 }
}
// Hook global pour gérer l'offre de Grit à l'attaquant après une défense
Hooks.on("createChatMessage", async (message) => {
const rollType = message.rolls[0]?.options?.rollType
@@ -572,7 +583,7 @@ Hooks.on("createChatMessage", async (message) => {
return
}
let {
const {
attackerId,
attackRoll,
attackerName,
@@ -580,13 +591,13 @@ Hooks.on("createChatMessage", async (message) => {
attackWeaponId,
attackRollType,
attackRollKey,
attackD30message,
attackRerollContext,
attackNaturalRoll,
damageTier,
defenderId,
defenderTokenId
} = attackData
let { attackD30message } = attackData
let defenseRoll = message.rolls[0]?.options?.rollTotal || message.rolls[0]?.total || 0
let defenseD30message = message.rolls[0]?.options?.D30message || null
@@ -807,12 +818,7 @@ Hooks.on("createChatMessage", async (message) => {
if (!reroll) continue
defenseRoll = reroll.options?.rollTotal || reroll.total || oldDefenseRoll
// Build dice breakdown HTML from the reroll
const rerollBreakdown = (reroll.options?.diceResults || [])
.map(r => `<span class="dice-item"><span class="dice-type">${r.dice}</span><span class="dice-separator">→</span><span class="dice-value">${r.value}</span></span>`)
.join("")
const rerollD30 = reroll.options?.D30message
? `<div class="d30-result"><span class="d30-value">D30 → ${reroll.options.D30result || "?"}</span> — ${reroll.options.D30message.description}</div>`
: ""
const { breakdown: rerollBreakdown, d30: rerollD30 } = formatRerollBreakdown(reroll)
await createReactionMessage(defender,
`<p><strong>${defenderName}</strong> uses Mulligan and re-rolls defense: <strong>${oldDefenseRoll}</strong> → <strong>${defenseRoll}</strong>.</p>
<div class="dice-breakdown">${rerollBreakdown}</div>${rerollD30}
@@ -1020,12 +1026,7 @@ Hooks.on("createChatMessage", async (message) => {
if (!reroll) continue
attackRollFinal = reroll.options?.rollTotal || reroll.total || oldAttackRoll
// Build dice breakdown HTML from the reroll
const rerollBreakdown = (reroll.options?.diceResults || [])
.map(r => `<span class="dice-item"><span class="dice-type">${r.dice}</span><span class="dice-separator">→</span><span class="dice-value">${r.value}</span></span>`)
.join("")
const rerollD30 = reroll.options?.D30message
? `<div class="d30-result"><span class="d30-value">D30 → ${reroll.options.D30result || "?"}</span> — ${reroll.options.D30message.description}</div>`
: ""
const { breakdown: rerollBreakdown, d30: rerollD30 } = formatRerollBreakdown(reroll)
await createReactionMessage(attacker,
`<p><strong>${attackerName}</strong> uses Mulligan and re-rolls attack: <strong>${oldAttackRoll}</strong> → <strong>${attackRollFinal}</strong>.</p>
<div class="dice-breakdown">${rerollBreakdown}</div>${rerollD30}
+1 -1
View File
@@ -1505,7 +1505,7 @@ export default class LethalFantasyRoll extends Roll {
if (this.type === "weapon-attack" && this.rollTarget?.weapon) {
const weapon = this.rollTarget.weapon
weaponDamageOptions = {
weaponId: weapon.id,
weaponId: weapon._id || weapon.id,
weaponName: weapon.name,
damageM: weapon.system?.damage?.damageM
}