From f6b35536de48b59ad383bc9a8c4075967a6a728f Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Sun, 14 Dec 2025 20:48:33 +0100 Subject: [PATCH] Manage DR and damage roll --- css/fvtt-lethal-fantasy.css | 115 +++++++++++- lang/en.json | 19 +- lethal-fantasy.mjs | 33 ++++ module/documents/actor.mjs | 31 +++- module/documents/roll.mjs | 19 +- module/utils.mjs | 168 ++++++++++++++---- .../lf-equipment/{000458.log => 000462.log} | 0 .../lf-equipment/{000323.ldb => 000464.ldb} | Bin 217289 -> 217363 bytes packs-system/lf-equipment/CURRENT | 2 +- packs-system/lf-equipment/LOG | 23 ++- packs-system/lf-equipment/LOG.old | 16 +- packs-system/lf-equipment/MANIFEST-000456 | Bin 178 -> 0 bytes packs-system/lf-equipment/MANIFEST-000460 | Bin 0 -> 381 bytes .../lf-gifts/{000458.log => 000462.log} | 0 packs-system/lf-gifts/CURRENT | 2 +- packs-system/lf-gifts/LOG | 16 +- packs-system/lf-gifts/LOG.old | 16 +- .../{MANIFEST-000456 => MANIFEST-000460} | Bin 247 -> 247 bytes .../lf-skills/{000460.log => 000464.log} | 0 packs-system/lf-skills/CURRENT | 2 +- packs-system/lf-skills/LOG | 16 +- packs-system/lf-skills/LOG.old | 16 +- .../{MANIFEST-000458 => MANIFEST-000462} | Bin 178 -> 178 bytes .../{000158.log => 000162.log} | 0 packs-system/lf-spells-miracles/CURRENT | 2 +- packs-system/lf-spells-miracles/LOG | 16 +- packs-system/lf-spells-miracles/LOG.old | 16 +- .../{MANIFEST-000156 => MANIFEST-000160} | Bin 177 -> 177 bytes .../{000457.log => 000461.log} | 0 packs-system/lf-vulnerabilities/CURRENT | 2 +- packs-system/lf-vulnerabilities/LOG | 16 +- packs-system/lf-vulnerabilities/LOG.old | 16 +- .../{MANIFEST-000455 => MANIFEST-000459} | Bin 176 -> 176 bytes styles/chat.less | 59 +++--- styles/roll.less | 132 +++++++++++++- templates/apply-damage-dialog.hbs | 37 ++++ templates/chat-message.hbs | 126 +++++++++---- 37 files changed, 717 insertions(+), 199 deletions(-) rename packs-system/lf-equipment/{000458.log => 000462.log} (100%) rename packs-system/lf-equipment/{000323.ldb => 000464.ldb} (97%) delete mode 100644 packs-system/lf-equipment/MANIFEST-000456 create mode 100644 packs-system/lf-equipment/MANIFEST-000460 rename packs-system/lf-gifts/{000458.log => 000462.log} (100%) rename packs-system/lf-gifts/{MANIFEST-000456 => MANIFEST-000460} (77%) rename packs-system/lf-skills/{000460.log => 000464.log} (100%) rename packs-system/lf-skills/{MANIFEST-000458 => MANIFEST-000462} (71%) rename packs-system/lf-spells-miracles/{000158.log => 000162.log} (100%) rename packs-system/lf-spells-miracles/{MANIFEST-000156 => MANIFEST-000160} (72%) rename packs-system/lf-vulnerabilities/{000457.log => 000461.log} (100%) rename packs-system/lf-vulnerabilities/{MANIFEST-000455 => MANIFEST-000459} (72%) create mode 100644 templates/apply-damage-dialog.hbs diff --git a/css/fvtt-lethal-fantasy.css b/css/fvtt-lethal-fantasy.css index 718af03..b8d2145 100644 --- a/css/fvtt-lethal-fantasy.css +++ b/css/fvtt-lethal-fantasy.css @@ -2218,6 +2218,54 @@ i.lethalfantasy { border-color: var(--color-dark-6); color: var(--color-dark-2); } +.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content { + padding: 6px; + font-size: calc(var(--font-size-standard) * 1); +} +.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .header { + text-align: center; + padding: 4px; + margin-bottom: 6px; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 3px; +} +.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-summary { + display: flex; + justify-content: space-between; + align-items: center; + padding: 4px 6px; + margin-bottom: 6px; + background-color: rgba(139, 0, 0, 0.1); + border-radius: 3px; +} +.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-summary .damage-value { + color: var(--color-level-error); + font-size: calc(var(--font-size-standard) * 1.2); + font-weight: bold; +} +.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .dr-summary { + display: flex; + justify-content: space-around; + gap: 4px; + padding: 3px; + margin-bottom: 6px; + font-size: calc(var(--font-size-standard) * 0.85); + background-color: rgba(0, 0, 0, 0.05); + border-radius: 3px; +} +.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-options .option-line { + display: flex; + justify-content: space-between; + align-items: center; + padding: 3px 6px; + margin: 2px 0; + background-color: rgba(0, 0, 0, 0.05); + border-radius: 3px; +} +.application.dialog.lethalfantasy .apply-damage-dialog .dialog-content .damage-options .option-line strong { + color: var(--color-dark-1); + font-size: calc(var(--font-size-standard) * 1.05); +} .lethalfantasy-roll-dialog fieldset { padding: 4px; } @@ -2261,9 +2309,16 @@ i.lethalfantasy { min-width: 5rem; max-width: 5em; } +.dialog-form .form-footer { + padding: 4px; + gap: 4px; +} .dialog-form .form-footer button { - min-width: 14rem; - min-height: 3.2rem; + min-width: 8rem; + min-height: 2rem; + padding: 2px 6px; + margin: 0; + font-size: calc(var(--font-size-standard) * 0.9); } .dialog-modifier { display: flex; @@ -2356,6 +2411,62 @@ i.lethalfantasy { font-size: calc(var(--font-size-standard) * 1); text-shadow: 0 0 10px var(--color-shadow-primary); } +.dice-roll .damage-result { + width: 100%; + padding: 8px; +} +.dice-roll .damage-result ul { + padding: 0; + margin: 0; +} +.dice-roll .damage-result .li-apply-wounds { + list-style: none; + margin-top: 10px; + padding: 0; + display: none; +} +.dice-roll .damage-result .li-apply-wounds > div:first-child { + font-weight: bold; + margin-bottom: 8px; + font-size: calc(var(--font-size-standard) * 0.95); + text-align: center; +} +.dice-roll .damage-result .li-apply-wounds .combatants-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 6px; + margin-top: 5px; + padding: 8px; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 5px; +} +.dice-roll .damage-result .li-apply-wounds .combatants-grid .apply-wounds-btn { + padding: 6px 10px; + background: linear-gradient(to bottom, #5a5850 0%, #4b4a44 100%); + border: 1px solid #2b2a24; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + color: #f0f0e0; + cursor: pointer; + border-radius: 4px; + font-size: calc(var(--font-size-standard) * 0.85); + font-weight: 500; + text-align: center; + transition: all 0.2s ease; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} +.dice-roll .damage-result .li-apply-wounds .combatants-grid .apply-wounds-btn:hover { + background: linear-gradient(to bottom, #6a6860 0%, #5a5850 100%); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4); + transform: translateY(-1px); + border-color: #3b3a34; +} +.dice-roll .damage-result .li-apply-wounds .combatants-grid .apply-wounds-btn:active { + transform: translateY(0); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +} #token-hud .hp-loss-wrap { position: absolute; left: 75px; diff --git a/lang/en.json b/lang/en.json index 6adf180..6b92bf7 100644 --- a/lang/en.json +++ b/lang/en.json @@ -282,6 +282,7 @@ }, "Label": { "agility": "Dexterity", + "applyDamage": "Apply damage to:", "gotoToken": "Go to token", "combatAction": "Combat action", "currentAction": "Current ongoing action", @@ -421,7 +422,9 @@ "monster-damage": "Monster damage", "monster-defense": "Monster defense", "weapons": "Weapons", - "wis": "WIS" + "wis": "WIS", + "weapon-damage-medium": "Weapon damage medium", + "weapon-damage-small": "Weapon damage small" }, "Miracle": { "FIELDS": { @@ -856,6 +859,20 @@ "melee": "Melee", "ranged": "Ranged" } + }, + "Dialog": { + "applyDamageTo": "Apply damage to", + "weapon": "Weapon", + "totalDamage": "Total Damage", + "damageReduction": "Damage Reduction", + "armorDR": "Armor DR", + "shieldDR": "Shield DR", + "totalDR": "Total DR", + "selectOption": "Select damage application option", + "noDR": "No DR", + "withArmor": "With Armor DR only", + "withAll": "With Armor + Shield DR", + "damage": "damage" } }, "TYPES": { diff --git a/lethal-fantasy.mjs b/lethal-fantasy.mjs index 5fd69b9..7f25888 100644 --- a/lethal-fantasy.mjs +++ b/lethal-fantasy.mjs @@ -152,6 +152,39 @@ Hooks.on(hookName, (message, html, data) => { }) } } + + // Gestion du survol et du clic sur les boutons de dégâts pour les GMs + if (game.user.isGM) { + // Show damage buttons only for GM + $(html).find(".li-apply-wounds").each((i, btn) => { + btn.style.display = "block" + }) + + $(html).find(".apply-wounds-btn").hover( + function (event) { + // Mouse enter - select the token and pan to it + let combatantId = $(this).data("combatant-id") + if (combatantId && game.combat) { + let combatant = game.combat.combatants.get(combatantId) + if (combatant?.token) { + let token = canvas.tokens.get(combatant.token.id) + if (token) { + token.control({ releaseOthers: true }) + canvas.animatePan(token.center) + } + } + } + }, + function (event) { + // Mouse leave - release selection + canvas.tokens.releaseAll() + } + ) + + $(html).find(".apply-wounds-btn").click((event) => { + LethalFantasyUtils.applyDamage(message, event) + }) + } }) Hooks.on("getCombatTrackerEntryContext", (html, options) => { diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 54f3deb..688f3cf 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -65,7 +65,7 @@ export default class LethalFantasyActor extends Actor { } } } - goodSkill.weaponSkillModifier = maxValue * multiplier + goodSkill.weaponSkillModifier = Math.ceil(maxValue * multiplier) return goodSkill } @@ -119,6 +119,27 @@ export default class LethalFantasyActor extends Actor { return defenseValue } + /* *************************************************/ + fuzzyNameSearchWeaponSkills(weaponName, weaponClass=null) { + // Get all weapon skills without the " skill" suffix + let skills = this.items.filter((i) => i.type === "skill" && i.system.weaponClass === weaponClass && i.system.category === "weapon") + // Remove parenthesis in the weapon name for better matching + weaponName = weaponName.replace(/\(.*?\)/g, "").trim() + // Now search if we find all the words of the weapon name in the skill name + skills = skills.filter((s) => { + let skillName = s.name.toLowerCase().replace(" skill", "").trim() + let wName = weaponName.toLowerCase().trim() + let wWords = wName.split(" ") + for (let w of wWords) { + if (!skillName.includes(w)) { + return false + } + } + return true + }) + return skills + } + /* *************************************************/ async prepareRoll(rollType, rollKey, rollDice) { console.log("Preparing roll", rollType, rollKey, rollDice) @@ -179,19 +200,19 @@ export default class LethalFantasyActor extends Actor { case "weapon-defense": { let weapon = this.items.find((i) => i.type === "weapon" && i.id === rollKey) let skill - let skills = this.items.filter((i) => i.type === "skill" && i.name.toLowerCase() === weapon.name.toLowerCase()) + let skills = this.items.filter((i) => i.type === "skill" && i.system.category === "weapon" && i.name.toLowerCase() === weapon.name.toLowerCase()) if (skills.length > 0) { skill = this.getBestWeaponClassSkill(skills, rollType, 1.0) } else { - skills = this.items.filter((i) => i.type === "skill" && i.name.toLowerCase().replace(" skill", "") === weapon.name.toLowerCase()) + skills = this.fuzzyNameSearchWeaponSkills(weapon.name, weapon.system.weaponClass) if (skills.length > 0) { skill = this.getBestWeaponClassSkill(skills, rollType, 1.0) } else { - skills = this.items.filter((i) => i.type === "skill" && i.system.weaponClass === weapon.system.weaponClass) + skills = this.items.filter((i) => i.type === "skill" && i.system.category === "weapon" && i.system.weaponClass === weapon.system.weaponClass) if (skills.length > 0) { skill = this.getBestWeaponClassSkill(skills, rollType, 0.5) } else { - skills = this.items.filter((i) => i.type === "skill" && i.system.weaponClass.includes(SYSTEM.WEAPON_CATEGORIES[weapon.system.weaponClass])) + skills = this.items.filter((i) => i.type === "skill" && i.system.category === "weapon" && i.system.weaponClass.includes(SYSTEM.WEAPON_CATEGORIES[weapon.system.weaponClass])) if (skills.length > 0) { skill = this.getBestWeaponClassSkill(skills, rollType, 0.25) } else { diff --git a/module/documents/roll.mjs b/module/documents/roll.mjs index d6fbf0c..b698335 100644 --- a/module/documents/roll.mjs +++ b/module/documents/roll.mjs @@ -260,14 +260,17 @@ export default class LethalFantasyRoll extends Roll { } else if (options.rollType.includes("weapon-damage")) { options.rollName = options.rollTarget.name + options.isDamage = true hasModifier = true hasChangeDice = false let damageBonus = (options.rollTarget.weapon.system.applyStrengthDamageBonus) ? options.rollTarget.combat.damageModifier : 0 options.rollTarget.value = damageBonus + options.rollTarget.weaponSkillModifier + options.rollTarget.weapon.system.bonuses.damageBonus options.rollTarget.charModifier = damageBonus if (options.rollType.includes("small")) { + options.damageSmall = true dice = options.rollTarget.weapon.system.damage.damageS } else { + options.damageMedium = true dice = options.rollTarget.weapon.system.damage.damageM } dice = dice.replace("E", "") @@ -474,6 +477,9 @@ export default class LethalFantasyRoll extends Roll { actorImage: options.actorImage, rollMode: rollContext.visibility, hasTarget: options.hasTarget, + isDamage: options.isDamage, + damageSmall: options.damageSmall, + damageMedium: options.damageMedium, pointBlank, beyondSkill, letItFly, @@ -1123,6 +1129,16 @@ export default class LethalFantasyRoll extends Roll { * Generates the data required for rendering a roll chat card. */ async _getChatCardData(isPrivate) { + // Générer la liste des combatants de la scène + let combatants = [] + if (game?.combat?.combatants && this.rollData?.isDamage) { + for (let c of game.combat.combatants) { + if (c.actorId !== this.actorId) { + combatants.push({ id: c.id, name: c.name }) + } + } + } + const cardData = { css: [SYSTEM.id, "dice-roll"], data: this.data, @@ -1146,7 +1162,8 @@ export default class LethalFantasyRoll extends Roll { D30result: this.D30result, badResult: this.badResult, rollData: this.rollData, - isPrivate: isPrivate + isPrivate: isPrivate, + combatants: combatants } cardData.cssClass = cardData.css.join(" ") cardData.tooltip = isPrivate ? "" : await this.getTooltip() diff --git a/module/utils.mjs b/module/utils.mjs index 7e41065..eb1206a 100644 --- a/module/utils.mjs +++ b/module/utils.mjs @@ -22,43 +22,43 @@ export default class LethalFantasyUtils { static setHookListeners() { Hooks.on('renderTokenHUD', async (hud, html, token) => { - const lossHPButton = await foundry.applications.handlebars.renderTemplate('systems/fvtt-lethal-fantasy/templates/loss-hp-hud.hbs', {} ) + const lossHPButton = await foundry.applications.handlebars.renderTemplate('systems/fvtt-lethal-fantasy/templates/loss-hp-hud.hbs', {}) $(html).find('div.left').append(lossHPButton); - $(html).find('img.lethal-hp-loss-hud').click((event) => { - event.preventDefault(); - let hpMenu = $(html).find('.hp-loss-wrap')[0] - if (hpMenu.classList.contains("hp-loss-hud-disabled")) { - $(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-disabled'); - $(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-disabled'); - $(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-disabled'); - } else { - $(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled'); - $(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled'); - $(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled'); - } - }) - $(html).find('.loss-hp-hud-click').click((event) => { - event.preventDefault(); - let hpLoss = event.currentTarget.dataset.hpValue; - if (token) { - let tokenFull = canvas.tokens.placeables.find( t => t.id === token._id); - console.log(tokenFull, token) - let actor = tokenFull.actor; - actor.applyDamage(Number(hpLoss)); - $(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled'); - $(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled'); - $(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active'); - $(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled'); - } - }) + $(html).find('img.lethal-hp-loss-hud').click((event) => { + event.preventDefault(); + let hpMenu = $(html).find('.hp-loss-wrap')[0] + if (hpMenu.classList.contains("hp-loss-hud-disabled")) { + $(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-disabled'); + $(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-disabled'); + $(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-disabled'); + } else { + $(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled'); + $(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled'); + $(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled'); + } + }) + $(html).find('.loss-hp-hud-click').click((event) => { + event.preventDefault(); + let hpLoss = event.currentTarget.dataset.hpValue; + if (token) { + let tokenFull = canvas.tokens.placeables.find(t => t.id === token._id); + console.log(tokenFull, token) + let actor = tokenFull.actor; + actor.applyDamage(Number(hpLoss)); + $(html).find('.hp-loss-wrap')[0].classList.remove('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[0].classList.add('hp-loss-hud-disabled'); + $(html).find('.hp-loss-wrap')[1].classList.remove('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[1].classList.add('hp-loss-hud-disabled'); + $(html).find('.hp-loss-wrap')[2].classList.remove('hp-loss-hud-active'); + $(html).find('.hp-loss-wrap')[2].classList.add('hp-loss-hud-disabled'); + } + }) }) } @@ -246,4 +246,100 @@ export default class LethalFantasyUtils { } } + /* -------------------------------------------- */ + static async applyDamage(message, event) { + // Récupérer les données du message + let combatantId = event.currentTarget.dataset.combatantId + if (!combatantId || !game.combat) { + ui.notifications.error("No combatant selected") + return + } + + let combatant = game.combat.combatants.get(combatantId) + if (!combatant) { + ui.notifications.error("Combatant not found") + return + } + + let targetActor = combatant.token?.actor || game.actors.get(combatant.actorId) + if (!targetActor) { + ui.notifications.error("Target actor not found") + return + } + + // Récupérer les données de dégâts du message + let damageTotal = message.rolls[0]?.total || 0 + let weaponName = message.rolls[0]?.options?.rollTarget?.weapon?.name || "Unknown Weapon" + + // Calculer les DR + let armorDR = targetActor.computeDamageReduction() || 0 + let shieldDR = targetActor.getShieldDR() || 0 + let totalDR = armorDR + shieldDR + + // Créer le dialogue + const content = await foundry.applications.handlebars.renderTemplate( + "systems/fvtt-lethal-fantasy/templates/apply-damage-dialog.hbs", + { + targetName: targetActor.name, + weaponName: weaponName, + damageTotal: damageTotal, + armorDR: armorDR, + shieldDR: shieldDR, + totalDR: totalDR, + damageNoDR: damageTotal, + damageWithArmor: Math.max(0, damageTotal - armorDR), + damageWithAll: Math.max(0, damageTotal - totalDR) + } + ) + + const result = await foundry.applications.api.DialogV2.wait({ + window: { title: "Apply Damage" }, + classes: ["lethalfantasy"], + position: { width: 280 }, + content, + buttons: [ + { + action: "noDR", + label: "No DR", + callback: () => ({ drType: "none", damage: damageTotal }) + }, + { + action: "armorDR", + label: "With Armor DR", + callback: () => ({ drType: "armor", damage: Math.max(0, damageTotal - armorDR) }) + }, + { + action: "allDR", + label: "With Armor + Shield DR", + callback: () => ({ drType: "all", damage: Math.max(0, damageTotal - totalDR) }) + }, + { + action: "cancel", + label: "Cancel", + callback: () => null + } + ], + rejectClose: false + }) + + if (result && result.damage !== undefined) { + await targetActor.applyDamage(-result.damage) + + // Message de confirmation + let drText = "" + if (result.drType === "armor") { + drText = ` (Armor DR: ${armorDR})` + } else if (result.drType === "all") { + drText = ` (Total DR: ${totalDR})` + } + + ChatMessage.create({ + user: game.user.id, + speaker: { alias: targetActor.name }, + rollMode: "gmroll", + content: `${targetActor.name} takes ${result.damage} damage${drText} from ${weaponName}` + }) + } + } + } diff --git a/packs-system/lf-equipment/000458.log b/packs-system/lf-equipment/000462.log similarity index 100% rename from packs-system/lf-equipment/000458.log rename to packs-system/lf-equipment/000462.log diff --git a/packs-system/lf-equipment/000323.ldb b/packs-system/lf-equipment/000464.ldb similarity index 97% rename from packs-system/lf-equipment/000323.ldb rename to packs-system/lf-equipment/000464.ldb index 809596070d7b75286ae8e73d3827a80c1176f975..3aa6c1d635713c444de82ba1ec0ff0514fcb2b53 100644 GIT binary patch delta 2937 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 delta 3070 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 g`qD72 217363 bytes +2025/12/14-20:45:56.742890 7f16eeffd6c0 compacted to: files[ 0 0 1 0 0 0 0 ] +2025/12/14-20:45:56.742996 7f16eeffd6c0 Delete type=2 #323 +2025/12/14-20:45:56.743249 7f16eeffd6c0 Delete type=2 #463 +2025/12/14-20:45:56.750017 7f16eeffd6c0 Manual compaction at level-1 from '!items!VFHTlDVKj2yNJEWi' @ 1129 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-equipment/LOG.old b/packs-system/lf-equipment/LOG.old index 1bf025e..878967b 100644 --- a/packs-system/lf-equipment/LOG.old +++ b/packs-system/lf-equipment/LOG.old @@ -1,8 +1,8 @@ -2025/11/07-07:57:26.850226 7f14baffd6c0 Recovering log #450 -2025/11/07-07:57:26.860132 7f14baffd6c0 Delete type=3 #448 -2025/11/07-07:57:26.860209 7f14baffd6c0 Delete type=0 #450 -2025/11/07-07:58:43.705140 7f14b8ff96c0 Level-0 table #455: started -2025/11/07-07:58:43.705171 7f14b8ff96c0 Level-0 table #455: 0 bytes OK -2025/11/07-07:58:43.711108 7f14b8ff96c0 Delete type=0 #453 -2025/11/07-07:58:43.724495 7f14b8ff96c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) -2025/11/07-07:58:43.724532 7f14b8ff96c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) +2025/12/06-15:17:13.631288 7f19dd7fa6c0 Recovering log #454 +2025/12/06-15:17:13.737044 7f19dd7fa6c0 Delete type=3 #452 +2025/12/06-15:17:13.737119 7f19dd7fa6c0 Delete type=0 #454 +2025/12/06-16:41:02.244527 7f19dbff76c0 Level-0 table #459: started +2025/12/06-16:41:02.244570 7f19dbff76c0 Level-0 table #459: 0 bytes OK +2025/12/06-16:41:02.281825 7f19dbff76c0 Delete type=0 #457 +2025/12/06-16:41:02.281990 7f19dbff76c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) +2025/12/06-16:41:02.282024 7f19dbff76c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-equipment/MANIFEST-000456 b/packs-system/lf-equipment/MANIFEST-000456 deleted file mode 100644 index 92767841a067429a048702c76c0c111a1e99b53c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeCUS2DYufss)vC$%g!CnZVGsj?)sJhM2}IX|}`u_&=5zlfDlUNN&IHMdx?s@yUt zFh4mYrOMbNC@adFF^z=*1lXAlGo4(>tEiZkpOcbWRIKP2Qe;^km62{*8WI+gUF^#! p23E&F$ROrv8!vG)FfyHF=44<##mw@IV}Y96Dv-!2kjNR32mpX=GerOZ diff --git a/packs-system/lf-equipment/MANIFEST-000460 b/packs-system/lf-equipment/MANIFEST-000460 new file mode 100644 index 0000000000000000000000000000000000000000..7b92e01328f9424380601a095947b548091a88f8 GIT binary patch literal 381 zcmeCUS2DYufss)vC$%g!CnZVGsj?)sJhM2}IX|}`u_&=5zlfDlUNN&IHMdx?s@yUt zFh4mYrOMbNC@adFF^z=*1lXAlGo4(>tEiZkpOcbWRIKP2Qe;^km62{*8WI+gUF^#! z23E&F$elIT@JGF|$15i1oka69^PJ2NJo!%<__ho$)+#FE7j_*Pwuq z)QWJEl)%!6lJWvC#&n32VDe#Z9w9j{VcuCrm405X;hBt?P$zrsP^*KPdl6(V!kf7C UumNpm1A3L6=>qfQMO5%E04@h-Z~y=R literal 0 HcmV?d00001 diff --git a/packs-system/lf-gifts/000458.log b/packs-system/lf-gifts/000462.log similarity index 100% rename from packs-system/lf-gifts/000458.log rename to packs-system/lf-gifts/000462.log diff --git a/packs-system/lf-gifts/CURRENT b/packs-system/lf-gifts/CURRENT index ce3e56b..bc93ad8 100644 --- a/packs-system/lf-gifts/CURRENT +++ b/packs-system/lf-gifts/CURRENT @@ -1 +1 @@ -MANIFEST-000456 +MANIFEST-000460 diff --git a/packs-system/lf-gifts/LOG b/packs-system/lf-gifts/LOG index 1ffd2ad..633e808 100644 --- a/packs-system/lf-gifts/LOG +++ b/packs-system/lf-gifts/LOG @@ -1,8 +1,8 @@ -2025/12/06-15:17:13.747297 7f19dc7f86c0 Recovering log #454 -2025/12/06-15:17:13.857630 7f19dc7f86c0 Delete type=3 #452 -2025/12/06-15:17:13.857707 7f19dc7f86c0 Delete type=0 #454 -2025/12/06-16:41:02.159042 7f19dbff76c0 Level-0 table #459: started -2025/12/06-16:41:02.159069 7f19dbff76c0 Level-0 table #459: 0 bytes OK -2025/12/06-16:41:02.201619 7f19dbff76c0 Delete type=0 #457 -2025/12/06-16:41:02.281970 7f19dbff76c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) -2025/12/06-16:41:02.282008 7f19dbff76c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) +2025/12/14-09:09:25.859023 7f16ef7fe6c0 Recovering log #458 +2025/12/14-09:09:25.869163 7f16ef7fe6c0 Delete type=3 #456 +2025/12/14-09:09:25.869258 7f16ef7fe6c0 Delete type=0 #458 +2025/12/14-20:45:56.717084 7f16eeffd6c0 Level-0 table #463: started +2025/12/14-20:45:56.717117 7f16eeffd6c0 Level-0 table #463: 0 bytes OK +2025/12/14-20:45:56.723011 7f16eeffd6c0 Delete type=0 #461 +2025/12/14-20:45:56.730301 7f16eeffd6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) +2025/12/14-20:45:56.743359 7f16eeffd6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-gifts/LOG.old b/packs-system/lf-gifts/LOG.old index d73ae86..1ffd2ad 100644 --- a/packs-system/lf-gifts/LOG.old +++ b/packs-system/lf-gifts/LOG.old @@ -1,8 +1,8 @@ -2025/11/07-07:57:26.863923 7f14b9ffb6c0 Recovering log #450 -2025/11/07-07:57:26.873909 7f14b9ffb6c0 Delete type=3 #448 -2025/11/07-07:57:26.873962 7f14b9ffb6c0 Delete type=0 #450 -2025/11/07-07:58:43.711204 7f14b8ff96c0 Level-0 table #455: started -2025/11/07-07:58:43.711230 7f14b8ff96c0 Level-0 table #455: 0 bytes OK -2025/11/07-07:58:43.718265 7f14b8ff96c0 Delete type=0 #453 -2025/11/07-07:58:43.724502 7f14b8ff96c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) -2025/11/07-07:58:43.724539 7f14b8ff96c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) +2025/12/06-15:17:13.747297 7f19dc7f86c0 Recovering log #454 +2025/12/06-15:17:13.857630 7f19dc7f86c0 Delete type=3 #452 +2025/12/06-15:17:13.857707 7f19dc7f86c0 Delete type=0 #454 +2025/12/06-16:41:02.159042 7f19dbff76c0 Level-0 table #459: started +2025/12/06-16:41:02.159069 7f19dbff76c0 Level-0 table #459: 0 bytes OK +2025/12/06-16:41:02.201619 7f19dbff76c0 Delete type=0 #457 +2025/12/06-16:41:02.281970 7f19dbff76c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) +2025/12/06-16:41:02.282008 7f19dbff76c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-gifts/MANIFEST-000456 b/packs-system/lf-gifts/MANIFEST-000460 similarity index 77% rename from packs-system/lf-gifts/MANIFEST-000456 rename to packs-system/lf-gifts/MANIFEST-000460 index ab25ad2fa612399187ca685b41fe8af81c9793ee..c0e2be4ec1792cb43c4d986e8fe96bd2a66c99fd 100644 GIT binary patch delta 43 tcmey)_?>aWWtG_{D%Nr{FfyHG=44<#$IP;uvFV6>4@l%3NaO-Y1OQG24C(*? delta 43 tcmey)_?>aWWtA*9S$l2pNiVWzBk+qj7;a5IT@HQFtglZ{S}~Z0us3Z61fBt0RSln3=RMQ delta 43 tcmdnQxQTH>pGxliE+Y delta 43 tcmdnUxRG%}uS!*F@I-C~My9!poD9tK7+EH96q(H81c}T8i7Wt#008%737-G} diff --git a/packs-system/lf-vulnerabilities/000457.log b/packs-system/lf-vulnerabilities/000461.log similarity index 100% rename from packs-system/lf-vulnerabilities/000457.log rename to packs-system/lf-vulnerabilities/000461.log diff --git a/packs-system/lf-vulnerabilities/CURRENT b/packs-system/lf-vulnerabilities/CURRENT index d52c190..896b93a 100644 --- a/packs-system/lf-vulnerabilities/CURRENT +++ b/packs-system/lf-vulnerabilities/CURRENT @@ -1 +1 @@ -MANIFEST-000455 +MANIFEST-000459 diff --git a/packs-system/lf-vulnerabilities/LOG b/packs-system/lf-vulnerabilities/LOG index 6c07c05..bafd4d9 100644 --- a/packs-system/lf-vulnerabilities/LOG +++ b/packs-system/lf-vulnerabilities/LOG @@ -1,8 +1,8 @@ -2025/12/06-15:17:13.870724 7f19ddffb6c0 Recovering log #453 -2025/12/06-15:17:13.958289 7f19ddffb6c0 Delete type=3 #451 -2025/12/06-15:17:13.958388 7f19ddffb6c0 Delete type=0 #453 -2025/12/06-16:41:02.118716 7f19dbff76c0 Level-0 table #458: started -2025/12/06-16:41:02.121944 7f19dbff76c0 Level-0 table #458: 0 bytes OK -2025/12/06-16:41:02.158936 7f19dbff76c0 Delete type=0 #456 -2025/12/06-16:41:02.281954 7f19dbff76c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) -2025/12/06-16:41:02.282000 7f19dbff76c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) +2025/12/14-09:09:25.874671 7f16effff6c0 Recovering log #457 +2025/12/14-09:09:25.886173 7f16effff6c0 Delete type=3 #455 +2025/12/14-09:09:25.886272 7f16effff6c0 Delete type=0 #457 +2025/12/14-20:45:56.723132 7f16eeffd6c0 Level-0 table #462: started +2025/12/14-20:45:56.723164 7f16eeffd6c0 Level-0 table #462: 0 bytes OK +2025/12/14-20:45:56.730108 7f16eeffd6c0 Delete type=0 #460 +2025/12/14-20:45:56.730316 7f16eeffd6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) +2025/12/14-20:45:56.743378 7f16eeffd6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-vulnerabilities/LOG.old b/packs-system/lf-vulnerabilities/LOG.old index ed49363..6c07c05 100644 --- a/packs-system/lf-vulnerabilities/LOG.old +++ b/packs-system/lf-vulnerabilities/LOG.old @@ -1,8 +1,8 @@ -2025/11/07-07:57:26.876181 7f14b97fa6c0 Recovering log #449 -2025/11/07-07:57:26.886933 7f14b97fa6c0 Delete type=3 #447 -2025/11/07-07:57:26.887010 7f14b97fa6c0 Delete type=0 #449 -2025/11/07-07:58:43.747501 7f14b8ff96c0 Level-0 table #454: started -2025/11/07-07:58:43.747545 7f14b8ff96c0 Level-0 table #454: 0 bytes OK -2025/11/07-07:58:43.754307 7f14b8ff96c0 Delete type=0 #452 -2025/11/07-07:58:43.772388 7f14b8ff96c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) -2025/11/07-07:58:43.785957 7f14b8ff96c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) +2025/12/06-15:17:13.870724 7f19ddffb6c0 Recovering log #453 +2025/12/06-15:17:13.958289 7f19ddffb6c0 Delete type=3 #451 +2025/12/06-15:17:13.958388 7f19ddffb6c0 Delete type=0 #453 +2025/12/06-16:41:02.118716 7f19dbff76c0 Level-0 table #458: started +2025/12/06-16:41:02.121944 7f19dbff76c0 Level-0 table #458: 0 bytes OK +2025/12/06-16:41:02.158936 7f19dbff76c0 Delete type=0 #456 +2025/12/06-16:41:02.281954 7f19dbff76c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) +2025/12/06-16:41:02.282000 7f19dbff76c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-vulnerabilities/MANIFEST-000455 b/packs-system/lf-vulnerabilities/MANIFEST-000459 similarity index 72% rename from packs-system/lf-vulnerabilities/MANIFEST-000455 rename to packs-system/lf-vulnerabilities/MANIFEST-000459 index 9102b526b6fd7f2a758eee7b1e63da5cabace7e7..d285989a5d824856059993a4f008c954acebf25a 100644 GIT binary patch delta 41 scmdnMxPfs(pVAu^{sb-tMy4~&oD9ronOU;x%NPCt37iE9oCgX30QGtb-~a#s delta 41 scmdnMxPfs(pVD%h34gd47@1Bmb22cWWM;_<*`yQ#5;zGGI1Lm400tKd%>V!Z diff --git a/styles/chat.less b/styles/chat.less index 7c6ce7a..f8f8fd7 100644 --- a/styles/chat.less +++ b/styles/chat.less @@ -1,33 +1,34 @@ &.fortune { - img { - border: 0px; - } - .intro-chat { - border-radius: 20px; - display: flex; - flex-direction: row; - .intro-img { - padding: 5px; - width: 80px; - align-self: center; - } - .intro-right { - display: flex; - flex-direction: column; - .introText { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); - width: 210px; - text-align: center; - } - } - } - .button.control, .fortune-accepted { - display: flex; - justify-content: center; - align-items: center; - font-size: calc(var(--font-size-standard) * 1.3); + img { + border: 0px; + } + .intro-chat { + border-radius: 20px; + display: flex; + flex-direction: row; + .intro-img { + padding: 5px; + width: 80px; + align-self: center; + } + .intro-right { + display: flex; + flex-direction: column; + .introText { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1.2); + width: 210px; + text-align: center; } + } + } + .button.control, + .fortune-accepted { + display: flex; + justify-content: center; + align-items: center; + font-size: calc(var(--font-size-standard) * 1.3); + } } &.ask-roll { @@ -37,4 +38,4 @@ justify-content: center; font-family: var(--font-secondary); font-size: calc(var(--font-size-standard) * 1.2); -} \ No newline at end of file +} diff --git a/styles/roll.less b/styles/roll.less index 650f7c3..c9317c6 100644 --- a/styles/roll.less +++ b/styles/roll.less @@ -7,6 +7,65 @@ border-color: var(--color-dark-6); color: var(--color-dark-2); } + + .apply-damage-dialog { + .dialog-content { + padding: 6px; + font-size: calc(var(--font-size-standard) * 1); + + .header { + text-align: center; + padding: 4px; + margin-bottom: 6px; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 3px; + } + + .damage-summary { + display: flex; + justify-content: space-between; + align-items: center; + padding: 4px 6px; + margin-bottom: 6px; + background-color: rgba(139, 0, 0, 0.1); + border-radius: 3px; + + .damage-value { + color: var(--color-level-error); + font-size: calc(var(--font-size-standard) * 1.2); + font-weight: bold; + } + } + + .dr-summary { + display: flex; + justify-content: space-around; + gap: 4px; + padding: 3px; + margin-bottom: 6px; + font-size: calc(var(--font-size-standard) * 0.85); + background-color: rgba(0, 0, 0, 0.05); + border-radius: 3px; + } + + .damage-options { + .option-line { + display: flex; + justify-content: space-between; + align-items: center; + padding: 3px 6px; + margin: 2px 0; + background-color: rgba(0, 0, 0, 0.05); + border-radius: 3px; + + strong { + color: var(--color-dark-1); + font-size: calc(var(--font-size-standard) * 1.05); + } + } + } + } + } } .lethalfantasy-roll-dialog { @@ -59,9 +118,14 @@ .dialog-form { .form-footer { + padding: 4px; + gap: 4px; button { - min-width: 14rem; - min-height: 3.2rem; + min-width: 8rem; + min-height: 2rem; + padding: 2px 6px; + margin: 0; + font-size: calc(var(--font-size-standard) * 0.9); } } } @@ -156,4 +220,68 @@ font-size: calc(var(--font-size-standard) * 1); text-shadow: 0 0 10px var(--color-shadow-primary); } + + .damage-result { + width: 100%; + padding: 8px; + + ul { + padding: 0; + margin: 0; + } + + .li-apply-wounds { + list-style: none; + margin-top: 10px; + padding: 0; + display: none; + + > div:first-child { + font-weight: bold; + margin-bottom: 8px; + font-size: calc(var(--font-size-standard) * 0.95); + text-align: center; + } + + .combatants-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 6px; + margin-top: 5px; + padding: 8px; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 5px; + + .apply-wounds-btn { + padding: 6px 10px; + background: linear-gradient(to bottom, #5a5850 0%, #4b4a44 100%); + border: 1px solid #2b2a24; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + color: #f0f0e0; + cursor: pointer; + border-radius: 4px; + font-size: calc(var(--font-size-standard) * 0.85); + font-weight: 500; + text-align: center; + transition: all 0.2s ease; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + + &:hover { + background: linear-gradient(to bottom, #6a6860 0%, #5a5850 100%); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4); + transform: translateY(-1px); + border-color: #3b3a34; + } + + &:active { + transform: translateY(0); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + } + } + } + } + } } diff --git a/templates/apply-damage-dialog.hbs b/templates/apply-damage-dialog.hbs new file mode 100644 index 0000000..107f649 --- /dev/null +++ b/templates/apply-damage-dialog.hbs @@ -0,0 +1,37 @@ +
+
+
+ {{targetName}} + - + {{weaponName}} +
+ +
+ {{localize + "LETHALFANTASY.Dialog.totalDamage" + }}: + {{damageTotal}} +
+ +
+ {{localize "LETHALFANTASY.Dialog.armorDR"}}: {{armorDR}} + {{localize "LETHALFANTASY.Dialog.shieldDR"}}: {{shieldDR}} + DR: {{totalDR}} +
+ +
+
+ {{localize "LETHALFANTASY.Dialog.noDR"}} + {{damageNoDR}} +
+
+ {{localize "LETHALFANTASY.Dialog.withArmor"}} + {{damageWithArmor}} +
+
+ {{localize "LETHALFANTASY.Dialog.withAll"}} + {{damageWithAll}} +
+
+
+
\ No newline at end of file diff --git a/templates/chat-message.hbs b/templates/chat-message.hbs index 872aaa3..46a73f4 100644 --- a/templates/chat-message.hbs +++ b/templates/chat-message.hbs @@ -9,80 +9,130 @@ {{actingCharName}} - {{upperFirst rollName}} {{#if (match rollType "attack")}} - Attack roll ! + Attack roll ! {{/if}} {{#if (match rollType "defense")}} - Defense roll ! + Defense roll ! {{/if}} {{#if (eq rollData.favor "favor")}} - Favor roll + Favor roll {{/if}} {{#if (eq rollData.favor "disfavor")}} - Disfavor roll + Disfavor roll {{/if}} {{#if badResult}} - {{localize "LETHALFANTASY.Label.otherResult"}} : {{badResult}} + {{localize "LETHALFANTASY.Label.otherResult"}} + : + {{badResult}} {{/if}} {{#if rollTarget.weapon}} - {{rollTarget.weapon.name}} + {{rollTarget.weapon.name}} + {{/if}} + + {{#if rollData.isDamage}} + Damage Roll + {{/if}} + {{#if rollData.damageSmall}} + {{localize + "LETHALFANTASY.Label.weapon-damage-small" + }} + {{/if}} + {{#if rollData.damageMedium}} + {{localize + "LETHALFANTASY.Label.weapon-damage-medium" + }} {{/if}} {{#if rollData.letItFly}} - Let It Fly attack ! + Let It Fly attack ! {{/if}} {{#if rollData.pointBlank}} - Point Blank Range Attack ! + Point Blank Range Attack ! {{/if}} {{#if rollData.beyondSkill}} - Beyond Skill Range Attack ! + Beyond Skill Range Attack ! {{/if}} Formula : {{titleFormula}} {{#each diceResults as |result|}} - {{result.dice}} : {{result.value}} + {{result.dice}} : {{result.value}} {{/each}} {{#if isSave}} -
- {{#if (eq resultType "success")}} - {{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.success"}}{{/if}} - {{else}} - {{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.failure"}}{{/if}} - {{/if}} -
+
+ {{#if (eq resultType "success")}} + {{#if isPrivate}}?{{else}}{{localize + "LETHALFANTASY.Roll.success" + }}{{/if}} + {{else}} + {{#if isPrivate}}?{{else}}{{localize + "LETHALFANTASY.Roll.failure" + }}{{/if}} + {{/if}} +
{{/if}} {{#if isResource}} -
- {{#if (eq resultType "success")}} - {{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.success"}}{{/if}} - {{else}} - {{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.failure"}}{{#if isFailure}} ({{localize - "LETHALFANTASY.Roll.resourceLost"}}){{/if}}{{/if}} - {{/if}} -
+
+ {{#if (eq resultType "success")}} + {{#if isPrivate}}?{{else}}{{localize + "LETHALFANTASY.Roll.success" + }}{{/if}} + {{else}} + {{#if isPrivate}}?{{else}}{{localize "LETHALFANTASY.Roll.failure"}}{{#if + isFailure + }} ({{localize "LETHALFANTASY.Roll.resourceLost"}}){{/if}}{{/if}} + {{/if}} +
{{/if}} {{#if isDamage}} -
- {{#if (and isGM hasTarget)}} - {{{localize "LETHALFANTASY.Roll.displayArmor" targetName=targetName targetArmor=targetArmor realDamage=realDamage}}} - {{/if}} -
+
+ {{#if (and isGM hasTarget)}} + {{{localize + "LETHALFANTASY.Roll.displayArmor" + targetName=targetName + targetArmor=targetArmor + realDamage=realDamage + }}} + {{/if}} +
{{/if}} {{#unless isPrivate}} -
-

{{total}}

-
- {{#if D30result}} -
-

D30 result: {{D30result}}

-
- {{/if}} +
+

{{total}}

+
+ {{#if D30result}} +
+

D30 result: {{D30result}}

+
+ {{/if}} {{/unless}} + + {{#if rollData.isDamage}} +
+
    +
  • +
    {{localize "LETHALFANTASY.Label.applyDamage"}}
    +
    + {{#each combatants}} + + {{/each}} +
    +
  • +
+
+ {{/if}} + \ No newline at end of file