diff --git a/lang/en.json b/lang/en.json index 857a9387..49655483 100755 --- a/lang/en.json +++ b/lang/en.json @@ -1125,6 +1125,7 @@ "examples": { "label": "Examples" }, "advantageOn": { "label": "Gain Advantage On" }, "tokenImg": { "label": "Token Image" }, + "tokenRingImg": { "label": "Subject Texture" }, "tokenSize": { "placeholder": "Using character dimensions", "height": { "label": "Height" }, diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 02e693d7..252f0af4 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -188,7 +188,17 @@ export default class CharacterSheet extends DHBaseActorSheet { * @param {HTMLElement} el * @returns {foundry.documents.Item?} */ - const getItem = el => this.actor.items.get(el.closest('[data-item-id]')?.dataset.itemId); + const getItem = element => { + const listElement = (element.target ?? element).closest('[data-item-id]'); + const itemId = listElement.dataset.itemId; + + switch (listElement.dataset.type) { + case 'effect': + return this.document.effects.get(itemId); + default: + return this.document.items.get(itemId); + } + }; return [ { @@ -372,7 +382,7 @@ export default class CharacterSheet extends DHBaseActorSheet { li.hidden = !(menu.has(item.id) && matchesSearch); } } - + /* -------------------------------------------- */ /* Filter Menus */ /* -------------------------------------------- */ diff --git a/module/applications/sheets/items/beastform.mjs b/module/applications/sheets/items/beastform.mjs index e3b72d01..194f3ab1 100644 --- a/module/applications/sheets/items/beastform.mjs +++ b/module/applications/sheets/items/beastform.mjs @@ -30,8 +30,17 @@ export default class BeastformSheet extends DHBaseItemSheet { }; /**@inheritdoc */ - async _preparePartContext(partId, context) { - await super._preparePartContext(partId, context); + async _prepareContext(_options) { + const context = await super._prepareContext(_options); + + context.document = context.document.toObject(); + context.document.effects = this.document.effects.map(effect => { + const data = effect.toObject(); + data.id = effect.id; + if (effect.type === 'beastform') data.mandatory = true; + + return data; + }); return context; } diff --git a/module/data/activeEffect/beastformEffect.mjs b/module/data/activeEffect/beastformEffect.mjs index 3aa25bef..6445f65d 100644 --- a/module/data/activeEffect/beastformEffect.mjs +++ b/module/data/activeEffect/beastformEffect.mjs @@ -10,6 +10,11 @@ export default class BeastformEffect extends foundry.abstract.TypeDataModel { base64: false, nullable: true }), + tokenRingImg: new fields.FilePathField({ + initial: 'icons/svg/mystery-man.svg', + categories: ['IMAGE'], + base64: false + }), tokenSize: new fields.SchemaField({ height: new fields.NumberField({ integer: true, nullable: true }), width: new fields.NumberField({ integer: true, nullable: true }) @@ -28,6 +33,11 @@ export default class BeastformEffect extends foundry.abstract.TypeDataModel { width: this.characterTokenData.tokenSize.width, texture: { src: this.characterTokenData.tokenImg + }, + ring: { + subject: { + texture: this.characterTokenData.tokenRingImg + } } }; diff --git a/module/data/item/beastform.mjs b/module/data/item/beastform.mjs index 2eb871ec..b7ea5cb9 100644 --- a/module/data/item/beastform.mjs +++ b/module/data/item/beastform.mjs @@ -3,7 +3,7 @@ import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayFie import BaseDataItem from './base.mjs'; export default class DHBeastform extends BaseDataItem { - static LOCALIZATION_PREFIXES = ['DAGGERHEART.Sheets.Beastform']; + static LOCALIZATION_PREFIXES = ['DAGGERHEART.ITEMS.Beastform']; /** @inheritDoc */ static get metadata() { @@ -29,12 +29,17 @@ export default class DHBeastform extends BaseDataItem { categories: ['IMAGE'], base64: false }), + tokenRingImg: new fields.FilePathField({ + initial: 'icons/svg/mystery-man.svg', + categories: ['IMAGE'], + base64: false + }), tokenSize: new fields.SchemaField({ height: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }), width: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }) }), examples: new fields.StringField(), - advantageOn: new fields.ArrayField(new fields.StringField()), + advantageOn: new fields.StringField(), features: new ForeignDocumentUUIDArrayField({ type: 'Item' }) }; } @@ -56,40 +61,54 @@ export default class DHBeastform extends BaseDataItem { 'Item', this.features.map(x => x.toObject()) ); - const effects = await this.parent.parent.createEmbeddedDocuments( + + const extraEffects = await this.parent.parent.createEmbeddedDocuments( 'ActiveEffect', - this.parent.effects.map(x => x.toObject()) + this.parent.effects.filter(x => x.type !== 'beastform').map(x => x.toObject()) ); - await this.parent.parent.createEmbeddedDocuments('ActiveEffect', [ - { - type: 'beastform', - name: game.i18n.localize('DAGGERHEART.ITEMS.Beastform.beastformEffect'), - img: 'icons/creatures/abilities/paw-print-pair-purple.webp', - system: { - isBeastform: true, - characterTokenData: { - tokenImg: this.parent.parent.prototypeToken.texture.src, - tokenSize: { - height: this.parent.parent.prototypeToken.height, - width: this.parent.parent.prototypeToken.width - } - }, - advantageOn: this.advantageOn, - featureIds: features.map(x => x.id), - effectIds: effects.map(x => x.id) - } + const beastformEffect = this.parent.effects.find(x => x.type === 'beastform'); + await beastformEffect.updateSource({ + system: { + characterTokenData: { + tokenImg: this.parent.parent.prototypeToken.texture.src, + tokenRingImg: this.parent.parent.prototypeToken.ring.subject.texture, + tokenSize: { + height: this.parent.parent.prototypeToken.height, + width: this.parent.parent.prototypeToken.width + } + }, + advantageOn: this.advantageOn, + featureIds: features.map(x => x.id), + effectIds: extraEffects.map(x => x.id) } - ]); + }); + + await this.parent.parent.createEmbeddedDocuments('ActiveEffect', [beastformEffect.toObject()]); await updateActorTokens(this.parent.parent, { height: this.tokenSize.height, width: this.tokenSize.width, texture: { src: this.tokenImg + }, + ring: { + subject: { + texture: this.tokenRingImg + } } }); return false; } + + _onCreate() { + this.parent.createEmbeddedDocuments('ActiveEffect', [ + { + type: 'beastform', + name: game.i18n.localize('DAGGERHEART.ITEMS.Beastform.beastformEffect'), + img: 'icons/creatures/abilities/paw-print-pair-purple.webp' + } + ]); + } } diff --git a/templates/sheets/global/tabs/tab-effects.hbs b/templates/sheets/global/tabs/tab-effects.hbs index 744ef8e1..94c2d316 100644 --- a/templates/sheets/global/tabs/tab-effects.hbs +++ b/templates/sheets/global/tabs/tab-effects.hbs @@ -17,7 +17,7 @@ {{effect.name}}
{{/each}} diff --git a/templates/sheets/items/beastform/settings.hbs b/templates/sheets/items/beastform/settings.hbs index 78af825f..dec7d134 100644 --- a/templates/sheets/items/beastform/settings.hbs +++ b/templates/sheets/items/beastform/settings.hbs @@ -8,11 +8,7 @@ {{formGroup systemFields.examples value=source.system.examples localize=true}} - + {{formGroup systemFields.advantageOn value=source.system.advantageOn localize=true}}