diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index bf2bd245..fc819e66 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -340,10 +340,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl }) }; context.traits.nrTotal = Object.keys(context.traits.values).length; - context.traits.nrSelected = Object.values(context.traits.values).reduce( - (acc, trait) => acc + (trait.value !== null ? 1 : 0), - 0 - ); + context.traits.nrSelected = this.getNrSelectedTrait(); context.experience = { values: this.setup.experiences, @@ -397,6 +394,10 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl choiceA: { suggestions: suggestions.inventory.choiceA, compendium: 'consumables' }, choiceB: { suggestions: suggestions.inventory.choiceB, compendium: 'general-items' } }; + context.noInventoryChoices = + suggestions.inventory.take.length === 0 && + suggestions.inventory.choiceA?.length === 0 && + suggestions.inventory.choiceB?.length === 0; break; } @@ -427,7 +428,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl case 5: return Object.values(this.setup.experiences).every(x => x.name) ? 6 : 5; case 4: - return Object.values(this.setup.traits).every(x => x.value !== null) ? 5 : 4; + return this.getNrSelectedTrait() === 6 ? 5 : 4; case 3: return this.setup.class.uuid && this.setup.subclass.uuid ? 4 : 3; case 2: @@ -437,6 +438,18 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl } } + getNrSelectedTrait() { + const traitCompareArray = [ + ...game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).traitArray + ]; + return Object.values(this.setup.traits).reduce((acc, x) => { + const index = traitCompareArray.indexOf(x.value); + traitCompareArray.splice(index, 1); + acc += index !== -1; + return acc; + }, 0); + } + async getEquipmentSuggestions(choiceA, choiceB) { if (!this.setup.class.uuid) return { inventory: { take: [] } }; @@ -448,10 +461,15 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl ? { ...characterGuide.suggestedSecondaryWeapon, uuid: characterGuide.suggestedSecondaryWeapon.uuid } : null, inventory: { - take: inventory.take ?? [], + take: inventory.take?.filter(x => x) ?? [], choiceA: - inventory.choiceA?.map(x => ({ ...x, uuid: x.uuid, selected: x.uuid === choiceA?.uuid })) ?? [], - choiceB: inventory.choiceB?.map(x => ({ ...x, uuid: x.uuid, selected: x.uuid === choiceB?.uuid })) ?? [] + inventory.choiceA + ?.filter(x => x) + .map(x => ({ ...x, uuid: x.uuid, selected: x.uuid === choiceA?.uuid })) ?? [], + choiceB: + inventory.choiceB + ?.filter(x => x) + .map(x => ({ ...x, uuid: x.uuid, selected: x.uuid === choiceB?.uuid })) ?? [] } }; } @@ -525,7 +543,10 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl name: this.setup.ancestryName ?? this.setup.primaryAncestry.name, system: { ...this.setup.primaryAncestry.system, - features: [primaryAncestryFeature.uuid, secondaryAncestryFeature.uuid] + features: [ + { type: 'primary', item: primaryAncestryFeature.uuid }, + { type: 'secondary', item: secondaryAncestryFeature.uuid } + ] } }; @@ -554,7 +575,10 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl await this.character.createEmbeddedDocuments('Item', [this.equipment.inventory.choiceA]); if (this.equipment.inventory.choiceB.uuid) await this.character.createEmbeddedDocuments('Item', [this.equipment.inventory.choiceB]); - await this.character.createEmbeddedDocuments('Item', this.setup.class.system.inventory.take); + await this.character.createEmbeddedDocuments( + 'Item', + this.setup.class.system.inventory.take.filter(x => x) + ); await this.character.update({ system: { diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 6597f130..92653df4 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -341,7 +341,20 @@ export default function DHApplicationMixin(Base) { { name: 'CONTROLS.CommonEdit', icon: 'fa-solid fa-pen-to-square', - callback: target => getDocFromElement(target).sheet.render({ force: true }) + callback: async target => { + const doc = getDocFromElement(target); + const appId = this.element.id; + doc.apps[appId] = this; + const app = await doc.sheet.render({ force: true }); + app.addEventListener( + 'close', + () => { + delete doc.apps[appId]; + }, + { once: true } + ); + return; + } } ]; @@ -496,9 +509,21 @@ export default function DHApplicationMixin(Base) { * Renders an embedded document. * @type {ApplicationClickAction} */ - static #editDoc(_event, target) { + static async #editDoc(_event, target) { const doc = getDocFromElement(target); - if (doc) return doc.sheet.render({ force: true }); + if (doc) { + const appId = this.element.id; + doc.apps[appId] = this; + const app = await doc.sheet.render({ force: true }); + app.addEventListener( + 'close', + () => { + delete doc.apps[appId]; + }, + { once: true } + ); + return; + } // TODO: REDO this const { actionId } = target.closest('[data-action-id]').dataset; diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs index 1888be9e..f8eb5fa3 100644 --- a/module/applications/sheets/api/base-item.mjs +++ b/module/applications/sheets/api/base-item.mjs @@ -178,13 +178,15 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { static async #addFeature(_, target) { const { type } = target.dataset; const cls = foundry.documents.Item.implementation; - const feature = await cls.create({ - 'type': 'feature', - 'name': cls.defaultName({ type: 'feature' }), - 'system.subType': CONFIG.DH.ITEM.featureSubTypes[type] + const item = await cls.create({ + type: 'feature', + name: cls.defaultName({ type: 'feature' }) }); await this.document.update({ - 'system.features': [...this.document.system.features, feature].map(f => f.uuid) + 'system.features': [...this.document.system.features, { type, item }].map(x => ({ + ...x, + item: x.item?.uuid + })) }); } @@ -192,12 +194,14 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { * Remove a feature from the item. * @type {ApplicationClickAction} */ - static async #deleteFeature(_, target) { + static async #deleteFeature(_, element) { + const target = element.closest('[data-item-uuid]'); const feature = getDocFromElement(target); if (!feature) return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); - await feature.update({ 'system.subType': null }); await this.document.update({ - 'system.features': this.document.system.features.map(x => x.uuid).filter(uuid => uuid !== feature.uuid) + 'system.features': this.document.system.features + .filter(x => target.dataset.type !== x.type || x.item.uuid !== feature.uuid) + .map(x => ({ ...x, item: x.item.uuid })) }); } @@ -270,10 +274,15 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); if (data.fromInternal) return; + const target = event.target.closest('fieldset.drop-section'); const item = await fromUuid(data.uuid); if (item?.type === 'feature') { - const current = this.document.system.features.map(x => x.uuid); - await this.document.update({ 'system.features': [...current, item.uuid] }); + await this.document.update({ + 'system.features': [...this.document.system.features, { type: target.dataset.type, item }].map(x => ({ + ...x, + item: x.item?.uuid + })) + }); } } } diff --git a/module/applications/sheets/items/ancestry.mjs b/module/applications/sheets/items/ancestry.mjs index fc0b8a52..d806d39f 100644 --- a/module/applications/sheets/items/ancestry.mjs +++ b/module/applications/sheets/items/ancestry.mjs @@ -3,12 +3,7 @@ import DHHeritageSheet from '../api/heritage-sheet.mjs'; export default class AncestrySheet extends DHHeritageSheet { /**@inheritdoc */ static DEFAULT_OPTIONS = { - classes: ['ancestry'], - actions: { - editFeature: AncestrySheet.#editFeature, - removeFeature: AncestrySheet.#removeFeature - }, - dragDrop: [{ dragSelector: null, dropSelector: '.tab.features .drop-section' }] + classes: ['ancestry'] }; /**@inheritdoc */ @@ -18,40 +13,6 @@ export default class AncestrySheet extends DHHeritageSheet { features: { template: 'systems/daggerheart/templates/sheets/items/ancestry/features.hbs' } }; - /* -------------------------------------------- */ - /* Application Clicks Actions */ - /* -------------------------------------------- */ - - /** - * Edit an existing feature on the item - * @type {ApplicationClickAction} - */ - static async #editFeature(_event, button) { - const target = button.closest('.feature-item'); - const feature = this.document.system[`${target.dataset.type}Feature`]; - if (!feature || Object.keys(feature).length === 0) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); - return; - } - - feature.sheet.render(true); - } - - /** - * Remove a feature from the item. - * @type {ApplicationClickAction} - */ - static async #removeFeature(event, button) { - event.stopPropagation(); - const target = button.closest('.feature-item'); - const feature = this.document.system[`${target.dataset.type}Feature`]; - - if (feature) await feature.update({ 'system.subType': null }); - await this.document.update({ - 'system.features': this.document.system.features.filter(x => x && x.uuid !== feature.uuid).map(x => x.uuid) - }); - } - /* -------------------------------------------- */ /* Application Drag/Drop */ /* -------------------------------------------- */ @@ -61,22 +22,12 @@ export default class AncestrySheet extends DHHeritageSheet { * @param {DragEvent} event - The drag event */ async _onDrop(event) { - event.stopPropagation(); - const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); + const target = event.target.closest('fieldset.drop-section'); + const typeField = + this.document.system[target.dataset.type === 'primary' ? 'primaryFeature' : 'secondaryFeature']; - const item = await fromUuid(data.uuid); - if (item?.type === 'feature') { - const subType = event.target.closest('.primary-feature') ? 'primary' : 'secondary'; - if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes[subType]) { - const error = subType === 'primary' ? 'featureNotPrimary' : 'featureNotSecondary'; - ui.notifications.warn(game.i18n.localize(`DAGGERHEART.UI.Notifications.${error}`)); - return; - } - - await item.update({ 'system.subType': subType }); - await this.document.update({ - 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] - }); + if (!typeField) { + super._onDrop(event); } } } diff --git a/module/applications/sheets/items/class.mjs b/module/applications/sheets/items/class.mjs index 1520844b..4244879c 100644 --- a/module/applications/sheets/items/class.mjs +++ b/module/applications/sheets/items/class.mjs @@ -87,69 +87,45 @@ export default class ClassSheet extends DHBaseItemSheet { 'system.subclasses': [...this.document.system.subclasses.map(x => x.uuid), item.uuid] }); } else if (item.type === 'feature') { - if (target.classList.contains('hope-feature')) { - if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.hope) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotHope')); - return; - } - - await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.hope }); - await this.document.update({ - 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] - }); - } else if (target.classList.contains('class-feature')) { - if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.class) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotClass')); - return; - } - - await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.class }); - await this.document.update({ - 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] - }); - } + super._onDrop(event); } else if (item.type === 'weapon') { if (target.classList.contains('primary-weapon-section')) { - if (!this.document.system.characterGuide.suggestedPrimaryWeapon && !item.system.secondary) + if (!item.system.secondary) await this.document.update({ 'system.characterGuide.suggestedPrimaryWeapon': item.uuid }); } else if (target.classList.contains('secondary-weapon-section')) { - if (!this.document.system.characterGuide.suggestedSecondaryWeapon && item.system.secondary) + if (item.system.secondary) await this.document.update({ 'system.characterGuide.suggestedSecondaryWeapon': item.uuid }); } } else if (item.type === 'armor') { if (target.classList.contains('armor-section')) { - if (!this.document.system.characterGuide.suggestedArmor) - await this.document.update({ - 'system.characterGuide.suggestedArmor': item.uuid - }); + await this.document.update({ + 'system.characterGuide.suggestedArmor': item.uuid + }); } } else if (target.classList.contains('choice-a-section')) { if (item.type === 'miscellaneous' || item.type === 'consumable') { - if (this.document.system.inventory.choiceA.length < 2) + const filteredChoiceA = this.document.system.inventory.choiceA; + if (filteredChoiceA.length < 2) await this.document.update({ - 'system.inventory.choiceA': [ - ...this.document.system.inventory.choiceA.map(x => x.uuid), - item.uuid - ] + 'system.inventory.choiceA': [...filteredChoiceA.map(x => x.uuid), item.uuid] }); } } else if (item.type === 'miscellaneous') { if (target.classList.contains('take-section')) { - if (this.document.system.inventory.take.length < 3) + const filteredTake = this.document.system.inventory.take.filter(x => x); + if (filteredTake.length < 3) await this.document.update({ - 'system.inventory.take': [...this.document.system.inventory.take.map(x => x.uuid), item.uuid] + 'system.inventory.take': [...filteredTake.map(x => x.uuid), item.uuid] }); } else if (target.classList.contains('choice-b-section')) { - if (this.document.system.inventory.choiceB.length < 2) + const filteredChoiceB = this.document.system.inventory.choiceB.filter(x => x); + if (filteredChoiceB.length < 2) await this.document.update({ - 'system.inventory.choiceB': [ - ...this.document.system.inventory.choiceB.map(x => x.uuid), - item.uuid - ] + 'system.inventory.choiceB': [...filteredChoiceB.map(x => x.uuid), item.uuid] }); } } @@ -167,7 +143,7 @@ export default class ClassSheet extends DHBaseItemSheet { static async #removeItemFromCollection(_event, element) { const { uuid, target } = element.dataset; const prop = foundry.utils.getProperty(this.document.system, target); - await this.document.update({ [`system.${target}`]: prop.filter(i => i.uuid !== uuid) }); + await this.document.update({ [`system.${target}`]: prop.filter(i => i.uuid !== uuid).map(x => x.uuid) }); } /** diff --git a/module/applications/sheets/items/subclass.mjs b/module/applications/sheets/items/subclass.mjs index 585bd6cb..8748f883 100644 --- a/module/applications/sheets/items/subclass.mjs +++ b/module/applications/sheets/items/subclass.mjs @@ -5,8 +5,7 @@ export default class SubclassSheet extends DHBaseItemSheet { static DEFAULT_OPTIONS = { classes: ['subclass'], position: { width: 600 }, - window: { resizable: false }, - actions: {} + window: { resizable: false } }; /**@override */ @@ -36,63 +35,4 @@ export default class SubclassSheet extends DHBaseItemSheet { labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; - - async _onDragStart(event) { - const featureItem = event.currentTarget.closest('.drop-section'); - - if (featureItem) { - const feature = this.document.system[featureItem.dataset.type]; - if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); - return; - } - - const featureData = { type: 'Item', data: { ...feature.toObject(), _id: null }, fromInternal: true }; - event.dataTransfer.setData('text/plain', JSON.stringify(featureData)); - event.dataTransfer.setDragImage(featureItem.querySelector('img'), 60, 0); - } - } - - async _onDrop(event) { - event.stopPropagation(); - - const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); - if (data.fromInternal) return; - - const item = await fromUuid(data.uuid); - const target = event.target.closest('fieldset.drop-section'); - if (item.type === 'feature') { - if (target.dataset.type === 'foundation') { - if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.foundation) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotFoundation')); - return; - } - - await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.foundation }); - await this.document.update({ - 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] - }); - } else if (target.dataset.type === 'specialization') { - if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.specialization) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotSpecialization')); - return; - } - - await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.specialization }); - await this.document.update({ - 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] - }); - } else if (target.dataset.type === 'mastery') { - if (item.system.subType && item.system.subType !== CONFIG.DH.ITEM.featureSubTypes.mastery) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureNotMastery')); - return; - } - - await item.update({ 'system.subType': CONFIG.DH.ITEM.featureSubTypes.mastery }); - await this.document.update({ - 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] - }); - } - } - } } diff --git a/module/data/fields/foreignDocumentUUIDField.mjs b/module/data/fields/foreignDocumentUUIDField.mjs index 0efa60da..d328f073 100644 --- a/module/data/fields/foreignDocumentUUIDField.mjs +++ b/module/data/fields/foreignDocumentUUIDField.mjs @@ -23,15 +23,17 @@ export default class ForeignDocumentUUIDField extends foundry.data.fields.Docume /**@override */ initialize(value, _model, _options = {}) { if (this.idOnly) return value; - return () => { - try { - const doc = fromUuidSync(value); - return doc; - } catch (error) { - console.error(error); - return value ?? null; - } - }; + return () => ForeignDocumentUUIDField.getInitializedField(value); + } + + static getInitializedField(value) { + try { + const doc = fromUuidSync(value); + return doc; + } catch (error) { + console.error(error); + return value ?? null; + } } /**@override */ diff --git a/module/data/fields/itemLinkFields.mjs b/module/data/fields/itemLinkFields.mjs new file mode 100644 index 00000000..65b1cdd0 --- /dev/null +++ b/module/data/fields/itemLinkFields.mjs @@ -0,0 +1,19 @@ +import ForeignDocumentUUIDField from './foreignDocumentUUIDField.mjs'; + +export default class ItemLinkFields extends foundry.data.fields.ArrayField { + constructor(options, context) { + super(new ItemLinkField(), options, context); + } +} + +class ItemLinkField extends foundry.data.fields.SchemaField { + constructor(context) { + super( + { + type: new foundry.data.fields.StringField({ choices: CONFIG.DH.ITEM.featureSubTypes, nullable: true }), + item: new ForeignDocumentUUIDField({ type: 'Item' }) + }, + context + ); + } +} diff --git a/module/data/item/ancestry.mjs b/module/data/item/ancestry.mjs index 71b7683d..ecffcb1b 100644 --- a/module/data/item/ancestry.mjs +++ b/module/data/item/ancestry.mjs @@ -1,5 +1,5 @@ -import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; import BaseDataItem from './base.mjs'; +import ItemLinkFields from '../../data/fields/itemLinkFields.mjs'; export default class DHAncestry extends BaseDataItem { /** @inheritDoc */ @@ -15,23 +15,15 @@ export default class DHAncestry extends BaseDataItem { static defineSchema() { return { ...super.defineSchema(), - features: new ForeignDocumentUUIDArrayField({ type: 'Item' }) + features: new ItemLinkFields() }; } get primaryFeature() { - return ( - this.features.find(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.primary) ?? - (this.features.filter(x => !x).length > 0 ? {} : null) - ); + return this.features.find(x => x.type === CONFIG.DH.ITEM.featureSubTypes.primary)?.item; } get secondaryFeature() { - return ( - this.features.find(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.secondary) ?? - (this.features.filter(x => !x || x.system.subType === CONFIG.DH.ITEM.featureSubTypes.primary).length > 1 - ? {} - : null) - ); + return this.features.find(x => x.type === CONFIG.DH.ITEM.featureSubTypes.secondary)?.item; } } diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index 24e5e0cc..d4a3b9b6 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -124,12 +124,13 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { this.actor.createEmbeddedDocuments( 'Item', this.features.map(feature => ({ - ...feature, + ...(feature.item ?? feature), system: { - ...feature.system, + ...(feature.item?.system ?? feature.system), originItemType: this.parent.type, originId: data._id, - identifier: feature.identifier + identifier: feature.identifier, + subType: feature.item ? feature.type : undefined } })) ); diff --git a/module/data/item/class.mjs b/module/data/item/class.mjs index 4016a4c7..c18728fa 100644 --- a/module/data/item/class.mjs +++ b/module/data/item/class.mjs @@ -1,6 +1,7 @@ import BaseDataItem from './base.mjs'; import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; +import ItemLinkFields from '../fields/itemLinkFields.mjs'; export default class DHClass extends BaseDataItem { /** @inheritDoc */ @@ -27,7 +28,7 @@ export default class DHClass extends BaseDataItem { label: 'DAGGERHEART.GENERAL.HitPoints.plural' }), evasion: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.evasion' }), - features: new ForeignDocumentUUIDArrayField({ type: 'Item' }), + features: new ItemLinkFields(), subclasses: new ForeignDocumentUUIDArrayField({ type: 'Item', required: false }), inventory: new fields.SchemaField({ take: new ForeignDocumentUUIDArrayField({ type: 'Item', required: false }), @@ -52,17 +53,11 @@ export default class DHClass extends BaseDataItem { } get hopeFeatures() { - return ( - this.features.filter(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.hope) ?? - (this.features.filter(x => !x).length > 0 ? {} : null) - ); + return this.features.filter(x => x.type === CONFIG.DH.ITEM.featureSubTypes.hope).map(x => x.item); } get classFeatures() { - return ( - this.features.filter(x => x?.system?.subType === CONFIG.DH.ITEM.featureSubTypes.class) ?? - (this.features.filter(x => !x).length > 0 ? {} : null) - ); + return this.features.filter(x => x.type === CONFIG.DH.ITEM.featureSubTypes.class).map(x => x.item); } async _preCreate(data, options, user) { diff --git a/module/data/item/subclass.mjs b/module/data/item/subclass.mjs index e0a76092..b5073cbc 100644 --- a/module/data/item/subclass.mjs +++ b/module/data/item/subclass.mjs @@ -1,4 +1,4 @@ -import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; +import ItemLinkFields from '../fields/itemLinkFields.mjs'; import BaseDataItem from './base.mjs'; export default class DHSubclass extends BaseDataItem { @@ -22,22 +22,22 @@ export default class DHSubclass extends BaseDataItem { nullable: true, initial: null }), - features: new ForeignDocumentUUIDArrayField({ type: 'Item' }), + features: new ItemLinkFields(), featureState: new fields.NumberField({ required: true, initial: 1, min: 1 }), isMulticlass: new fields.BooleanField({ initial: false }) }; } get foundationFeatures() { - return this.features.filter(x => x.system.subType === CONFIG.DH.ITEM.featureSubTypes.foundation); + return this.features.filter(x => x.type === CONFIG.DH.ITEM.featureSubTypes.foundation).map(x => x.item); } get specializationFeatures() { - return this.features.filter(x => x.system.subType === CONFIG.DH.ITEM.featureSubTypes.specialization); + return this.features.filter(x => x.type === CONFIG.DH.ITEM.featureSubTypes.specialization).map(x => x.item); } get masteryFeatures() { - return this.features.filter(x => x.system.subType === CONFIG.DH.ITEM.featureSubTypes.mastery); + return this.features.filter(x => x.type === CONFIG.DH.ITEM.featureSubTypes.mastery).map(x => x.item); } async _preCreate(data, options, user) { diff --git a/templates/characterCreation/tabs/equipment.hbs b/templates/characterCreation/tabs/equipment.hbs index c66088a2..5c84d9d4 100644 --- a/templates/characterCreation/tabs/equipment.hbs +++ b/templates/characterCreation/tabs/equipment.hbs @@ -13,7 +13,7 @@ {{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.selectArmor"}} {{/"systems/daggerheart/templates/components/card-preview.hbs"}} - {{#if armor.suggestion}} + {{#if armor.suggestion.name}}