diff --git a/lang/fr.json b/lang/fr.json index 0fdeebf..427978e 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -12,6 +12,7 @@ "TYPES.Item.entrainement": "Entrainement", "DNC.Roll.Characteristic": "Jet de caracteristique", "DNC.Roll.Attack": "Jet d'attaque", + "DNC.Roll.Ammunition": "Munitions", "DNC.Roll.Damage": "Jet de degats", "DNC.Roll.Favor": "Faveur", "DNC.Roll.HitDice": "Jet de de de vie", @@ -37,6 +38,8 @@ "DNC.Chat.Kept": "Garde", "DNC.Chat.Rolls": "Lancers", "DNC.Chat.RollDamage": "Lancer les degats", + "DNC.Chat.RollAmmunition": "Munitions", + "DNC.Chat.DamageCapped": "Degats plafonnes a {damage} par {dv}", "DNC.Chat.RollValue": "Jet", "DNC.Chat.AutoDisadvantage": "Desavantage automatique", "DNC.Chat.RiskChaos": "Risquer le Chaos", @@ -56,11 +59,16 @@ "DNC.Chat.HpRemaining": "PV restants", "DNC.Chat.CasterRank": "Rang du lanceur", "DNC.Chat.Difficulty": "Difficulte", + "DNC.Chat.MartialDv": "DV martial", + "DNC.Chat.EffectiveDamage": "Degats retenus", "DNC.Chat.Effect": "Effet", "DNC.Chat.StoredProtection": "Protection stockee pour ce combat", "DNC.Chat.ResourceWearsDown": "La ressource s'amenuise.", "DNC.Chat.ResourceStable": "La ressource tient bon.", "DNC.Chat.ResourceExhausted": "La ressource est epuisee.", + "DNC.Chat.AmmunitionWearsDown": "Les munitions diminuent d'un cran.", + "DNC.Chat.AmmunitionStable": "Le stock de munitions tient bon.", + "DNC.Chat.AmmunitionExhausted": "Il n'y a plus de munitions disponibles pour cette arme.", "DNC.Chat.AutoDisadvantageCanceled": "le cout du sort depasse le rang du lanceur, mais une faveur l'a annule.", "DNC.Chat.AutoDisadvantageApplies": "le cout du sort depasse le rang du lanceur.", "DNC.Chat.FocusFrom": "depuis", @@ -89,6 +97,7 @@ "DNC.UI.Focus": "Focus", "DNC.UI.Chaos": "Chaos", "DNC.UI.Weapon": "Arme", + "DNC.UI.Ammunition": "Munitions", "DNC.UI.Damage": "Degats", "DNC.UI.Range": "Portee", "DNC.UI.Spell": "Sortilege", @@ -96,10 +105,12 @@ "DNC.Dialog.InitiativeCurrent": "DEX actuelle : {dex}, bonus de fiche : {initiativeBonus}", "DNC.Dialog.CharacteristicUsed": "Caracteristique utilisee", "DNC.Dialog.ActorDamageBonus": "Bonus de degats de l'acteur", + "DNC.Dialog.DamageCappedByDv": "Le DV martial actuel ({dv}) plafonne cette arme : {base} devient {damage}.", "DNC.Dialog.SpellAutoDisadvantage": "Le cout depasse le rang du lanceur : le jet se fera automatiquement avec desavantage.", "DNC.Dialog.UseUsageDie": "Utiliser {itemName} et lancer son de d'usage actuel.", "DNC.Dialog.CurrentValue": "Valeur actuelle", "DNC.Warn.NoFavorAvailable": "Aucune faveur disponible pour {label}.", + "DNC.Warn.NoAmmunitionAvailable": "Il n'y a plus de munitions disponibles pour cette arme.", "DNC.Warn.SpellInsufficientResources": "Le lanceur ne dispose pas d'assez de PV et de focus pour payer ce sort.", "DNC.Warn.ChaosUnavailable": "Le Chaos n'est pas disponible pour ce sort.", "DNC.Warn.TrainingExhausted": "Cet entrainement est epuise pour aujourd'hui. Reinitialisez son delta quotidien pour le lendemain.", @@ -187,5 +198,12 @@ "DNC.Sheet.Create": "Creer", "DNC.Sheet.Delete": "Supprimer", "DNC.Sheet.Edit": "Editer", - "DNC.Sheet.Post": "Poster dans le chat" + "DNC.Sheet.Post": "Poster dans le chat", + "DNC.Roll.DamageUsage": "Usage des degats", + "DNC.Chat.RollDamageUsage": "Usage degats", + "DNC.Chat.DamageUsageWearsDown": "Les degats de l'arme diminuent d'un cran.", + "DNC.Chat.DamageUsageStable": "L'arme tient bon, ses degats restent inchanges.", + "DNC.Chat.DamageUsageExhausted": "L'arme est epuisee, elle ne peut plus causer de degats.", + "DNC.UI.DamageExhausted": "Epuise", + "DNC.Warn.DamageExhausted": "Cette arme est epuisee et ne peut plus causer de degats." } diff --git a/modules/applications/donjon-et-cie-roll-dialog.mjs b/modules/applications/donjon-et-cie-roll-dialog.mjs index 3c2b787..3e18729 100644 --- a/modules/applications/donjon-et-cie-roll-dialog.mjs +++ b/modules/applications/donjon-et-cie-roll-dialog.mjs @@ -201,12 +201,17 @@ export class DonjonEtCieRollDialog { } static async createDamage(actor, item) { + const damageContext = DonjonEtCieUtility.getMartialDamageContext(actor, item); const content = await foundry.applications.handlebars.renderTemplate( "systems/fvtt-donjon-et-cie/templates/dialogs/damage-roll.hbs", { actorName: actor?.name ?? item.actor?.name ?? "", item, - actorBonus: actor?.system?.combat?.degatsBonus ?? 0 + actorBonus: actor?.system?.combat?.degatsBonus ?? 0, + damageFormula: damageContext.effectiveFormula || item.system.degats, + damageBase: damageContext.baseFormula || item.system.degats, + damageCapped: damageContext.capped, + martialDvLabel: damageContext.martialDvSides ? `d${damageContext.martialDvSides}` : damageContext.martialDvFormula } ); diff --git a/modules/applications/sheets/base-item-sheet.mjs b/modules/applications/sheets/base-item-sheet.mjs index 675db50..753af79 100644 --- a/modules/applications/sheets/base-item-sheet.mjs +++ b/modules/applications/sheets/base-item-sheet.mjs @@ -57,6 +57,9 @@ export default class DonjonEtCieItemSheet extends HandlebarsApplicationMixin(fou isCapacity: item.type === "capacite", isLanguage: item.type === "langue", isTrait: item.type === "trait", + ammunitionUsageLabel: item.type === "arme" && Number(item.system.munitionsDelta ?? 0) > 0 + ? DonjonEtCieUtility.formatUsageDie(item.system.munitionsDelta) + : "—", canResetUsage: item.type === "entrainement" && Number(item.system.deltaMax ?? 0) > 0 && Number(item.system.delta ?? 0) !== Number(item.system.deltaMax ?? 0), armorProtectionDisplay: Number(item.system.resultatProtection ?? 0) > 0 ? item.system.resultatProtection : "—", weaponCharacteristicLabel: item.type === "arme" ? DonjonEtCieUtility.getWeaponCharacteristicLabel(item.system.categorie) : null, diff --git a/modules/donjon-et-cie-item.mjs b/modules/donjon-et-cie-item.mjs index 47d9f07..ebc9b6d 100644 --- a/modules/donjon-et-cie-item.mjs +++ b/modules/donjon-et-cie-item.mjs @@ -31,6 +31,14 @@ export class DonjonEtCieItem extends Item { return Number(this.system.deltaMax ?? this.system.delta ?? 0); } + get ammunitionUsageDie() { + return Number(this.system.munitionsDelta ?? 0); + } + + get damageUsageDie() { + return Number(this.system.degatsDelta ?? 0); + } + async roll() { if (this.type === "arme") return DonjonEtCieRollDialog.createWeapon(this.actor, this); if (this.type === "sortilege") return DonjonEtCieRollDialog.createSpell(this.actor, this); @@ -43,10 +51,27 @@ export class DonjonEtCieItem extends Item { } async rollDamage() { - if (!this.system.degats) return null; + if (this.system.degatsEstUsageDe) { + if (!Number(this.system.degatsDelta ?? 0)) { + ui.notifications.warn(game.i18n.localize("DNC.Warn.DamageExhausted")); + return null; + } + } else if (!this.system.degats) { + return null; + } return DonjonEtCieRollDialog.createDamage(this.actor, this); } + async rollAmmoUsage() { + if (this.type !== "arme") return null; + return game.system.donjonEtCie.rolls.rollWeaponAmmoUsage(this); + } + + async rollDamageUsage() { + if (this.type !== "arme") return null; + return game.system.donjonEtCie.rolls.rollWeaponDamageUsage(this); + } + async postToChat() { const content = await foundry.applications.handlebars.renderTemplate( "systems/fvtt-donjon-et-cie/templates/chat/item-card.hbs", diff --git a/modules/donjon-et-cie-main.mjs b/modules/donjon-et-cie-main.mjs index 855a484..d44f138 100644 --- a/modules/donjon-et-cie-main.mjs +++ b/modules/donjon-et-cie-main.mjs @@ -46,7 +46,7 @@ function injectActorDirectoryMissionPackButton(app, element) { } function onChatActionClick(event) { - const button = event.target.closest("[data-action='rollChatDamage'], [data-action='rollSpellChaos'], [data-action='applyDamage']"); + const button = event.target.closest("[data-action='rollChatDamage'], [data-action='rollSpellChaos'], [data-action='applyDamage'], [data-action='rollAmmoUsage'], [data-action='rollDamageUsage']"); if (!(button instanceof HTMLElement)) return; event.preventDefault(); @@ -85,6 +85,12 @@ function onChatActionClick(event) { const itemUuid = button.dataset.itemUuid; if (!itemUuid) return; const item = await fromUuid(itemUuid); + if (button.dataset.action === "rollAmmoUsage") { + return item?.rollAmmoUsage?.(); + } + if (button.dataset.action === "rollDamageUsage") { + return item?.rollDamageUsage?.(); + } return item?.rollDamage?.(); })(); } diff --git a/modules/donjon-et-cie-rolls.mjs b/modules/donjon-et-cie-rolls.mjs index ee72673..31158b5 100644 --- a/modules/donjon-et-cie-rolls.mjs +++ b/modules/donjon-et-cie-rolls.mjs @@ -308,12 +308,14 @@ export class DonjonEtCieRolls { favorLabel: favor?.label ?? null, favorNote: favor?.note ?? null, showDamageButton: result.success && Boolean(item.system.degats), + showAmmoButton: Number(item.system.munitionsDelta ?? 0) > 0, itemUuid: item.uuid, details: [ { label: game.i18n.localize("DNC.UI.Weapon"), value: item.name }, { label: game.i18n.localize("DNC.UI.Characteristic"), value: characteristicLabel }, { label: `Valeur de ${characteristicLabel}`, value: result.target }, { label: game.i18n.localize("DNC.UI.Damage"), value: item.system.degats || "—" }, + { label: game.i18n.localize("DNC.UI.Ammunition"), value: Number(item.system.munitionsDelta ?? 0) > 0 ? DonjonEtCieUtility.formatUsageDie(item.system.munitionsDelta) : "—" }, { label: game.i18n.localize("DNC.UI.Range"), value: item.system.portee || "—" }, ...(favor ? [ { label: game.i18n.localize("DNC.Chat.Favor"), value: favor.label }, @@ -327,11 +329,54 @@ export class DonjonEtCieRolls { return { ...result, favor, mode: effectiveMode }; } + static async rollWeaponAmmoUsage(item, { mode = "normal" } = {}) { + const before = Number(item?.system?.munitionsDelta ?? 0); + if (!before) { + ui.notifications.warn(game.i18n.localize("DNC.Warn.NoAmmunitionAvailable")); + return null; + } + + const resolved = await this.#resolveFormulaRoll(`1d${before}`, {}, { mode, favorable: "high" }); + const result = resolved.kept; + const degraded = result <= 3; + const after = degraded ? DonjonEtCieUtility.degradeUsageDie(before) : before; + + if (after !== before) { + await item.update({ "system.munitionsDelta": after }); + } + + await this.#createChatCard(item.actor, "systems/fvtt-donjon-et-cie/templates/chat/usage-card.hbs", { + title: `${game.i18n.localize("DNC.Roll.Ammunition")} : ${item.name}`, + value: result, + values: resolved.values, + mode: resolved.mode, + modeLabel: this.#getModeLabel(resolved.mode), + before: DonjonEtCieUtility.formatUsageDie(before), + after: DonjonEtCieUtility.formatUsageDie(after), + protectionStored: null, + degraded, + exhausted: after === 0, + isAmmunition: true + }, { rolls: resolved.rolls }); + + return { result, values: resolved.values, mode: resolved.mode, before, after, degraded }; + } + static async rollDamage(actor, item, { mode = "normal" } = {}) { - if (!item.system.degats) return null; + const isUsageDie = Boolean(item.system.degatsEstUsageDe); + const degatsDelta = Number(item.system.degatsDelta ?? 0); + + if (isUsageDie && !degatsDelta) { + ui.notifications.warn(game.i18n.localize("DNC.Warn.DamageExhausted")); + return null; + } + if (!isUsageDie && !item.system.degats) return null; + + const damageContext = DonjonEtCieUtility.getMartialDamageContext(actor, item); const actorBonus = Number(actor?.system?.combat?.degatsBonus ?? 0); const totalBonus = actorBonus; - const formula = totalBonus ? `${item.system.degats} + ${totalBonus}` : item.system.degats; + const effectiveDamage = damageContext.effectiveFormula || (isUsageDie ? `1d${degatsDelta}` : item.system.degats); + const formula = totalBonus ? `${effectiveDamage} + ${totalBonus}` : effectiveDamage; const result = await this.#resolveFormulaRoll(formula, {}, { mode, favorable: "high" }); const targets = DonjonEtCieUtility.getSceneDamageTargets(); const rollDieLabels = result.rolls.map((roll) => { @@ -339,6 +384,7 @@ export class DonjonEtCieRolls { return dieValues.length ? dieValues.join(" + ") : String(roll.total ?? "—"); }); const keptDieLabel = rollDieLabels[result.keptIndex] ?? rollDieLabels[0] ?? String(result.kept); + const baseDamageDisplay = isUsageDie ? DonjonEtCieUtility.formatUsageDie(degatsDelta) : item.system.degats; await this.#createChatCard(actor ?? item.actor, "systems/fvtt-donjon-et-cie/templates/chat/damage-card.hbs", { title: `${game.i18n.localize("DNC.Roll.Damage")} : ${item.name}`, @@ -351,13 +397,60 @@ export class DonjonEtCieRolls { values: result.values, total: result.kept, bonus: totalBonus, - baseDamage: item.system.degats, + baseDamage: baseDamageDisplay, + effectiveDamage, + damageCapped: damageContext.capped, + martialDvLabel: damageContext.martialDvSides ? `d${damageContext.martialDvSides}` : damageContext.martialDvFormula, sourceLabel: item.name, targets, - hasTargets: targets.length > 0 + hasTargets: targets.length > 0, + showDamageUsageButton: isUsageDie && degatsDelta > 0, + itemUuid: item.uuid }, { rolls: result.rolls }); - return { total: result.kept, formula: result.formula, bonus: totalBonus, values: result.values, mode: result.mode }; + return { + total: result.kept, + formula: result.formula, + baseDamage: baseDamageDisplay, + effectiveDamage, + damageCapped: damageContext.capped, + bonus: totalBonus, + values: result.values, + mode: result.mode + }; + } + + static async rollWeaponDamageUsage(item, { mode = "normal" } = {}) { + const before = Number(item?.system?.degatsDelta ?? 0); + if (!before) { + ui.notifications.warn(game.i18n.localize("DNC.Warn.DamageExhausted")); + return null; + } + + const resolved = await this.#resolveFormulaRoll(`1d${before}`, {}, { mode, favorable: "high" }); + const result = resolved.kept; + const degraded = result <= 3; + const after = degraded ? DonjonEtCieUtility.degradeUsageDie(before) : before; + + if (after !== before) { + await item.update({ "system.degatsDelta": after }); + } + + await this.#createChatCard(item.actor, "systems/fvtt-donjon-et-cie/templates/chat/usage-card.hbs", { + title: `${game.i18n.localize("DNC.Roll.DamageUsage")} : ${item.name}`, + value: result, + values: resolved.values, + mode: resolved.mode, + modeLabel: this.#getModeLabel(resolved.mode), + before: DonjonEtCieUtility.formatUsageDie(before), + after: DonjonEtCieUtility.formatUsageDie(after), + protectionStored: null, + degraded, + exhausted: after === 0, + isDamageUsage: true + }, { rolls: resolved.rolls }); + + return { result, values: resolved.values, mode: resolved.mode, before, after, degraded }; } static async applyDamage(target, { damage = 0, useArmor = false, sourceLabel = "" } = {}) { diff --git a/modules/donjon-et-cie-utility.mjs b/modules/donjon-et-cie-utility.mjs index aa5b296..8d36466 100644 --- a/modules/donjon-et-cie-utility.mjs +++ b/modules/donjon-et-cie-utility.mjs @@ -119,6 +119,87 @@ export class DonjonEtCieUtility { }; } + static parseDieFormula(formula) { + const normalized = String(formula ?? "").trim(); + if (!normalized) return null; + + const dieMatch = normalized.match(/(?\d*)d(?\d+)/i); + if (dieMatch?.groups?.sides) { + return { + formula: normalized, + count: Number(dieMatch.groups.count || 1), + countRaw: dieMatch.groups.count ?? "", + sides: Number(dieMatch.groups.sides), + match: dieMatch[0], + index: dieMatch.index ?? 0 + }; + } + + if (/^\d+$/.test(normalized)) { + const sides = Number(normalized); + if ([4, 6, 8, 10, 12, 20].includes(sides)) { + return { + formula: normalized, + count: 1, + countRaw: "", + sides, + match: normalized, + index: 0 + }; + } + } + + return null; + } + + static getMartialDamageContext(actor, item) { + const isUsageDie = Boolean(item?.system?.degatsEstUsageDe); + const degatsDelta = Number(item?.system?.degatsDelta ?? 0); + const baseFormula = isUsageDie + ? (degatsDelta > 0 ? `1d${degatsDelta}` : "") + : String(item?.system?.degats ?? "").trim(); + + const baseContext = { + baseFormula, + effectiveFormula: baseFormula, + capped: false, + martialDvFormula: String(actor?.system?.sante?.dv ?? "").trim(), + martialDvSides: 0, + weaponSides: 0, + isUsageDie + }; + + if (actor?.type !== "employe" || item?.type !== "arme" || !baseFormula) { + return baseContext; + } + + const damageDie = this.parseDieFormula(baseFormula); + const martialDie = this.parseDieFormula(actor.system.sante?.dv); + if (!damageDie || !martialDie?.sides) return baseContext; + + const cappedSides = Math.min(damageDie.sides, martialDie.sides); + if (cappedSides >= damageDie.sides) { + return { + ...baseContext, + martialDvSides: martialDie.sides, + weaponSides: damageDie.sides + }; + } + + const replacement = `${damageDie.countRaw || ""}d${cappedSides}`; + const effectiveFormula = damageDie.match === damageDie.formula + ? replacement + : `${damageDie.formula.slice(0, damageDie.index)}${replacement}${damageDie.formula.slice(damageDie.index + damageDie.match.length)}`; + + return { + ...baseContext, + effectiveFormula, + capped: true, + martialDvSides: martialDie.sides, + weaponSides: damageDie.sides + }; + } + static getFavorLabel(key) { return DONJON_ET_CIE.favorDepartments[key] ?? key; } @@ -173,12 +254,20 @@ export class DonjonEtCieUtility { const system = item.system; const delta = Number(system.delta ?? 0); const deltaMax = Number(system.deltaMax ?? delta ?? 0); + const ammunitionDelta = Number(system.munitionsDelta ?? 0); + const isUsageDie = Boolean(system.degatsEstUsageDe); + const degatsDelta = Number(system.degatsDelta ?? 0); const usageLabel = item.type === "entrainement" && deltaMax > 0 ? `${this.formatUsageDie(delta)} / ${this.formatUsageDie(deltaMax)}` : delta > 0 ? this.formatUsageDie(delta) : null; + const damageUsageLabel = isUsageDie + ? (degatsDelta > 0 ? this.formatUsageDie(degatsDelta) : game.i18n.localize("DNC.UI.DamageExhausted")) + : null; + const damageLabel = isUsageDie ? damageUsageLabel : (system.degats || null); + return { id: item.id, name: item.name, @@ -187,11 +276,15 @@ export class DonjonEtCieUtility { system, uuid: item.uuid, usageLabel, + ammunitionUsageLabel: item.type === "arme" && ammunitionDelta > 0 ? this.formatUsageDie(ammunitionDelta) : null, protectionLabel: item.type === "armure" && Number(system.resultatProtection ?? 0) > 0 ? `Protection ${system.resultatProtection}` : null, weaponCharacteristicLabel: item.type === "arme" ? this.getWeaponCharacteristicLabel(system.categorie) : null, canRoll: ["arme", "sortilege"].includes(item.type), canUse: delta > 0, - canRollDamage: Boolean(system.degats), + hasTrackedAmmunition: item.type === "arme" && ammunitionDelta > 0, + damageUsageLabel, + damageLabel, + canRollDamage: item.type === "arme" && (isUsageDie ? degatsDelta > 0 : Boolean(system.degats)), rollAction: item.type === "sortilege" ? "rollSpell" : "rollWeapon", damageAction: "rollDamage", isEquipped: Boolean(system.equipee), diff --git a/modules/models/arme.mjs b/modules/models/arme.mjs index 345421b..0303fed 100644 --- a/modules/models/arme.mjs +++ b/modules/models/arme.mjs @@ -20,6 +20,9 @@ export default class ArmeDataModel extends BaseItemDataModel { categorie: new fields.StringField({ initial: "melee" }), caracteristique: new fields.StringField({ initial: "force" }), degats: new fields.StringField({ initial: "1d6" }), + degatsEstUsageDe: new fields.BooleanField({ initial: false }), + degatsDelta: new fields.NumberField({ initial: 0, integer: true, min: 0 }), + munitionsDelta: new fields.NumberField({ initial: 0, integer: true, min: 0 }), portee: new fields.StringField({ initial: "" }), mains: new fields.NumberField({ initial: 1, integer: true }), equipee: new fields.BooleanField({ initial: false }) diff --git a/packs/equipment/000079.log b/packs/equipment/000087.log similarity index 100% rename from packs/equipment/000079.log rename to packs/equipment/000087.log diff --git a/packs/equipment/CURRENT b/packs/equipment/CURRENT index c7a124b..814a4b7 100644 --- a/packs/equipment/CURRENT +++ b/packs/equipment/CURRENT @@ -1 +1 @@ -MANIFEST-000077 +MANIFEST-000085 diff --git a/packs/equipment/LOG b/packs/equipment/LOG index b8e21b5..b7d669b 100644 --- a/packs/equipment/LOG +++ b/packs/equipment/LOG @@ -1,7 +1,7 @@ -2026/05/09-23:26:00.662378 7fe6d3fff6c0 Recovering log #75 -2026/05/09-23:26:00.714642 7fe6d3fff6c0 Delete type=3 #73 -2026/05/09-23:26:00.714705 7fe6d3fff6c0 Delete type=0 #75 -2026/05/09-23:32:35.906147 7fe6d37fe6c0 Level-0 table #80: started -2026/05/09-23:32:35.906185 7fe6d37fe6c0 Level-0 table #80: 0 bytes OK -2026/05/09-23:32:35.912511 7fe6d37fe6c0 Delete type=0 #78 -2026/05/09-23:32:35.920264 7fe6d37fe6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) +2026/05/22-09:28:26.005874 7fb57dfee6c0 Recovering log #83 +2026/05/22-09:28:26.015537 7fb57dfee6c0 Delete type=3 #81 +2026/05/22-09:28:26.015651 7fb57dfee6c0 Delete type=0 #83 +2026/05/22-09:49:57.296086 7fb567fff6c0 Level-0 table #88: started +2026/05/22-09:49:57.296112 7fb567fff6c0 Level-0 table #88: 0 bytes OK +2026/05/22-09:49:57.302010 7fb567fff6c0 Delete type=0 #86 +2026/05/22-09:49:57.319148 7fb567fff6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/LOG.old b/packs/equipment/LOG.old index bcb243b..637cfb8 100644 --- a/packs/equipment/LOG.old +++ b/packs/equipment/LOG.old @@ -1,7 +1,7 @@ -2026/05/09-23:24:27.244461 7fe6d3fff6c0 Recovering log #71 -2026/05/09-23:24:27.261516 7fe6d3fff6c0 Delete type=3 #69 -2026/05/09-23:24:27.261564 7fe6d3fff6c0 Delete type=0 #71 -2026/05/09-23:25:01.848661 7fe6d37fe6c0 Level-0 table #76: started -2026/05/09-23:25:01.848715 7fe6d37fe6c0 Level-0 table #76: 0 bytes OK -2026/05/09-23:25:01.854909 7fe6d37fe6c0 Delete type=0 #74 -2026/05/09-23:25:01.877929 7fe6d37fe6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) +2026/05/09-23:56:26.228807 7fe7211fe6c0 Recovering log #79 +2026/05/09-23:56:26.239813 7fe7211fe6c0 Delete type=3 #77 +2026/05/09-23:56:26.239859 7fe7211fe6c0 Delete type=0 #79 +2026/05/09-23:58:32.093072 7fe6d37fe6c0 Level-0 table #84: started +2026/05/09-23:58:32.093102 7fe6d37fe6c0 Level-0 table #84: 0 bytes OK +2026/05/09-23:58:32.100189 7fe6d37fe6c0 Delete type=0 #82 +2026/05/09-23:58:32.106644 7fe6d37fe6c0 Manual compaction at level-0 from '!folders!K9aiFu0dE6UYiXBd' @ 72057594037927935 : 1 .. '!items!zyqLzmpbHxK3jt5q' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/MANIFEST-000077 b/packs/equipment/MANIFEST-000085 similarity index 73% rename from packs/equipment/MANIFEST-000077 rename to packs/equipment/MANIFEST-000085 index 6473262..ca46b88 100644 Binary files a/packs/equipment/MANIFEST-000077 and b/packs/equipment/MANIFEST-000085 differ diff --git a/packs/random-tables/000066.log b/packs/random-tables/000074.log similarity index 100% rename from packs/random-tables/000066.log rename to packs/random-tables/000074.log diff --git a/packs/random-tables/CURRENT b/packs/random-tables/CURRENT index 5d746f2..f74be16 100644 --- a/packs/random-tables/CURRENT +++ b/packs/random-tables/CURRENT @@ -1 +1 @@ -MANIFEST-000064 +MANIFEST-000072 diff --git a/packs/random-tables/LOG b/packs/random-tables/LOG index 84ed78e..d34eb2d 100644 --- a/packs/random-tables/LOG +++ b/packs/random-tables/LOG @@ -1,7 +1,7 @@ -2026/05/09-23:26:00.734399 7fe7211fe6c0 Recovering log #62 -2026/05/09-23:26:00.785619 7fe7211fe6c0 Delete type=3 #60 -2026/05/09-23:26:00.785680 7fe7211fe6c0 Delete type=0 #62 -2026/05/09-23:32:35.893861 7fe6d37fe6c0 Level-0 table #67: started -2026/05/09-23:32:35.893901 7fe6d37fe6c0 Level-0 table #67: 0 bytes OK -2026/05/09-23:32:35.899905 7fe6d37fe6c0 Delete type=0 #65 -2026/05/09-23:32:35.920244 7fe6d37fe6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) +2026/05/22-09:28:26.020644 7fb57d7ed6c0 Recovering log #70 +2026/05/22-09:28:26.031504 7fb57d7ed6c0 Delete type=3 #68 +2026/05/22-09:28:26.031624 7fb57d7ed6c0 Delete type=0 #70 +2026/05/22-09:49:57.312571 7fb567fff6c0 Level-0 table #75: started +2026/05/22-09:49:57.312612 7fb567fff6c0 Level-0 table #75: 0 bytes OK +2026/05/22-09:49:57.318950 7fb567fff6c0 Delete type=0 #73 +2026/05/22-09:49:57.319188 7fb567fff6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) diff --git a/packs/random-tables/LOG.old b/packs/random-tables/LOG.old index 0017960..09b49ef 100644 --- a/packs/random-tables/LOG.old +++ b/packs/random-tables/LOG.old @@ -1,7 +1,7 @@ -2026/05/09-23:24:27.266509 7fe7211fe6c0 Recovering log #58 -2026/05/09-23:24:27.282592 7fe7211fe6c0 Delete type=3 #56 -2026/05/09-23:24:27.282660 7fe7211fe6c0 Delete type=0 #58 -2026/05/09-23:25:01.864644 7fe6d37fe6c0 Level-0 table #63: started -2026/05/09-23:25:01.864678 7fe6d37fe6c0 Level-0 table #63: 0 bytes OK -2026/05/09-23:25:01.871922 7fe6d37fe6c0 Delete type=0 #61 -2026/05/09-23:25:01.877952 7fe6d37fe6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) +2026/05/09-23:56:26.242643 7fe7219ff6c0 Recovering log #66 +2026/05/09-23:56:26.252924 7fe7219ff6c0 Delete type=3 #64 +2026/05/09-23:56:26.252971 7fe7219ff6c0 Delete type=0 #66 +2026/05/09-23:58:32.087004 7fe6d37fe6c0 Level-0 table #71: started +2026/05/09-23:58:32.087037 7fe6d37fe6c0 Level-0 table #71: 0 bytes OK +2026/05/09-23:58:32.092951 7fe6d37fe6c0 Delete type=0 #69 +2026/05/09-23:58:32.106635 7fe6d37fe6c0 Manual compaction at level-0 from '!tables!PPsxQgHwLCQ2gjSW' @ 72057594037927935 : 1 .. '!tables.results!wJZXUo4q5b5vE3Dy.zFTPLMc9zOl5hISV' @ 0 : 0; will stop at (end) diff --git a/packs/random-tables/MANIFEST-000064 b/packs/random-tables/MANIFEST-000072 similarity index 85% rename from packs/random-tables/MANIFEST-000064 rename to packs/random-tables/MANIFEST-000072 index b89606a..c02ce0d 100644 Binary files a/packs/random-tables/MANIFEST-000064 and b/packs/random-tables/MANIFEST-000072 differ diff --git a/packs/system-help/000013.log b/packs/system-help/000008.log similarity index 100% rename from packs/system-help/000013.log rename to packs/system-help/000008.log diff --git a/packs/system-help/000010.ldb b/packs/system-help/000010.ldb new file mode 100644 index 0000000..109c785 Binary files /dev/null and b/packs/system-help/000010.ldb differ diff --git a/packs/system-help/CURRENT b/packs/system-help/CURRENT index 1a84852..f7753e2 100644 --- a/packs/system-help/CURRENT +++ b/packs/system-help/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000006 diff --git a/packs/system-help/LOG b/packs/system-help/LOG index 6b18d78..87c9f04 100644 --- a/packs/system-help/LOG +++ b/packs/system-help/LOG @@ -1,5 +1,15 @@ -2026/05/09-23:29:14.636398 7f54217ed6c0 Delete type=3 #1 -2026/05/09-23:29:14.638741 7f5403fff6c0 Level-0 table #5: started -2026/05/09-23:29:14.666649 7f5403fff6c0 Level-0 table #5: 3056 bytes OK -2026/05/09-23:29:14.731617 7f5403fff6c0 Delete type=0 #3 -2026/05/09-23:29:14.731832 7f5403fff6c0 Manual compaction at level-0 from '!journal!69Da9YvF9BfOV7oK' @ 72057594037927935 : 1 .. '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 0 : 0; will stop at (end) +2026/05/22-09:28:26.037049 7fb57dfee6c0 Recovering log #4 +2026/05/22-09:28:26.047411 7fb57dfee6c0 Delete type=3 #2 +2026/05/22-09:28:26.047498 7fb57dfee6c0 Delete type=0 #4 +2026/05/22-09:49:57.302133 7fb567fff6c0 Level-0 table #9: started +2026/05/22-09:49:57.305585 7fb567fff6c0 Level-0 table #9: 3183 bytes OK +2026/05/22-09:49:57.312423 7fb567fff6c0 Delete type=0 #7 +2026/05/22-09:49:57.319164 7fb567fff6c0 Manual compaction at level-0 from '!journal!69Da9YvF9BfOV7oK' @ 72057594037927935 : 1 .. '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 0 : 0; will stop at (end) +2026/05/22-09:49:57.319233 7fb567fff6c0 Manual compaction at level-1 from '!journal!69Da9YvF9BfOV7oK' @ 72057594037927935 : 1 .. '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 0 : 0; will stop at '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 3 : 1 +2026/05/22-09:49:57.319246 7fb567fff6c0 Compacting 1@1 + 1@2 files +2026/05/22-09:49:57.322612 7fb567fff6c0 Generated table #10@1: 2 keys, 3183 bytes +2026/05/22-09:49:57.322655 7fb567fff6c0 Compacted 1@1 + 1@2 files => 3183 bytes +2026/05/22-09:49:57.328541 7fb567fff6c0 compacted to: files[ 0 0 1 0 0 0 0 ] +2026/05/22-09:49:57.328673 7fb567fff6c0 Delete type=2 #5 +2026/05/22-09:49:57.328793 7fb567fff6c0 Delete type=2 #9 +2026/05/22-09:49:57.351951 7fb567fff6c0 Manual compaction at level-1 from '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 3 : 1 .. '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 0 : 0; will stop at (end) diff --git a/packs/system-help/LOG.old b/packs/system-help/LOG.old new file mode 100644 index 0000000..e948cde --- /dev/null +++ b/packs/system-help/LOG.old @@ -0,0 +1,5 @@ +2026/05/22-08:07:40.563282 7f63427ef6c0 Delete type=3 #1 +2026/05/22-08:07:40.567990 7f6323fff6c0 Level-0 table #5: started +2026/05/22-08:07:40.571414 7f6323fff6c0 Level-0 table #5: 3056 bytes OK +2026/05/22-08:07:40.577623 7f6323fff6c0 Delete type=0 #3 +2026/05/22-08:07:40.577857 7f6323fff6c0 Manual compaction at level-0 from '!journal!69Da9YvF9BfOV7oK' @ 72057594037927935 : 1 .. '!journal.pages!69Da9YvF9BfOV7oK.XM0eLkgKXPyskV65' @ 0 : 0; will stop at (end) diff --git a/packs/system-help/MANIFEST-000006 b/packs/system-help/MANIFEST-000006 new file mode 100644 index 0000000..40bfece Binary files /dev/null and b/packs/system-help/MANIFEST-000006 differ diff --git a/templates/actors/employe-sheet.hbs b/templates/actors/employe-sheet.hbs index 8d7fdb1..2485b15 100644 --- a/templates/actors/employe-sheet.hbs +++ b/templates/actors/employe-sheet.hbs @@ -93,7 +93,8 @@ {{#if this.protectionLabel}}{{this.protectionLabel}}{{/if}} {{#if this.system.effet}}

{{this.system.effet}}

{{/if}} - {{#if this.system.degats}}

Degats : {{this.system.degats}}

{{/if}} + {{#if this.damageLabel}}

Degats : {{this.damageLabel}}

{{/if}} + {{#if this.ammunitionUsageLabel}}

Munitions : {{this.ammunitionUsageLabel}}

{{/if}}
{{#if this.canRoll}} @@ -138,7 +139,8 @@ {{#if this.protectionLabel}}{{this.protectionLabel}}{{/if}}
{{#if this.system.effet}}

{{this.system.effet}}

{{/if}} - {{#if this.system.degats}}

Degats : {{this.system.degats}}

{{/if}} + {{#if this.damageLabel}}

Degats : {{this.damageLabel}}

{{/if}} + {{#if this.ammunitionUsageLabel}}

Munitions : {{this.ammunitionUsageLabel}}

{{/if}}
{{#if this.canRoll}} @@ -234,7 +236,8 @@ {{#if this.protectionLabel}}{{this.protectionLabel}}{{/if}}
{{#if this.system.effet}}

{{this.system.effet}}

{{/if}} - {{#if this.system.degats}}

Degats : {{this.system.degats}}

{{/if}} + {{#if this.damageLabel}}

Degats : {{this.damageLabel}}

{{/if}} + {{#if this.ammunitionUsageLabel}}

Munitions : {{this.ammunitionUsageLabel}}

{{/if}}
{{#if this.canRoll}} @@ -278,7 +281,8 @@ {{#if this.protectionLabel}}{{this.protectionLabel}}{{/if}}
{{#if this.system.effet}}

{{this.system.effet}}

{{/if}} - {{#if this.system.degats}}

Degats : {{this.system.degats}}

{{/if}} + {{#if this.damageLabel}}

Degats : {{this.damageLabel}}

{{/if}} + {{#if this.ammunitionUsageLabel}}

Munitions : {{this.ammunitionUsageLabel}}

{{/if}}
{{#if this.canRoll}} @@ -395,7 +399,8 @@ {{#if this.protectionLabel}}{{this.protectionLabel}}{{/if}}
{{#if this.system.effet}}

{{this.system.effet}}

{{/if}} - {{#if this.system.degats}}

Degats : {{this.system.degats}}

{{/if}} + {{#if this.damageLabel}}

Degats : {{this.damageLabel}}

{{/if}} + {{#if this.ammunitionUsageLabel}}

Munitions : {{this.ammunitionUsageLabel}}

{{/if}}
{{#if this.canRoll}} diff --git a/templates/actors/pnj-sheet.hbs b/templates/actors/pnj-sheet.hbs index 1652eac..659d796 100644 --- a/templates/actors/pnj-sheet.hbs +++ b/templates/actors/pnj-sheet.hbs @@ -122,7 +122,8 @@ {{#if this.usageLabel}}{{this.usageLabel}}{{/if}}
{{#if this.system.effet}}

{{this.system.effet}}

{{/if}} - {{#if this.system.degats}}

Degats : {{this.system.degats}}

{{/if}} + {{#if this.damageLabel}}

Degats : {{this.damageLabel}}

{{/if}} + {{#if this.ammunitionUsageLabel}}

Munitions : {{this.ammunitionUsageLabel}}

{{/if}}
{{#if this.canRoll}} diff --git a/templates/chat/damage-card.hbs b/templates/chat/damage-card.hbs index 0834439..8dc39db 100644 --- a/templates/chat/damage-card.hbs +++ b/templates/chat/damage-card.hbs @@ -13,6 +13,7 @@
{{#if modeLabel}}{{modeLabel}}{{/if}} Dé {{keptDieLabel}} + {{#if damageCapped}}{{localize "DNC.Chat.DamageCapped" damage=effectiveDamage dv=martialDvLabel}}{{/if}} {{#if bonus}}Bonus +{{bonus}}{{/if}}

{{formula}}

@@ -22,7 +23,7 @@

{{#each rollDieLabels}}{{this}}{{/each}}

{{/if}} -

Base : {{baseDamage}}{{#if bonus}} · Bonus : +{{bonus}}{{/if}}

+

Base : {{baseDamage}}{{#if damageCapped}} · {{localize "DNC.Chat.MartialDv"}} : {{martialDvLabel}} · {{localize "DNC.Chat.EffectiveDamage"}} : {{effectiveDamage}}{{/if}}{{#if bonus}} · Bonus : +{{bonus}}{{/if}}

+ {{#if showDamageUsageButton}} +
+ +
+ {{/if}} diff --git a/templates/chat/roll-card.hbs b/templates/chat/roll-card.hbs index 0ca7851..8d5b3fa 100644 --- a/templates/chat/roll-card.hbs +++ b/templates/chat/roll-card.hbs @@ -28,7 +28,20 @@ + {{#if showAmmoButton}} + + {{/if}} + {{else}} + {{#if showAmmoButton}} +
+ +
+ {{/if}} {{/if}}