diff --git a/lang/en.json b/lang/en.json index 7ed8c22..4fc898a 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,8 +1,8 @@ { "COMBAT": { - "Round": "Second {round}", - "Rounds": "Seconds", - "RoundNext": "Next second" + "Round": "Second {round}", + "Rounds": "Seconds", + "RoundNext": "Next second" }, "LETHALFANTASY": { "Armor": { @@ -294,13 +294,13 @@ "miracle-power": "Miracle - Power", "miracle-attack": "Miracle - Attack", "spell": "Spell", - "will":"Will", - "dodge":"Dodge", - "toughness":"Toughness", - "contagion":"Contagion", - "poison":"Poison", - "pain":"Pain", - "paincourage":"Pain/Courage", + "will": "Will", + "dodge": "Dodge", + "toughness": "Toughness", + "contagion": "Contagion", + "poison": "Poison", + "pain": "Pain", + "paincourage": "Pain/Courage", "granted": "Granted Dice", "shields": "Shields", "armorHitPoints": "Armor hit points", @@ -320,7 +320,7 @@ "aetherPoints": "Aether points", "attacks": "Attacks", "monster": "Monster", - "Resist" :"Resist", + "Resist": "Resist", "resist": "Resist", "resistTorture": "Resist torture", "resistPerformance": "Resist performance", @@ -428,7 +428,8 @@ "weapons": "Weapons", "wis": "WIS", "weapon-damage-medium": "Weapon damage medium", - "weapon-damage-small": "Weapon damage small" + "weapon-damage-small": "Weapon damage small", + "combatProgressionStart": "Combat start threshold" }, "Miracle": { "FIELDS": { @@ -729,7 +730,8 @@ "Tooltip": { "addEquipment": "New equipment", "addSpell": "New spells", - "skill": "Skills list" + "skill": "Skills list", + "combatProgressionStart": "First attack of combat can succeed on a roll of 1 through this value. Resets to 1 for subsequent attacks." }, "Vulnerability": { "FIELDS": { diff --git a/lethal-fantasy.mjs b/lethal-fantasy.mjs index e001bff..b265a1e 100644 --- a/lethal-fantasy.mjs +++ b/lethal-fantasy.mjs @@ -317,6 +317,7 @@ Hooks.on(hookName, (message, html, data) => { const attackKey = button.data("attack-key") let attackerId = button.data("attacker-id") const defenderId = button.data("defender-id") + const defenderTokenId = button.data("defender-token-id") || null const damageType = button.data("damage-type") const damageFormula = button.data("damage-formula") const damageModifier = button.data("damage-modifier") @@ -331,7 +332,7 @@ Hooks.on(hookName, (message, html, data) => { // Pour les boutons de résultat de combat (monster damage) if (damageType === "monster" && attackKey) { - await actor.system.prepareMonsterRoll("monster-damage", attackKey, undefined, undefined, undefined, defenderId) + await actor.system.prepareMonsterRoll("monster-damage", attackKey, undefined, undefined, undefined, defenderId, defenderTokenId) return } @@ -350,7 +351,7 @@ Hooks.on(hookName, (message, html, data) => { // Lancer les dégâts avec la bonne méthode const rollType = damageType === "small" ? "weapon-damage-small" : "weapon-damage-medium" - await actor.prepareRoll(rollType, weaponId, undefined, defenderId) + await actor.prepareRoll(rollType, weaponId, undefined, defenderId, defenderTokenId) }) // Masquer les boutons de dommages dans les messages de résultat de combat si l'utilisateur n'est pas l'attaquant @@ -409,7 +410,7 @@ Hooks.on("createChatMessage", async (message) => { return } - const { attackerId, attackRoll, attackerName, defenderName, attackWeaponId, attackRollType, attackRollKey, defenderId } = attackData + const { attackerId, attackRoll, attackerName, defenderName, attackWeaponId, attackRollType, attackRollKey, defenderId, defenderTokenId } = attackData let defenseRoll = message.rolls[0]?.options?.rollTotal || message.rolls[0]?.total || 0 console.log("Processing defense:", { attackRoll, defenseRoll, attackerId, defenderId }) @@ -487,6 +488,7 @@ Hooks.on("createChatMessage", async (message) => { attackRollKey, defenderName, defenderId, + defenderTokenId, defenseRoll }) } else { @@ -512,7 +514,7 @@ Hooks.on("createChatMessage", async (message) => { // 1. Si l'attaquant a un propriétaire joueur, seul ce joueur applique // 2. Si l'attaquant n'a que le MJ comme propriétaire (monstre), seul le MJ applique const attackerOwners = attacker ? game.users.filter(u => - !u.isGM && attacker.testUserPermission(u, "OWNER") + u.active && !u.isGM && attacker.testUserPermission(u, "OWNER") ) : [] let shouldApplyDamage = false @@ -552,11 +554,13 @@ Hooks.on("createChatMessage", async (message) => { const armorDR = defender.computeDamageReduction() || 0 const finalDamage = Math.max(0, damageTotal - armorDR) - // For unlinked tokens (default for monsters), we need the specific token actor, not the base - // world actor — otherwise applyDamage would modify the base actor and affect every unlinked - // copy of that monster. Prefer the combatant actor, fall back to canvas scan. + // Prefer the token ID stored in roll options (set at attack time when the exact token is known). + // For unlinked tokens (default for monsters), this ensures we target the right instance even + // when multiple unlinked copies of the same monster type are in combat. + const rollDefenderTokenId = message.rolls[0]?.options?.defenderTokenId const defenderCombatant = game.combat?.combatants?.find(c => c.actorId === defender.id) - const defenderTokenId = defenderCombatant?.token?.id + const defenderTokenId = rollDefenderTokenId + ?? defenderCombatant?.token?.id ?? canvas.tokens?.placeables?.find(t => t.actor?.id === defender.id)?.id ?? null @@ -564,7 +568,11 @@ Hooks.on("createChatMessage", async (message) => { // route the HP update to the GM via socket. The confirmation message is still created here // since all users can create chat messages. if (defender.isOwner) { - const tokenActor = defenderCombatant?.actor ?? defender + // Resolve the token actor: prefer lookup by token ID (exact match for unlinked monsters), + // fall back to combatant actor, then base world actor. + const tokenActor = (defenderTokenId + ? canvas.tokens?.placeables?.find(t => t.id === defenderTokenId)?.actor + : defenderCombatant?.actor) ?? defender await tokenActor.applyDamage(-finalDamage) } else { game.socket.emit(`system.${SYSTEM.id}`, { type: "applyDamage", actorId: defender.id, tokenId: defenderTokenId, damage: -finalDamage }) diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 91e26aa..977aec8 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -153,7 +153,7 @@ export default class LethalFantasyActor extends Actor { } /* *************************************************/ - async prepareRoll(rollType, rollKey, rollDice, defenderId) { + async prepareRoll(rollType, rollKey, rollDice, defenderId, defenderTokenId) { console.log("Preparing roll", rollType, rollKey, rollDice, defenderId) let rollTarget switch (rollType) { @@ -268,7 +268,7 @@ export default class LethalFantasyActor extends Actor { rollTarget.magicUser = this.system.biodata.magicUser rollTarget.actorModifiers = foundry.utils.duplicate(this.system.modifiers) rollTarget.actorLevel = this.system.biodata.level - await this.system.roll(rollType, rollTarget, defenderId) + await this.system.roll(rollType, rollTarget, defenderId, defenderTokenId) } } diff --git a/module/documents/roll.mjs b/module/documents/roll.mjs index f653036..f708ac7 100644 --- a/module/documents/roll.mjs +++ b/module/documents/roll.mjs @@ -620,6 +620,7 @@ export default class LethalFantasyRoll extends Roll { rollBase.options.badResult = badResult rollBase.options.rollData = foundry.utils.duplicate(rollData) rollBase.options.defenderId = options.defenderId + rollBase.options.defenderTokenId = options.defenderTokenId /** * A hook event that fires after the roll has been made. @@ -698,7 +699,7 @@ export default class LethalFantasyRoll extends Roll { if (options.combatId && options.combatantId) { let combat = game.combats.get(options.combatId) - await combat.updateEmbeddedDocuments("Combatant", [{ _id: options.combatantId, initiative: initRoll.total, 'system.progressionCount': 0 }]) + await combat.updateEmbeddedDocuments("Combatant", [{ _id: options.combatantId, initiative: initRoll.total, 'system.progressionCount': 0, [`flags.${SYSTEM.id}.firstActionTaken`]: false }]) } } @@ -835,7 +836,11 @@ export default class LethalFantasyRoll extends Roll { let selectedItem = combatant.actor.items.find(i => i.id === selectedChoice) // Setup flag for combat action usage let actionItem = foundry.utils.duplicate(selectedItem) - actionItem.progressionCount = 1 + // First action of this combat: use the class-based starting threshold; + // all subsequent actions reset to 1 (normal progression). + const firstActionTaken = combatant.getFlag(SYSTEM.id, "firstActionTaken") + actionItem.progressionCount = firstActionTaken ? 1 : (combatant.actor.system.combat?.combatProgressionStart ?? 1) + if (!firstActionTaken) await combatant.setFlag(SYSTEM.id, "firstActionTaken", true) actionItem.rangedMode = rangedMode actionItem.castingTime = 1 actionItem.spellStatus = "castingTime" diff --git a/module/models/character.mjs b/module/models/character.mjs index 0e7dc9e..f8dde99 100644 --- a/module/models/character.mjs +++ b/module/models/character.mjs @@ -155,6 +155,7 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod defenseBonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), damageModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), armorHitPoints: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + combatProgressionStart: new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 }), }) const moneyField = (label) => { @@ -273,7 +274,7 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod * @param {"="|"+"|"++"|"-"|"--"} rollAdvantage If there is an avantage (+), a disadvantage (-), a double advantage (++), a double disadvantage (--) or a normal roll (=). * @returns {Promise} - A promise that resolves to null if the roll is cancelled. */ - async roll(rollType, rollTarget, defenderId) { + async roll(rollType, rollTarget, defenderId, defenderTokenId) { const hasTarget = false let roll = await LethalFantasyRoll.prompt({ rollType, @@ -283,7 +284,8 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod actorImage: this.parent.img, hasTarget, target: false, - defenderId + defenderId, + defenderTokenId }) if (!roll) return null diff --git a/module/models/monster.mjs b/module/models/monster.mjs index ec5eeb0..df80535 100644 --- a/module/models/monster.mjs +++ b/module/models/monster.mjs @@ -141,7 +141,7 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel * @param {"="|"+"|"++"|"-"|"--"} rollAdvantage If there is an avantage (+), a disadvantage (-), a double advantage (++), a double disadvantage (--) or a normal roll (=). * @returns {Promise} - A promise that resolves to null if the roll is cancelled. */ - async roll(rollType, rollTarget, defenderId = undefined) { + async roll(rollType, rollTarget, defenderId = undefined, defenderTokenId = undefined) { const hasTarget = false let roll = await LethalFantasyRoll.prompt({ rollType, @@ -151,14 +151,15 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel actorImage: this.parent.img, hasTarget, target: false, - defenderId + defenderId, + defenderTokenId }) if (!roll) return null await roll.toMessage({}, { rollMode: roll.options.rollMode }) } - async prepareMonsterRoll(rollType, rollKey, rollDice = undefined, tokenId = undefined, damageModifier = undefined, defenderId = undefined) { + async prepareMonsterRoll(rollType, rollKey, rollDice = undefined, tokenId = undefined, damageModifier = undefined, defenderId = undefined, defenderTokenId = undefined) { let rollTarget switch (rollType) { case "monster-attack": @@ -254,7 +255,7 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel if (rollTarget) { rollTarget.tokenId = tokenId console.log(rollTarget) - await this.roll(rollType, rollTarget, defenderId) + await this.roll(rollType, rollTarget, defenderId, defenderTokenId) } } diff --git a/module/utils.mjs b/module/utils.mjs index 7ecb38c..0b2f9ce 100644 --- a/module/utils.mjs +++ b/module/utils.mjs @@ -216,6 +216,18 @@ export default class LethalFantasyUtils { return } + // Resolve the specific token ID now while we still have combatant/token context. + // This is passed through to the damage roll so the GM-side socket handler can find the + // correct synthetic actor for unlinked tokens (avoids wrong-instance damage with multiple + // unlinked copies of the same monster). + const defenderTokenId = (() => { + if (game.combat && combatantId) { + const cbt = game.combat.combatants.get(combatantId) + if (cbt?.token?.id) return cbt.token.id + } + return tokenId ?? canvas.tokens?.placeables?.find(t => t.actor?.id === defender.id)?.id ?? null + })() + const isMonster = defender.type === "monster" // Pour les monstres, récupérer les attaques activées @@ -277,11 +289,10 @@ export default class LethalFantasyUtils { attackWeaponId, attackRollType, attackRollKey, - defenderId: defender.id + defenderId: defender.id, + defenderTokenId } - console.log("Storing defense data for monster:", defender.id) - defender.system.prepareMonsterRoll("monster-defense", result) } return @@ -347,7 +358,8 @@ export default class LethalFantasyUtils { attackWeaponId, attackRollType, attackRollKey, - defenderId: defender.id + defenderId: defender.id, + defenderTokenId } console.log("Storing defense data for character:", defender.id) @@ -536,10 +548,10 @@ export default class LethalFantasyUtils { if (data.attackRollType === "weapon-attack") { damageButton = `
- -
@@ -547,7 +559,7 @@ export default class LethalFantasyUtils { } else if (data.attackRollType === "monster-attack") { damageButton = `
-
diff --git a/packs-system/lf-equipment/000541.log b/packs-system/lf-equipment/000544.log similarity index 100% rename from packs-system/lf-equipment/000541.log rename to packs-system/lf-equipment/000544.log diff --git a/packs-system/lf-equipment/CURRENT b/packs-system/lf-equipment/CURRENT index c02f3d8..19d4421 100644 --- a/packs-system/lf-equipment/CURRENT +++ b/packs-system/lf-equipment/CURRENT @@ -1 +1 @@ -MANIFEST-000539 +MANIFEST-000543 diff --git a/packs-system/lf-equipment/LOG b/packs-system/lf-equipment/LOG index 0a70b47..7fb07b2 100644 --- a/packs-system/lf-equipment/LOG +++ b/packs-system/lf-equipment/LOG @@ -1,8 +1,3 @@ -2026/02/06-21:03:10.117032 7f71b6ffd6c0 Recovering log #537 -2026/02/06-21:03:10.127068 7f71b6ffd6c0 Delete type=3 #535 -2026/02/06-21:03:10.127128 7f71b6ffd6c0 Delete type=0 #537 -2026/02/06-21:51:23.216143 7f71b67fc6c0 Level-0 table #542: started -2026/02/06-21:51:23.216190 7f71b67fc6c0 Level-0 table #542: 0 bytes OK -2026/02/06-21:51:23.251149 7f71b67fc6c0 Delete type=0 #540 -2026/02/06-21:51:23.327713 7f71b67fc6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) -2026/02/06-21:51:23.327750 7f71b67fc6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) +2026/04/07-20:41:02.007080 7f6820dfe6c0 Recovering log #541 +2026/04/07-20:41:02.061052 7f6820dfe6c0 Delete type=3 #539 +2026/04/07-20:41:02.061103 7f6820dfe6c0 Delete type=0 #541 diff --git a/packs-system/lf-equipment/LOG.old b/packs-system/lf-equipment/LOG.old index 4a1f76c..0a70b47 100644 --- a/packs-system/lf-equipment/LOG.old +++ b/packs-system/lf-equipment/LOG.old @@ -1,8 +1,8 @@ -2026/02/04-08:49:16.805619 7f3bddbff6c0 Recovering log #533 -2026/02/04-08:49:16.866468 7f3bddbff6c0 Delete type=3 #531 -2026/02/04-08:49:16.866605 7f3bddbff6c0 Delete type=0 #533 -2026/02/04-08:52:25.382505 7f3946fff6c0 Level-0 table #538: started -2026/02/04-08:52:25.382568 7f3946fff6c0 Level-0 table #538: 0 bytes OK -2026/02/04-08:52:25.390046 7f3946fff6c0 Delete type=0 #536 -2026/02/04-08:52:25.403667 7f3946fff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) -2026/02/04-08:52:25.403757 7f3946fff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) +2026/02/06-21:03:10.117032 7f71b6ffd6c0 Recovering log #537 +2026/02/06-21:03:10.127068 7f71b6ffd6c0 Delete type=3 #535 +2026/02/06-21:03:10.127128 7f71b6ffd6c0 Delete type=0 #537 +2026/02/06-21:51:23.216143 7f71b67fc6c0 Level-0 table #542: started +2026/02/06-21:51:23.216190 7f71b67fc6c0 Level-0 table #542: 0 bytes OK +2026/02/06-21:51:23.251149 7f71b67fc6c0 Delete type=0 #540 +2026/02/06-21:51:23.327713 7f71b67fc6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end) +2026/02/06-21:51:23.327750 7f71b67fc6c0 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-000539 b/packs-system/lf-equipment/MANIFEST-000543 similarity index 71% rename from packs-system/lf-equipment/MANIFEST-000539 rename to packs-system/lf-equipment/MANIFEST-000543 index 1971e95..5f9748f 100644 Binary files a/packs-system/lf-equipment/MANIFEST-000539 and b/packs-system/lf-equipment/MANIFEST-000543 differ diff --git a/packs-system/lf-gifts/000538.log b/packs-system/lf-gifts/000541.log similarity index 100% rename from packs-system/lf-gifts/000538.log rename to packs-system/lf-gifts/000541.log diff --git a/packs-system/lf-gifts/CURRENT b/packs-system/lf-gifts/CURRENT index 1512908..50be3cb 100644 --- a/packs-system/lf-gifts/CURRENT +++ b/packs-system/lf-gifts/CURRENT @@ -1 +1 @@ -MANIFEST-000536 +MANIFEST-000540 diff --git a/packs-system/lf-gifts/LOG b/packs-system/lf-gifts/LOG index 870a937..7084d4f 100644 --- a/packs-system/lf-gifts/LOG +++ b/packs-system/lf-gifts/LOG @@ -1,8 +1,3 @@ -2026/02/06-21:03:10.133019 7f71b7fff6c0 Recovering log #534 -2026/02/06-21:03:10.144336 7f71b7fff6c0 Delete type=3 #532 -2026/02/06-21:03:10.144427 7f71b7fff6c0 Delete type=0 #534 -2026/02/06-21:51:23.291316 7f71b67fc6c0 Level-0 table #539: started -2026/02/06-21:51:23.291356 7f71b67fc6c0 Level-0 table #539: 0 bytes OK -2026/02/06-21:51:23.327518 7f71b67fc6c0 Delete type=0 #537 -2026/02/06-21:51:23.327733 7f71b67fc6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) -2026/02/06-21:51:23.327757 7f71b67fc6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) +2026/04/07-20:41:02.075476 7f67ebfff6c0 Recovering log #538 +2026/04/07-20:41:02.123121 7f67ebfff6c0 Delete type=3 #536 +2026/04/07-20:41:02.123187 7f67ebfff6c0 Delete type=0 #538 diff --git a/packs-system/lf-gifts/LOG.old b/packs-system/lf-gifts/LOG.old index c48cf90..870a937 100644 --- a/packs-system/lf-gifts/LOG.old +++ b/packs-system/lf-gifts/LOG.old @@ -1,8 +1,8 @@ -2026/02/04-08:49:16.884043 7f3bdd3fe6c0 Recovering log #530 -2026/02/04-08:49:16.942005 7f3bdd3fe6c0 Delete type=3 #528 -2026/02/04-08:49:16.942138 7f3bdd3fe6c0 Delete type=0 #530 -2026/02/04-08:52:25.418216 7f3946fff6c0 Level-0 table #535: started -2026/02/04-08:52:25.418276 7f3946fff6c0 Level-0 table #535: 0 bytes OK -2026/02/04-08:52:25.424939 7f3946fff6c0 Delete type=0 #533 -2026/02/04-08:52:25.432353 7f3946fff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) -2026/02/04-08:52:25.432442 7f3946fff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) +2026/02/06-21:03:10.133019 7f71b7fff6c0 Recovering log #534 +2026/02/06-21:03:10.144336 7f71b7fff6c0 Delete type=3 #532 +2026/02/06-21:03:10.144427 7f71b7fff6c0 Delete type=0 #534 +2026/02/06-21:51:23.291316 7f71b67fc6c0 Level-0 table #539: started +2026/02/06-21:51:23.291356 7f71b67fc6c0 Level-0 table #539: 0 bytes OK +2026/02/06-21:51:23.327518 7f71b67fc6c0 Delete type=0 #537 +2026/02/06-21:51:23.327733 7f71b67fc6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!x5gLtqlW4sdDmHTd' @ 0 : 0; will stop at (end) +2026/02/06-21:51:23.327757 7f71b67fc6c0 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-000536 b/packs-system/lf-gifts/MANIFEST-000540 similarity index 77% rename from packs-system/lf-gifts/MANIFEST-000536 rename to packs-system/lf-gifts/MANIFEST-000540 index 1d24bdc..3141d54 100644 Binary files a/packs-system/lf-gifts/MANIFEST-000536 and b/packs-system/lf-gifts/MANIFEST-000540 differ diff --git a/packs-system/lf-skills/000543.log b/packs-system/lf-skills/000546.log similarity index 100% rename from packs-system/lf-skills/000543.log rename to packs-system/lf-skills/000546.log diff --git a/packs-system/lf-skills/CURRENT b/packs-system/lf-skills/CURRENT index 38bbe8d..7f02150 100644 --- a/packs-system/lf-skills/CURRENT +++ b/packs-system/lf-skills/CURRENT @@ -1 +1 @@ -MANIFEST-000541 +MANIFEST-000545 diff --git a/packs-system/lf-skills/LOG b/packs-system/lf-skills/LOG index 08838ff..3c7b037 100644 --- a/packs-system/lf-skills/LOG +++ b/packs-system/lf-skills/LOG @@ -1,8 +1,3 @@ -2026/02/06-21:03:10.101791 7f71b77fe6c0 Recovering log #539 -2026/02/06-21:03:10.111914 7f71b77fe6c0 Delete type=3 #537 -2026/02/06-21:03:10.111991 7f71b77fe6c0 Delete type=0 #539 -2026/02/06-21:51:23.251285 7f71b67fc6c0 Level-0 table #544: started -2026/02/06-21:51:23.251325 7f71b67fc6c0 Level-0 table #544: 0 bytes OK -2026/02/06-21:51:23.291180 7f71b67fc6c0 Delete type=0 #542 -2026/02/06-21:51:23.327724 7f71b67fc6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) -2026/02/06-21:51:23.327764 7f71b67fc6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) +2026/04/07-20:41:01.946718 7f67eb7fe6c0 Recovering log #543 +2026/04/07-20:41:01.999435 7f67eb7fe6c0 Delete type=3 #541 +2026/04/07-20:41:01.999504 7f67eb7fe6c0 Delete type=0 #543 diff --git a/packs-system/lf-skills/LOG.old b/packs-system/lf-skills/LOG.old index 5df3f38..08838ff 100644 --- a/packs-system/lf-skills/LOG.old +++ b/packs-system/lf-skills/LOG.old @@ -1,8 +1,8 @@ -2026/02/04-08:49:16.723698 7f3bdcbfd6c0 Recovering log #535 -2026/02/04-08:49:16.780187 7f3bdcbfd6c0 Delete type=3 #533 -2026/02/04-08:49:16.780329 7f3bdcbfd6c0 Delete type=0 #535 -2026/02/04-08:52:25.375521 7f3946fff6c0 Level-0 table #540: started -2026/02/04-08:52:25.375622 7f3946fff6c0 Level-0 table #540: 0 bytes OK -2026/02/04-08:52:25.382202 7f3946fff6c0 Delete type=0 #538 -2026/02/04-08:52:25.403638 7f3946fff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) -2026/02/04-08:52:25.403738 7f3946fff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) +2026/02/06-21:03:10.101791 7f71b77fe6c0 Recovering log #539 +2026/02/06-21:03:10.111914 7f71b77fe6c0 Delete type=3 #537 +2026/02/06-21:03:10.111991 7f71b77fe6c0 Delete type=0 #539 +2026/02/06-21:51:23.251285 7f71b67fc6c0 Level-0 table #544: started +2026/02/06-21:51:23.251325 7f71b67fc6c0 Level-0 table #544: 0 bytes OK +2026/02/06-21:51:23.291180 7f71b67fc6c0 Delete type=0 #542 +2026/02/06-21:51:23.327724 7f71b67fc6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) +2026/02/06-21:51:23.327764 7f71b67fc6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-skills/MANIFEST-000541 b/packs-system/lf-skills/MANIFEST-000545 similarity index 71% rename from packs-system/lf-skills/MANIFEST-000541 rename to packs-system/lf-skills/MANIFEST-000545 index 248f65a..84296f2 100644 Binary files a/packs-system/lf-skills/MANIFEST-000541 and b/packs-system/lf-skills/MANIFEST-000545 differ diff --git a/packs-system/lf-spells-miracles/000238.log b/packs-system/lf-spells-miracles/000241.log similarity index 100% rename from packs-system/lf-spells-miracles/000238.log rename to packs-system/lf-spells-miracles/000241.log diff --git a/packs-system/lf-spells-miracles/CURRENT b/packs-system/lf-spells-miracles/CURRENT index 470e565..803ffe2 100644 --- a/packs-system/lf-spells-miracles/CURRENT +++ b/packs-system/lf-spells-miracles/CURRENT @@ -1 +1 @@ -MANIFEST-000236 +MANIFEST-000240 diff --git a/packs-system/lf-spells-miracles/LOG b/packs-system/lf-spells-miracles/LOG index fa08aab..6bea62e 100644 --- a/packs-system/lf-spells-miracles/LOG +++ b/packs-system/lf-spells-miracles/LOG @@ -1,8 +1,3 @@ -2026/02/06-21:03:10.160494 7f71b6ffd6c0 Recovering log #234 -2026/02/06-21:03:10.170771 7f71b6ffd6c0 Delete type=3 #232 -2026/02/06-21:03:10.170846 7f71b6ffd6c0 Delete type=0 #234 -2026/02/06-21:51:23.435610 7f71b67fc6c0 Level-0 table #239: started -2026/02/06-21:51:23.435649 7f71b67fc6c0 Level-0 table #239: 0 bytes OK -2026/02/06-21:51:23.473038 7f71b67fc6c0 Delete type=0 #237 -2026/02/06-21:51:23.473211 7f71b67fc6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) -2026/02/06-21:51:23.473250 7f71b67fc6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) +2026/04/07-20:41:02.201674 7f6820dfe6c0 Recovering log #238 +2026/04/07-20:41:02.254572 7f6820dfe6c0 Delete type=3 #236 +2026/04/07-20:41:02.254638 7f6820dfe6c0 Delete type=0 #238 diff --git a/packs-system/lf-spells-miracles/LOG.old b/packs-system/lf-spells-miracles/LOG.old index 3e607a8..fa08aab 100644 --- a/packs-system/lf-spells-miracles/LOG.old +++ b/packs-system/lf-spells-miracles/LOG.old @@ -1,8 +1,8 @@ -2026/02/04-08:49:17.043224 7f3bc7fff6c0 Recovering log #230 -2026/02/04-08:49:17.105842 7f3bc7fff6c0 Delete type=3 #228 -2026/02/04-08:49:17.106088 7f3bc7fff6c0 Delete type=0 #230 -2026/02/04-08:52:25.396931 7f3946fff6c0 Level-0 table #235: started -2026/02/04-08:52:25.396997 7f3946fff6c0 Level-0 table #235: 0 bytes OK -2026/02/04-08:52:25.403390 7f3946fff6c0 Delete type=0 #233 -2026/02/04-08:52:25.403717 7f3946fff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) -2026/02/04-08:52:25.403823 7f3946fff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) +2026/02/06-21:03:10.160494 7f71b6ffd6c0 Recovering log #234 +2026/02/06-21:03:10.170771 7f71b6ffd6c0 Delete type=3 #232 +2026/02/06-21:03:10.170846 7f71b6ffd6c0 Delete type=0 #234 +2026/02/06-21:51:23.435610 7f71b67fc6c0 Level-0 table #239: started +2026/02/06-21:51:23.435649 7f71b67fc6c0 Level-0 table #239: 0 bytes OK +2026/02/06-21:51:23.473038 7f71b67fc6c0 Delete type=0 #237 +2026/02/06-21:51:23.473211 7f71b67fc6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) +2026/02/06-21:51:23.473250 7f71b67fc6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end) diff --git a/packs-system/lf-spells-miracles/MANIFEST-000236 b/packs-system/lf-spells-miracles/MANIFEST-000240 similarity index 72% rename from packs-system/lf-spells-miracles/MANIFEST-000236 rename to packs-system/lf-spells-miracles/MANIFEST-000240 index bc71406..b085955 100644 Binary files a/packs-system/lf-spells-miracles/MANIFEST-000236 and b/packs-system/lf-spells-miracles/MANIFEST-000240 differ diff --git a/packs-system/lf-vulnerabilities/000537.log b/packs-system/lf-vulnerabilities/000540.log similarity index 100% rename from packs-system/lf-vulnerabilities/000537.log rename to packs-system/lf-vulnerabilities/000540.log diff --git a/packs-system/lf-vulnerabilities/CURRENT b/packs-system/lf-vulnerabilities/CURRENT index 8f4e3da..c02f3d8 100644 --- a/packs-system/lf-vulnerabilities/CURRENT +++ b/packs-system/lf-vulnerabilities/CURRENT @@ -1 +1 @@ -MANIFEST-000535 +MANIFEST-000539 diff --git a/packs-system/lf-vulnerabilities/LOG b/packs-system/lf-vulnerabilities/LOG index dde7648..8c36f30 100644 --- a/packs-system/lf-vulnerabilities/LOG +++ b/packs-system/lf-vulnerabilities/LOG @@ -1,8 +1,3 @@ -2026/02/06-21:03:10.146976 7f71b77fe6c0 Recovering log #533 -2026/02/06-21:03:10.156549 7f71b77fe6c0 Delete type=3 #531 -2026/02/06-21:03:10.156610 7f71b77fe6c0 Delete type=0 #533 -2026/02/06-21:51:23.327858 7f71b67fc6c0 Level-0 table #538: started -2026/02/06-21:51:23.327892 7f71b67fc6c0 Level-0 table #538: 0 bytes OK -2026/02/06-21:51:23.359727 7f71b67fc6c0 Delete type=0 #536 -2026/02/06-21:51:23.473179 7f71b67fc6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) -2026/02/06-21:51:23.473221 7f71b67fc6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) +2026/04/07-20:41:02.136268 7f67eb7fe6c0 Recovering log #537 +2026/04/07-20:41:02.189277 7f67eb7fe6c0 Delete type=3 #535 +2026/04/07-20:41:02.189349 7f67eb7fe6c0 Delete type=0 #537 diff --git a/packs-system/lf-vulnerabilities/LOG.old b/packs-system/lf-vulnerabilities/LOG.old index 8b2c9b5..dde7648 100644 --- a/packs-system/lf-vulnerabilities/LOG.old +++ b/packs-system/lf-vulnerabilities/LOG.old @@ -1,8 +1,8 @@ -2026/02/04-08:49:16.956252 7f3bdcbfd6c0 Recovering log #529 -2026/02/04-08:49:17.018344 7f3bdcbfd6c0 Delete type=3 #527 -2026/02/04-08:49:17.018475 7f3bdcbfd6c0 Delete type=0 #529 -2026/02/04-08:52:25.390221 7f3946fff6c0 Level-0 table #534: started -2026/02/04-08:52:25.390273 7f3946fff6c0 Level-0 table #534: 0 bytes OK -2026/02/04-08:52:25.396704 7f3946fff6c0 Delete type=0 #532 -2026/02/04-08:52:25.403694 7f3946fff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) -2026/02/04-08:52:25.403801 7f3946fff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) +2026/02/06-21:03:10.146976 7f71b77fe6c0 Recovering log #533 +2026/02/06-21:03:10.156549 7f71b77fe6c0 Delete type=3 #531 +2026/02/06-21:03:10.156610 7f71b77fe6c0 Delete type=0 #533 +2026/02/06-21:51:23.327858 7f71b67fc6c0 Level-0 table #538: started +2026/02/06-21:51:23.327892 7f71b67fc6c0 Level-0 table #538: 0 bytes OK +2026/02/06-21:51:23.359727 7f71b67fc6c0 Delete type=0 #536 +2026/02/06-21:51:23.473179 7f71b67fc6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end) +2026/02/06-21:51:23.473221 7f71b67fc6c0 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-000535 b/packs-system/lf-vulnerabilities/MANIFEST-000539 similarity index 72% rename from packs-system/lf-vulnerabilities/MANIFEST-000535 rename to packs-system/lf-vulnerabilities/MANIFEST-000539 index 490e65f..97c9639 100644 Binary files a/packs-system/lf-vulnerabilities/MANIFEST-000535 and b/packs-system/lf-vulnerabilities/MANIFEST-000539 differ diff --git a/templates/character-combat.hbs b/templates/character-combat.hbs index 4c7d67f..a70418a 100644 --- a/templates/character-combat.hbs +++ b/templates/character-combat.hbs @@ -21,6 +21,11 @@ +
+ {{localize "LETHALFANTASY.Label.combatProgressionStart"}} + {{formInput systemFields.combat.fields.combatProgressionStart value=system.combat.combatProgressionStart disabled=isPlayMode }} +
+
{{localize "LETHALFANTASY.Label.grantedAttackDice"}}