From 479d7e506a0f6ec360a68090c4678a9911b56568 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Fri, 24 Apr 2026 19:03:55 -0400 Subject: [PATCH] Fix origin key replacement and prioritize item options --- module/documents/activeEffect.mjs | 15 ++++++++------- module/helpers/utils.mjs | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 227e2613..5d3ffc83 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -171,24 +171,25 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { static getChangeValue(model, change, effect) { let key = change.value.toString(); - const isOriginTarget = key.toLowerCase().includes('origin.@'); - let parseModel = model; - if (isOriginTarget && effect.origin) { - key = change.key.replaceAll(/origin\.@/gi, '@'); + let origin = null; + if (key.toLowerCase().includes('origin.@') && effect.origin) { + key = key.replaceAll(/origin\.@/gi, '@'); try { const originEffect = foundry.utils.fromUuidSync(effect.origin); - const doc = + origin = originEffect.parent?.parent instanceof game.system.api.documents.DhpActor ? originEffect.parent : originEffect.parent.parent; - if (doc) parseModel = doc; } catch (_) {} } + // Get the actor and item documents. Note that actor roll data is inclusive of system roll data + const actor = model.parent instanceof Actor ? model.parent : model; + const item = origin ?? null; const stackingParsedValue = effect.system.stacking ? Roll.replaceFormulaData(key, { stacks: effect.system.stacking.value }) : key; - const evalValue = itemAbleRollParse(stackingParsedValue, parseModel, effect.parent); + const evalValue = itemAbleRollParse(stackingParsedValue, actor, item); return evalValue ?? key; } diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index 4527da1a..9d4a09d2 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -375,7 +375,7 @@ export const itemAbleRollParse = (value, actor, item) => { const isItemTarget = value.toLowerCase().includes('item.@'); const slicedValue = isItemTarget ? value.replaceAll(/item\.@/gi, '@') : value; - const model = isItemTarget ? item : actor; + const model = isItemTarget || item instanceof Item ? item : actor; try { return Roll.replaceFormulaData(slicedValue, isItemTarget || !model?.getRollData ? model : model.getRollData());