From fc5d38deff9539b971fbf74522de9e2c8326897b Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Tue, 18 Aug 2026 18:38:10 +0200 Subject: [PATCH] fix: dead combatants reappearing as targets via scene token fallback The combat loop correctly skipped defeated combatants, but their token IDs were absent from existingTokenIds, so the scene token loop re-added them. Now building a defeatedTokenIds set from defeated combatants and checking it in the scene token loop. Also switched from game.actors.get() to token.actor for the monster HP check so unlinked monster tokens (synthetic actors) are covered. Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe --- module/documents/roll-base.mjs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/module/documents/roll-base.mjs b/module/documents/roll-base.mjs index a77396d..e3215b7 100644 --- a/module/documents/roll-base.mjs +++ b/module/documents/roll-base.mjs @@ -161,11 +161,15 @@ export default class LethalFantasyRoll extends Roll { let isAttack = this.type === "weapon-attack" || this.type === "monster-attack" || this.type === "spell-attack" || this.type === "miracle-attack" if (this.rollData?.isDamage || isAttack) { // D'abord, ajouter les combattants du combat actif + const defeatedTokenIds = new Set() if (game?.combat?.combatants) { for (let c of game.combat.combatants) { if (c.actorId !== this.actorId && !c.isDefeated) { combatants.push({ id: c.id, name: c.name, tokenId: c.token.id }) } + if (c.isDefeated && c.token?.id) { + defeatedTokenIds.add(c.token.id) + } } } @@ -173,9 +177,9 @@ export default class LethalFantasyRoll extends Roll { if (canvas?.scene?.tokens) { const existingTokenIds = new Set(combatants.map(c => c.tokenId)) for (let token of canvas.scene.tokens) { - if (token.actorId !== this.actorId && !existingTokenIds.has(token.id)) { - // Skip dead tokens: monsters at 0 HP are dead; characters use the defeated flag - const tokenActor = game.actors.get(token.actorId) + if (token.actorId !== this.actorId && !existingTokenIds.has(token.id) && !defeatedTokenIds.has(token.id)) { + // Skip dead monsters (0 HP). Use token.actor for unlinked tokens. + const tokenActor = token.actor ?? game.actors.get(token.actorId) if (tokenActor?.type === "monster" && (Number(tokenActor?.system?.hp?.value) || 0) <= 0) continue combatants.push({ id: token.id,