diff --git a/lang/en.json b/lang/en.json index f58cba35..71a9faee 100755 --- a/lang/en.json +++ b/lang/en.json @@ -1054,6 +1054,10 @@ "shortrest": "Short Rest", "longrest": "Long Rest" }, + "Resource": { + "single": "Resource", + "plural": "Resources" + }, "Tabs": { "details": "Details", "attack": "Attack", @@ -1139,6 +1143,14 @@ "value": "Value" }, "ITEMS": { + "FIELDS": { + "resource": { + "value": { "label": "Value" }, + "max": { "label": "Max" }, + "icon": { "label": "Icon" }, + "recovery": { "label": "Recovery" } + } + }, "Armor": { "baseScore": "Base Score", "baseThresholds": { diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index ae7ffbf9..2003bc4c 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -86,6 +86,17 @@ export default class CharacterSheet extends DHBaseActorSheet { } }; + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + + htmlElement.querySelectorAll('.inventory-item-resource').forEach(element => { + element.addEventListener('change', this.updateItemResource.bind(this)); + }); + htmlElement.querySelectorAll('.inventory-item-quantity').forEach(element => { + element.addEventListener('change', this.updateItemQuantity.bind(this)); + }); + } + /** @inheritDoc */ async _onRender(context, options) { await super._onRender(context, options); @@ -475,6 +486,28 @@ export default class CharacterSheet extends DHBaseActorSheet { } } + /* -------------------------------------------- */ + /* Application Listener Actions */ + /* -------------------------------------------- */ + async updateItemResource(event) { + const item = this.getItem(event.currentTarget); + if (!item) return; + + const value = item.system.resource.max + ? Math.min(Number(event.currentTarget.value), item.system.resource.max) + : event.currentTarget.value; + await item.update({ 'system.resource.value': value }); + this.render(); + } + + async updateItemQuantity(event) { + const item = this.getItem(event.currentTarget); + if (!item) return; + + await item.update({ 'system.quantity': event.currentTarget.value }); + this.render(); + } + /* -------------------------------------------- */ /* Application Clicks Actions */ /* -------------------------------------------- */ diff --git a/module/applications/sheets/items/feature.mjs b/module/applications/sheets/items/feature.mjs index a54c3bcb..ab2d8b04 100644 --- a/module/applications/sheets/items/feature.mjs +++ b/module/applications/sheets/items/feature.mjs @@ -21,6 +21,7 @@ export default class FeatureSheet extends DHBaseItemSheet { header: { template: 'systems/daggerheart/templates/sheets/items/feature/header.hbs' }, tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, description: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-description.hbs' }, + settings: { template: 'systems/daggerheart/templates/sheets/items/feature/settings.hbs' }, actions: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-actions.hbs', scrollable: ['.actions'] @@ -34,7 +35,7 @@ export default class FeatureSheet extends DHBaseItemSheet { /**@override */ static TABS = { primary: { - tabs: [{ id: 'description' }, { id: 'actions' }, { id: 'effects' }], + tabs: [{ id: 'description' }, { id: 'settings' }, { id: 'actions' }, { id: 'effects' }], initial: 'description', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index 87812431..513cc08e 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -11,12 +11,15 @@ const fields = foundry.data.fields; export default class BaseDataItem extends foundry.abstract.TypeDataModel { + static LOCALIZATION_PREFIXES = ['DAGGERHEART.ITEMS']; + /** @returns {ItemDataModelMetadata}*/ static get metadata() { return { label: 'Base Item', type: 'base', hasDescription: false, + hasResource: false, isQuantifiable: false, isInventoryItem: false }; @@ -29,20 +32,22 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { /** @inheritDoc */ static defineSchema() { - const schema = { - uses: new fields.SchemaField({ - value: new fields.NumberField({ nullable: true, initial: null }), + const schema = {}; + + if (this.metadata.hasDescription) schema.description = new fields.HTMLField({ required: true, nullable: true }); + + if (this.metadata.hasResource) { + schema.resource = new fields.SchemaField({ + value: new fields.NumberField({ integer: true, min: 0, nullable: true, initial: null }), max: new fields.NumberField({ nullable: true, initial: null }), - icon: new fields.StringField({ initial: 'fa-solid fa-hashtag' }), + icon: new fields.StringField(), recovery: new fields.StringField({ choices: CONFIG.DH.GENERAL.refreshTypes, initial: null, nullable: true }) - }) - }; - - if (this.metadata.hasDescription) schema.description = new fields.HTMLField({ required: true, nullable: true }); + }); + } if (this.metadata.isQuantifiable) schema.quantity = new fields.NumberField({ integer: true, initial: 1, min: 0, required: true }); diff --git a/module/data/item/domainCard.mjs b/module/data/item/domainCard.mjs index 3451a14a..89bbfb40 100644 --- a/module/data/item/domainCard.mjs +++ b/module/data/item/domainCard.mjs @@ -7,7 +7,8 @@ export default class DHDomainCard extends BaseDataItem { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Item.domainCard', type: 'domainCard', - hasDescription: true + hasDescription: true, + hasResource: true }); } diff --git a/module/data/item/feature.mjs b/module/data/item/feature.mjs index a5b5cb3c..b401bb18 100644 --- a/module/data/item/feature.mjs +++ b/module/data/item/feature.mjs @@ -7,7 +7,8 @@ export default class DHFeature extends BaseDataItem { return foundry.utils.mergeObject(super.metadata, { label: 'TYPES.Item.feature', type: 'feature', - hasDescription: true + hasDescription: true, + hasResource: true }); } diff --git a/module/helpers/handlebarsHelper.mjs b/module/helpers/handlebarsHelper.mjs index 1b6de2a5..27e116f7 100644 --- a/module/helpers/handlebarsHelper.mjs +++ b/module/helpers/handlebarsHelper.mjs @@ -1,7 +1,6 @@ export default class RegisterHandlebarsHelpers { static registerHelpers() { Handlebars.registerHelper({ - emptyObject: this.emptyObject, add: this.add, includes: this.includes, times: this.times, @@ -11,10 +10,6 @@ export default class RegisterHandlebarsHelpers { }); } - static emptyObject(a) { - return !a || typeof a !== 'object' || Object.keys(a).length === 0; - } - static add(a, b) { const aNum = Number.parseInt(a); const bNum = Number.parseInt(b); diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index e4cc1a2c..133dd7ef 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -5,6 +5,7 @@ export const preloadHandlebarsTemplates = async function () { 'systems/daggerheart/templates/sheets/global/partials/action-item.hbs', 'systems/daggerheart/templates/sheets/global/partials/domain-card-item.hbs', 'systems/daggerheart/templates/sheets/global/partials/inventory-fieldset-items.hbs', + 'systems/daggerheart/templates/sheets/global/partials/resource-section.hbs', 'systems/daggerheart/templates/components/card-preview.hbs', 'systems/daggerheart/templates/levelup/parts/selectable-card-preview.hbs', 'systems/daggerheart/templates/sheets/global/partials/feature-section-item.hbs', diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index 1786f6f9..beb57b16 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -67,28 +67,19 @@ } } - .item-tokens { + .item-resource { display: flex; - flex-direction: column; + align-items: center; + justify-content: end; gap: 4px; - .item-token { - display: flex; - align-items: center; - gap: 4px; + i { + flex: none; + font-size: 14px; + } - i { - flex: none; - font-size: 14px; - } - - input { - flex: 1; - - &::-webkit-outer-spin-button { - opacity: 1; - } - } + input { + flex: 1; } } diff --git a/templates/sheets/global/partials/inventory-item.hbs b/templates/sheets/global/partials/inventory-item.hbs index 41327096..39af0c51 100644 --- a/templates/sheets/global/partials/inventory-item.hbs +++ b/templates/sheets/global/partials/inventory-item.hbs @@ -1,7 +1,7 @@