diff --git a/module/applications/activity/activity-sheet.mjs b/module/applications/activity/activity-sheet.mjs index c47153bf08..581d3ccfb8 100644 --- a/module/applications/activity/activity-sheet.mjs +++ b/module/applications/activity/activity-sheet.mjs @@ -343,15 +343,15 @@ export default class ActivitySheet extends Application5e { .map(effect => ({ value: effect.id, label: effect.name, selected: appliedEffects.has(effect.id) })); - context.appliedEffects = context.activity.effects.reduce((arr, data, index) => { + context.appliedEffects = context.activity.effects.reduce((arr, data) => { if ( !data.effect ) return arr; const effect = { data, collapsed: this.expandedSections.get(`effects.${data._id}`) ? "" : "collapsed", effect: data.effect, fields: this.activity.schema.fields.effects.element.fields, - prefix: `effects.${index}.`, - source: context.source.effects[index] ?? data, + prefix: `effects.${data._index}.`, + source: context.source.effects[data._index] ?? data, contentLink: data.effect.toAnchor().outerHTML, additionalSettings: null }; @@ -369,23 +369,20 @@ export default class ActivitySheet extends Application5e { { value: "", label: game.i18n.localize("DND5E.DAMAGE.Scaling.None") }, ...Object.entries(CONFIG.DND5E.damageScalingModes).map(([value, config]) => ({ value, label: config.label })) ]; - let indexOffset = 0; - context.damageParts = context.activity.damage.parts.map((data, index) => { - if ( data.base ) indexOffset--; - const part = { - data, - fields: this.activity.schema.fields.damage.fields.parts.element.fields, - index: index + indexOffset, - prefix: `damage.parts.${index + indexOffset}.`, - source: context.source.damage.parts[index + indexOffset] ?? data, - canScale: this.activity.canScaleDamage, - scalingOptions, - typeOptions: Object.entries(CONFIG.DND5E.damageTypes).map(([value, config]) => ({ - value, label: config.label, selected: data.types.has(value) - })) - }; - return this._prepareDamagePartContext(context, part); + const typeOptions = Object.entries(CONFIG.DND5E.damageTypes).map(([value, { label }]) => ({ value, label })); + const makePart = (data, index) => this._prepareDamagePartContext(context, { + data, index, scalingOptions, typeOptions, + canScale: this.activity.canScaleDamage, + fields: this.activity.schema.fields.damage.fields.parts.element.fields, + prefix: index !== undefined ? `damage.parts.${index}.` : "_.", + source: data }); + context.damageParts = [ + ...context.activity.damage.parts + .filter(p => p._index === undefined) + .map((data, index) => makePart(data)), + ...context.source.damage.parts.map((data, index) => makePart(data, index)) + ]; } return context; diff --git a/module/data/active-effect/enchantment.mjs b/module/data/active-effect/enchantment.mjs index b81ad2f152..bd69efa1d5 100644 --- a/module/data/active-effect/enchantment.mjs +++ b/module/data/active-effect/enchantment.mjs @@ -57,6 +57,17 @@ export default class EnchantmentData extends foundry.abstract.TypeDataModel { } return false; } catch(err) {} + case "system.damage.types": + const adjust = (damage, keyPath) => + ActiveEffect.applyField(damage, { ...change, key: "types", value: change.value }); + if ( item.system.damage?.base ) { + changes["system.damage.base.types"] = adjust(item.system.damage.base, "system.damage.base"); + } + for ( const activity of item.system.activities?.getByTypes("attack", "damage", "save") ?? [] ) { + for ( const part of activity.damage.parts ) adjust(part); + changes[`system.activities.${activity.id}.damage.parts`] = activity.damage.parts; + } + return false; case "system.save.dc": case "system.save.scaling": let value = change.value; diff --git a/module/data/activity/base-activity.mjs b/module/data/activity/base-activity.mjs index 1e6675c6be..e2a0b4e019 100644 --- a/module/data/activity/base-activity.mjs +++ b/module/data/activity/base-activity.mjs @@ -544,6 +544,11 @@ export default class BaseActivityData extends foundry.abstract.DataModel { this.name = this.name || game.i18n.localize(this.metadata?.title); this.img = this.img || this.metadata?.img; this.labels ??= {}; + const addBaseIndices = data => data?.forEach((d, idx) => Object.defineProperty(d, "_index", { value: idx })); + addBaseIndices(this.consumption?.targets); + addBaseIndices(this.damage?.parts); + addBaseIndices(this.effects); + addBaseIndices(this.uses?.recovery); } /* -------------------------------------------- */ diff --git a/templates/activity/parts/damage-part.hbs b/templates/activity/parts/damage-part.hbs index 64fe65b7fe..1ea7e28c1c 100644 --- a/templates/activity/parts/damage-part.hbs +++ b/templates/activity/parts/damage-part.hbs @@ -1,28 +1,28 @@ <div class="field-group"> - {{ formInput fields.custom.fields.enabled name=(concat prefix "custom.enabled") value=data.custom.enabled + {{ formInput fields.custom.fields.enabled name=(concat prefix "custom.enabled") value=source.custom.enabled input=@root.inputs.createCheckboxInput classes="singleton" dataset=(dnd5e-object tooltip="DND5E.DAMAGE.FIELDS.damage.parts.FIELDS.custom.enabled.hint") ariaLabel=(localize "DND5E.DAMAGE.FIELDS.damage.parts.FIELDS.custom.enabled.hint")}} - {{#if data.custom.enabled}} + {{#if source.custom.enabled}} - {{ formField fields.custom.fields.formula name=(concat prefix "custom.formula") value=data.custom.formula + {{ formField fields.custom.fields.formula name=(concat prefix "custom.formula") value=source.custom.formula label="DND5E.Formula" hint=false localize=true classes="label-top" }} - <input type="hidden" name="{{ prefix }}number" value="{{ data.number }}" data-dtype="Number"> - <input type="hidden" name="{{ prefix }}denomination" value="{{ data.denomination }}" data-dtype="Number"> - <input type="hidden" name="{{ prefix }}bonus" value="{{ data.bonus }}"> + <input type="hidden" name="{{ prefix }}number" value="{{ source.number }}" data-dtype="Number"> + <input type="hidden" name="{{ prefix }}denomination" value="{{ source.denomination }}" data-dtype="Number"> + <input type="hidden" name="{{ prefix }}bonus" value="{{ source.bonus }}"> {{else}} - {{ formField fields.number name=(concat prefix "number") value=data.number label="DND5E.Number" hint=false + {{ formField fields.number name=(concat prefix "number") value=source.number label="DND5E.Number" hint=false localize=true classes="label-top" }} - {{ formField fields.denomination name=(concat prefix "denomination") value=data.denomination + {{ formField fields.denomination name=(concat prefix "denomination") value=source.denomination options=@root.denominationOptions label="DND5E.Die" hint=false localize=true classes="label-top" }} - {{ formField fields.bonus name=(concat prefix "bonus") value=data.bonus label="DND5E.Bonus" hint=false localize=true + {{ formField fields.bonus name=(concat prefix "bonus") value=source.bonus label="DND5E.Bonus" hint=false localize=true classes="label-top" }} - <input type="hidden" name="{{ prefix }}custom.formula" value="{{ data.custom.formula }}"> + <input type="hidden" name="{{ prefix }}custom.formula" value="{{ source.custom.formula }}"> {{/if}} {{#unless data.locked}} @@ -35,7 +35,7 @@ </div> <div class="field-group"> - {{ formField fields.types name=(concat prefix "types") value=data.types options=typeOptions hint=false + {{ formField fields.types name=(concat prefix "types") value=source.types options=typeOptions hint=false disabled=data.locked label="DND5E.Type" localize=true classes="label-top multi-select" }} <!-- TODO: This disabled is only necessary because of https://github.com/foundryvtt/foundryvtt/issues/11564 --> </div> @@ -43,14 +43,14 @@ {{#if canScale}} {{#with fields.scaling.fields as |fields|}} <div class="field-group"> - {{ formField fields.mode name=(concat ../prefix "scaling.mode") value=../data.scaling.mode + {{ formField fields.mode name=(concat ../prefix "scaling.mode") value=../source.scaling.mode options=../scalingOptions label="DND5E.DAMAGE.FIELDS.damage.parts.FIELDS.scaling.abbr" hint=false localize=true classes="label-top" }} - {{#if ../data.scaling.mode}} - {{ formField fields.number name=(concat ../prefix "scaling.number") value=../data.scaling.number + {{#if ../source.scaling.mode}} + {{ formField fields.number name=(concat ../prefix "scaling.number") value=../source.scaling.number label="DND5E.DAMAGE.FIELDS.damage.parts.FIELDS.scaling.number.abbr" hint=false localize=true classes="label-top" }} - {{ formField fields.formula name=(concat ../prefix "scaling.formula") value=../data.scaling.formula + {{ formField fields.formula name=(concat ../prefix "scaling.formula") value=../source.scaling.formula label="DND5E.Formula" hint=false localize=true classes="label-top" }} {{/if}} </div>