From e5c617d62e4f2eacb4c8269b690c30042859f76b Mon Sep 17 00:00:00 2001 From: Joaquin Pereyra Date: Tue, 29 Jul 2025 22:30:49 -0300 Subject: [PATCH] FEAT: add _gettags and _getLabels to armor, domainCard, weapons and ActiveEffect --- module/data/item/armor.mjs | 22 +++ module/data/item/domainCard.mjs | 33 ++++- module/data/item/weapon.mjs | 35 ++--- module/documents/activeEffect.mjs | 48 +++++-- module/helpers/utils.mjs | 2 +- .../global/partials/inventory-item-V2.hbs | 133 ++++-------------- 6 files changed, 140 insertions(+), 133 deletions(-) diff --git a/module/data/item/armor.mjs b/module/data/item/armor.mjs index 64a6e9c0..e77d18f9 100644 --- a/module/data/item/armor.mjs +++ b/module/data/item/armor.mjs @@ -115,4 +115,26 @@ export default class DHArmor extends AttachableItem { } } } + + /** + * Generates a list of localized tags based on this item's type-specific properties. + * @returns {string[]} An array of localized tag strings. + */ + _getTags() { + const tags = [ + `${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.baseScore}`, + `${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseThresholds.base')}: ${this.baseThresholds.major} / ${this.baseThresholds.severe}` + ]; + + return tags; + } + + /** + * Generate a localized label array for this item subtype. + * @returns {(string | { value: string, icons: string[] })[]} An array of localized strings and damage label objects. + */ + _getLabels() { + const labels = [`${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.baseScore}`]; + return labels; + } } diff --git a/module/data/item/domainCard.mjs b/module/data/item/domainCard.mjs index d366b7a0..1dd89023 100644 --- a/module/data/item/domainCard.mjs +++ b/module/data/item/domainCard.mjs @@ -1,5 +1,4 @@ import BaseDataItem from './base.mjs'; -import { ActionField } from '../fields/actionField.mjs'; export default class DHDomainCard extends BaseDataItem { /** @inheritDoc */ @@ -34,6 +33,7 @@ export default class DHDomainCard extends BaseDataItem { }; } + /**@inheritdoc */ async _preCreate(data, options, user) { const allowed = await super._preCreate(data, options, user); if (allowed === false) return; @@ -55,4 +55,35 @@ export default class DHDomainCard extends BaseDataItem { } } } + + /** + * Generates a list of localized tags based on this item's type-specific properties. + * @returns {string[]} An array of localized tag strings. + */ + _getTags() { + const tags = [ + game.i18n.localize(`DAGGERHEART.CONFIG.DomainCardTypes.${this.type}`), + game.i18n.localize(`DAGGERHEART.GENERAL.Domain.${this.domain}.label`), + `${game.i18n.localize('DAGGERHEART.ITEMS.DomainCard.recallCost')}: ${this.recallCost}` + ]; + + return tags; + } + + /** + * Generate a localized label array for this item subtype. + * @returns {(string | { value: string, icons: string[] })[]} An array of localized strings and damage label objects. + */ + _getLabels() { + const labels = [ + game.i18n.localize(`DAGGERHEART.CONFIG.DomainCardTypes.${this.type}`), + game.i18n.localize(`DAGGERHEART.GENERAL.Domain.${this.domain}.label`), + { + value: `${this.recallCost}`, //converts the number to a string + icons: ['fa-bolt'] + } + ]; + + return labels; + } } diff --git a/module/data/item/weapon.mjs b/module/data/item/weapon.mjs index eab0ab64..cf31a70f 100644 --- a/module/data/item/weapon.mjs +++ b/module/data/item/weapon.mjs @@ -167,15 +167,13 @@ export default class DHWeapon extends AttachableItem { * Generates a list of localized tags based on this item's type-specific properties. * @returns {string[]} An array of localized tag strings. */ - getTags() { + _getTags() { const { attack, burden } = this; - const tags = []; - - const traitTag = game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${attack.roll.trait}.name`); - const rangeTag = game.i18n.localize(`DAGGERHEART.CONFIG.Range.${attack.range}.name`); - const burdenTag = game.i18n.localize(`DAGGERHEART.CONFIG.Burden.${burden}`); - - tags.push(traitTag, rangeTag, burdenTag); + const tags = [ + game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${attack.roll.trait}.name`), + game.i18n.localize(`DAGGERHEART.CONFIG.Range.${attack.range}.name`), + game.i18n.localize(`DAGGERHEART.CONFIG.Burden.${burden}`) + ]; for (const { value, type } of attack.damage.parts) { const parts = [value.dice]; @@ -184,14 +182,13 @@ export default class DHWeapon extends AttachableItem { if (type.size > 0) { const typeTags = Array.from(type) .map(t => game.i18n.localize(`DAGGERHEART.CONFIG.DamageType.${t}.abbreviation`)) - .join(" | "); + .join(' | '); parts.push(` (${typeTags})`); // Add a space in front and put it inside a (). } - tags.push(parts.join("")); + tags.push(parts.join('')); } - return tags; } @@ -199,12 +196,13 @@ export default class DHWeapon extends AttachableItem { * Generate a localized label array for this item subtype. * @returns {(string | { value: string, icons: string[] })[]} An array of localized strings and damage label objects. */ - getLabels() { - const labels = []; - + _getLabels() { const { roll, range, damage } = this.attack; - labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${roll.trait}.short`)); - labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.short`)); + + const labels = [ + game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${roll.trait}.short`), + game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.short`) + ]; for (const { value, type } of damage.parts) { const str = [value.dice]; @@ -214,7 +212,7 @@ export default class DHWeapon extends AttachableItem { .map(t => CONFIG.DH.GENERAL.damageTypes[t]?.icon) .filter(Boolean); - const labelValue = str.join(""); + const labelValue = str.join(''); if (icons.length === 0) { labels.push(labelValue); } else { @@ -224,7 +222,4 @@ export default class DHWeapon extends AttachableItem { return labels; } - - - } diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 5d45e2e1..07dacb2f 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -1,6 +1,12 @@ import { itemAbleRollParse } from '../helpers/utils.mjs'; -export default class DhActiveEffect extends ActiveEffect { +export default class DhActiveEffect extends foundry.documents.ActiveEffect { + + /* -------------------------------------------- */ + /* Properties */ + /* -------------------------------------------- */ + + /**@override */ get isSuppressed() { // If this is a copied effect from an attachment, never suppress it // (These effects have attachmentSource metadata) @@ -41,14 +47,11 @@ export default class DhActiveEffect extends ActiveEffect { }); } - get localizedStatuses() { - const statusMap = new Map(foundry.CONFIG.statusEffects.map(status => [status.id, status.name])); - return this.statuses.map(x => ({ - key: x, - name: game.i18n.localize(statusMap.get(x)) - })); - } + /* -------------------------------------------- */ + /* Event Handlers */ + /* -------------------------------------------- */ + /**@inheritdoc*/ async _preCreate(data, options, user) { const update = {}; if (!data.img) { @@ -62,13 +65,22 @@ export default class DhActiveEffect extends ActiveEffect { await super._preCreate(data, options, user); } + /* -------------------------------------------- */ + /* Methods */ + /* -------------------------------------------- */ + + /**@inheritdoc*/ static applyField(model, change, field) { const evalValue = this.effectSafeEval(itemAbleRollParse(change.value, model, change.effect.parent)); change.value = evalValue ?? change.value; super.applyField(model, change, field); } - /* Altered Foundry safeEval to allow non-numeric returns */ + /** + * Altered Foundry safeEval to allow non-numeric return + * @param {string} expression + * @returns + */ static effectSafeEval(expression) { let result; try { @@ -82,6 +94,24 @@ export default class DhActiveEffect extends ActiveEffect { return result; } + /** + * Generates a list of localized tags based on this item's type-specific properties. + * @returns {string[]} An array of localized tag strings. + */ + _getTags() { + const tags = [ + `${game.i18n.localize(this.parent.system.metadata.label)}: ${this.parent.name}`, + game.i18n.localize(this.isTemporary ? 'DAGGERHEART.EFFECTS.Duration.temporary' : 'DAGGERHEART.EFFECTS.Duration.passive') + ]; + + for (const statusId of this.statuses) { + const status = CONFIG.statusEffects.find(s => s.id === statusId); + tags.push(game.i18n.localize(status.name)); + } + + return tags; + } + async toChat(origin) { const cls = getDocumentClass('ChatMessage'); const systemData = { diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index ac9ac9e7..2bfbc3c2 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -237,7 +237,7 @@ export const updateActorTokens = async (actor, update) => { * Retrieves a Foundry document associated with the nearest ancestor element * that has a `data-item-uuid` attribute. * @param {HTMLElement} element - The DOM element to start the search from. - * @returns {foundry.abstract.Document|null} The resolved document, or null if not found or invalid. + * @returns {Promise} The resolved document, or null if not found or invalid. */ export async function getDocFromElement(element) { const target = element.closest('[data-item-uuid]'); diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index 5813a6b5..b114cf0a 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -15,8 +15,8 @@ Parameters: - showActions {boolean} : If true show feature's actions. --}} -
  • +
  • {{!-- Image --}}
    {{localize item.name}}
    - {{!-- Attack Block Start --}} + {{!-- Attack Tags Start --}} {{#if (eq type 'attack')}}
    @@ -42,106 +42,35 @@ Parameters: {{localize 'DAGGERHEART.CONFIG.ActionType.action'}}
    - {{/if}} - {{!-- Attack Block End --}} - - {{!-- Weapon Block Start --}} - {{#if (eq type 'weapon')}} - {{#if (not hideTags)}} -
    - {{#each item.getTags as |tag|}} -
    - {{tag}} -
    - {{/each}} -
    - {{else if (not hideLabels)}} -
    - {{#each item.getLabels as |label|}} -
    - {{ifThen label.value label.value label}} - {{log label.icons}} - {{#each label.icons as |icon|}} - + {{!-- Attack Tags End --}} + {{else}} + {{#with item}} + {{#if (not ../hideTags)}} +
    + {{#each this._getTags as |tag|}} +
    + {{tag}} +
    {{/each}} +
    + {{else if (not ../hideLabels)}} +
    +
    + {{#each this._getLabels as |label|}} + {{ifThen label.value label.value label}} + {{#each label.icons as |icon|}} + + {{/each}} + {{#if (not @last)}} + - + {{/if}} + {{/each}} +
    +
    + {{/if}} + {{/with}} + {{/if}} - {{#if (not @last)}} - - - {{/if}} -
    - {{/each}} -
    - {{/if}} - {{/if}} - {{!-- Weapon Block End --}} - - {{!-- Armor Block Start --}} - {{#if (eq type 'armor')}} - {{#if (not hideTags)}} -
    -
    {{localize "DAGGERHEART.ITEMS.Armor.baseScore"}}: {{item.system.baseScore}}
    -
    - {{localize "DAGGERHEART.ITEMS.Armor.baseThresholds.base"}}: - {{item.system.baseThresholds.major}} / {{item.system.baseThresholds.severe}} -
    -
    - {{else if (not hideLabels)}} -
    -
    - {{localize "DAGGERHEART.ITEMS.Armor.baseScore"}}: {{item.system.baseScore}} -
    -
    - {{/if}} - {{/if}} - {{!-- Armor Block End --}} - - {{!-- Domain Card Block Start --}} - {{#if (eq type 'domainCard')}} - {{#if (not hideTags)}} -
    -
    {{localize (concat 'DAGGERHEART.CONFIG.DomainCardTypes.' item.system.type)}}
    -
    {{localize (concat 'DAGGERHEART.GENERAL.Domain.' item.system.domain '.label')}}
    -
    - {{localize "DAGGERHEART.ITEMS.DomainCard.recallCost"}}: - {{item.system.recallCost}} -
    -
    - {{else if (not hideLabels)}} -
    -
    - {{localize (concat 'DAGGERHEART.CONFIG.DomainCardTypes.' item.system.type)}} - - {{localize (concat 'DAGGERHEART.GENERAL.Domain.' item.system.domain '.label')}} - - {{item.system.recallCost}} - -
    -
    - {{/if}} - {{/if}} - {{!-- Domain Card Block End --}} - - {{!-- Effect Block Start --}} - {{#if (eq type 'effect')}} - {{#if (not hideTags)}} -
    -
    - {{localize item.parent.system.metadata.label}}: {{item.parent.name}} -
    -
    - {{#if item.duration.duration}} - {{localize 'DAGGERHEART.EFFECTS.Duration.temporary'}} - {{else}} - {{localize 'DAGGERHEART.EFFECTS.Duration.passive'}} - {{/if}} -
    - {{#each item.localizedStatuses as |status|}} -
    {{status.name}}
    - {{/each}} -
    - {{else if (not hideLabels)}} - {{!-- Empty --}} - {{/if}} - {{/if}} - {{!-- Effect Block End --}} {{!-- Action Block Start --}} {{#if (eq type 'action')}} @@ -233,4 +162,4 @@ Parameters:
    {{/if}} -
  • + \ No newline at end of file