Add luck option after roll, attributes above 6, fix miracle icon and grit bonus
All checks were successful
Release Creation / build (release) Successful in 1m36s

This commit is contained in:
2026-04-20 08:23:33 +02:00
parent 36cb3bc755
commit b4211c121d
19 changed files with 373 additions and 26 deletions

View File

@@ -8,7 +8,9 @@ import OathHammerUtils from "./module/utils.mjs"
import OathHammerWeaponDialog from "./module/applications/weapon-dialog.mjs"
import OathHammerCombat from "./module/combat.mjs"
import { rollWeaponDamage } from "./module/rolls.mjs"
import { rollPostRollLuck } from "./module/rolls.mjs"
import { injectFreeRollBar } from "./module/applications/free-roll.mjs"
import OathHammerLuckRollDialog from "./module/applications/luck-roll-dialog.mjs"
Hooks.once("init", function () {
console.info(SYSTEM.ASCII)
@@ -152,19 +154,64 @@ Hooks.on("preCreateActor", (actor, _data, _options, _userId) => {
})
// Handle "Roll Damage" button in weapon attack chat cards
Hooks.on("renderChatMessageHTML", (message, html) => {
Hooks.on("renderChatMessageHTML", async (message, html) => {
// Weapon damage button
const btn = html.querySelector("[data-action=\"rollWeaponDamage\"]")
if (!btn) return
btn.addEventListener("click", async () => {
const flagData = message.getFlag("fvtt-oath-hammer", "weaponAttack")
if (!flagData) return
const { actorUuid, weaponUuid, attackSuccesses } = flagData
const actor = await fromUuid(actorUuid)
const weapon = await fromUuid(weaponUuid)
if (!actor || !weapon) return ui.notifications.warn(game.i18n.localize("OATHHAMMER.Roll.NoActor"))
const opts = await OathHammerWeaponDialog.promptDamage(actor, weapon, attackSuccesses ?? 0)
if (opts) await rollWeaponDamage(actor, weapon, opts)
})
if (btn) {
btn.addEventListener("click", async () => {
const flagData = message.getFlag("fvtt-oath-hammer", "weaponAttack")
if (!flagData) return
const { actorUuid, weaponUuid, attackSuccesses } = flagData
const actor = await fromUuid(actorUuid)
const weapon = await fromUuid(weaponUuid)
if (!actor || !weapon) return ui.notifications.warn(game.i18n.localize("OATHHAMMER.Roll.NoActor"))
const opts = await OathHammerWeaponDialog.promptDamage(actor, weapon, attackSuccesses ?? 0)
if (opts) await rollWeaponDamage(actor, weapon, opts)
})
}
// Luck post-roll button
const luckFlag = message.getFlag("fvtt-oath-hammer", "luckRoll")
if (!luckFlag) return
const resultDiv = html.querySelector(".oh-roll-result")
if (!resultDiv) return
if (luckFlag.used) {
// Show luck result section
const bonusLabel = luckFlag.bonusSuccesses > 0
? `+${luckFlag.bonusSuccesses} ${game.i18n.localize("OATHHAMMER.Roll.Successes")}`
: game.i18n.localize("OATHHAMMER.Roll.NoBonus")
const resultHtml = `
<div class="oh-luck-result">
<span class="oh-luck-result-icon">🍀</span>
<span>${game.i18n.localize("OATHHAMMER.Roll.LuckResult")} ${bonusLabel}</span>
<span class="oh-luck-dice">${luckFlag.luckDiceHtml ?? ""}</span>
</div>`
resultDiv.insertAdjacentHTML("afterend", resultHtml)
} else {
// Show "Spend Luck" button if actor owns the message and has luck left
const actor = await fromUuid(luckFlag.actorUuid).catch(() => null)
if (!actor?.isOwner) return
const availableLuck = actor.system.luck?.value ?? 0
if (availableLuck <= 0) return
const btnHtml = `
<div class="oh-luck-btn-row">
<button type="button" class="oh-post-luck-btn" data-action="postRollLuck">
🍀 ${game.i18n.localize("OATHHAMMER.Roll.LuckRollPost")}
</button>
</div>`
resultDiv.insertAdjacentHTML("afterend", btnHtml)
html.querySelector("[data-action=\"postRollLuck\"]")?.addEventListener("click", async () => {
const actor = await fromUuid(luckFlag.actorUuid).catch(() => null)
if (!actor) return
const opts = await OathHammerLuckRollDialog.prompt(actor)
if (!opts) return
await rollPostRollLuck(message, opts.luckSpend, opts.luckIsHuman)
})
}
})
// Inject Free Roll bar into the chat sidebar