diff --git a/daggerheart.mjs b/daggerheart.mjs index a2f41735..795764cc 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -8,7 +8,7 @@ import RegisterHandlebarsHelpers from './module/helpers/handlebarsHelper.mjs'; import { enricherConfig, enricherRenderSetup } from './module/enrichers/_module.mjs'; import { getCommandTarget, rollCommandToJSON } from './module/helpers/utils.mjs'; import { NarrativeCountdowns } from './module/applications/ui/countdowns.mjs'; -import { DHRoll, DualityRoll, D20Roll, DamageRoll } from './module/dice/_module.mjs'; +import { BaseRoll, DHRoll, DualityRoll, D20Roll, DamageRoll } from './module/dice/_module.mjs'; import { enrichedDualityRoll } from './module/enrichers/DualityRollEnricher.mjs'; import { registerCountdownHooks } from './module/data/countdowns.mjs'; import { @@ -49,9 +49,7 @@ Hooks.once('init', () => { DamageRoll: DamageRoll }; - CONFIG.Dice.rolls = [...CONFIG.Dice.rolls, DHRoll, DualityRoll, D20Roll, DamageRoll]; - Roll.CHAT_TEMPLATE = 'systems/daggerheart/templates/ui/chat/foundryRoll.hbs'; - Roll.TOOLTIP_TEMPLATE = 'systems/daggerheart/templates/ui/chat/foundryRollTooltip.hbs'; + CONFIG.Dice.rolls = [BaseRoll, DHRoll, DualityRoll, D20Roll, DamageRoll]; CONFIG.MeasuredTemplate.objectClass = placeables.DhMeasuredTemplate; const { DocumentSheetConfig } = foundry.applications.apps; diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index 01256bcc..a5d9d8a6 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -68,6 +68,7 @@ export default class AdversarySheet extends DHBaseActorSheet { htmlElement.querySelectorAll('.inventory-item-resource').forEach(element => { element.addEventListener('change', this.updateItemResource.bind(this)); + element.addEventListener('click', e => e.stopPropagation()); }); } diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 78a77406..92f6239b 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -122,6 +122,7 @@ export default class CharacterSheet extends DHBaseActorSheet { htmlElement.querySelectorAll('.inventory-item-resource').forEach(element => { element.addEventListener('change', this.updateItemResource.bind(this)); + element.addEventListener('click', e => e.stopPropagation()); }); htmlElement.querySelectorAll('.inventory-item-quantity').forEach(element => { element.addEventListener('change', this.updateItemQuantity.bind(this)); diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 15b84cff..21f1feae 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -124,7 +124,7 @@ export default function DHApplicationMixin(Base) { } } ], - dragDrop: [], + dragDrop: [{ dragSelector: '.inventory-item[data-type="effect"]', dropSelector: null }], tagifyConfigs: [] }; @@ -289,14 +289,37 @@ export default function DHApplicationMixin(Base) { * @param {DragEvent} event * @protected */ - _onDragStart(event) {} + async _onDragStart(event) { + const inventoryItem = event.currentTarget.closest('.inventory-item'); + if (inventoryItem) { + const { type, itemUuid } = inventoryItem.dataset; + if (type === 'effect') { + const effect = await foundry.utils.fromUuid(itemUuid); + const effectData = { + type: 'ActiveEffect', + data: { ...effect.toObject(), _id: null }, + fromInternal: this.document.uuid + }; + event.dataTransfer.setData('text/plain', JSON.stringify(effectData)); + event.dataTransfer.setDragImage(inventoryItem.querySelector('img'), 60, 0); + } + } + } /** * Handle drop event. * @param {DragEvent} event * @protected */ - _onDrop(event) {} + _onDrop(event) { + event.stopPropagation(); + const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); + if (data.fromInternal === this.document.uuid) return; + + if (data.type === 'ActiveEffect') { + this.document.createEmbeddedDocuments('ActiveEffect', [data.data]); + } + } /* -------------------------------------------- */ /* Context Menu */ diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 33c5a0e2..930edf86 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -198,6 +198,8 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { }; event.dataTransfer.setData('text/plain', JSON.stringify(attackData)); event.dataTransfer.setDragImage(attackItem.querySelector('img'), 60, 0); + } else if (this.document.type !== 'environment') { + super._onDragStart(event); } } } diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs index b4af283b..e8103288 100644 --- a/module/applications/sheets/api/base-item.mjs +++ b/module/applications/sheets/api/base-item.mjs @@ -270,6 +270,8 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { }; event.dataTransfer.setData('text/plain', JSON.stringify(actionData)); event.dataTransfer.setDragImage(actionItem.querySelector('img'), 60, 0); + } else { + super._onDragStart(event); } } } @@ -279,6 +281,8 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { * @param {DragEvent} event - The drag event */ async _onDrop(event) { + super._onDrop(event); + const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); if (data.fromInternal) return; diff --git a/module/applications/sheets/api/item-attachment-sheet.mjs b/module/applications/sheets/api/item-attachment-sheet.mjs index 73c39923..2898f5ac 100644 --- a/module/applications/sheets/api/item-attachment-sheet.mjs +++ b/module/applications/sheets/api/item-attachment-sheet.mjs @@ -41,7 +41,7 @@ export default function ItemAttachmentSheet(Base) { } async _onDrop(event) { - const data = TextEditor.getDragEventData(event); + const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); const attachmentsSection = event.target.closest('.attachments-section'); if (!attachmentsSection) return super._onDrop(event); diff --git a/module/applications/sheets/items/ancestry.mjs b/module/applications/sheets/items/ancestry.mjs index c7796f9a..8c0a5620 100644 --- a/module/applications/sheets/items/ancestry.mjs +++ b/module/applications/sheets/items/ancestry.mjs @@ -27,6 +27,9 @@ export default class AncestrySheet extends DHHeritageSheet { * @param {DragEvent} event - The drag event */ async _onDrop(event) { + const data = TextEditor.getDragEventData(event); + if (data.type === 'ActiveEffect') return super._onDrop(event); + const target = event.target.closest('fieldset.drop-section'); const typeField = this.document.system[target.dataset.type === 'primary' ? 'primaryFeature' : 'secondaryFeature']; diff --git a/module/applications/sheets/items/class.mjs b/module/applications/sheets/items/class.mjs index 79a689d8..01f4249a 100644 --- a/module/applications/sheets/items/class.mjs +++ b/module/applications/sheets/items/class.mjs @@ -115,16 +115,17 @@ export default class ClassSheet extends DHBaseItemSheet { async _onDrop(event) { event.stopPropagation(); const data = TextEditor.getDragEventData(event); - const item = await fromUuid(data.uuid); + const item = data.data ?? (await fromUuid(data.uuid)); + const itemType = data.data ? data.type : item.type; const target = event.target.closest('fieldset.drop-section'); - if (item.type === 'subclass') { + if (itemType === 'subclass') { await this.document.update({ 'system.subclasses': [...this.document.system.subclasses.map(x => x.uuid), item.uuid] }); - } else if (item.type === 'feature') { + } else if (['feature', 'ActiveEffect'].includes(itemType)) { super._onDrop(event); } else if (this.document.parent?.type !== 'character') { - if (item.type === 'weapon') { + if (itemType === 'weapon') { if (target.classList.contains('primary-weapon-section')) { if (!item.system.secondary) await this.document.update({ @@ -136,21 +137,21 @@ export default class ClassSheet extends DHBaseItemSheet { 'system.characterGuide.suggestedSecondaryWeapon': item.uuid }); } - } else if (item.type === 'armor') { + } else if (itemType === 'armor') { if (target.classList.contains('armor-section')) { await this.document.update({ 'system.characterGuide.suggestedArmor': item.uuid }); } } else if (target.classList.contains('choice-a-section')) { - if (item.type === 'loot' || item.type === 'consumable') { + if (itemType === 'loot' || itemType === 'consumable') { const filteredChoiceA = this.document.system.inventory.choiceA; if (filteredChoiceA.length < 2) await this.document.update({ 'system.inventory.choiceA': [...filteredChoiceA.map(x => x.uuid), item.uuid] }); } - } else if (item.type === 'loot') { + } else if (itemType === 'loot') { if (target.classList.contains('take-section')) { const filteredTake = this.document.system.inventory.take.filter(x => x); if (filteredTake.length < 3) diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 31a85f52..4a803ae5 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -163,7 +163,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel const hasRoll = this.getUseHasRoll(byPass); return { event, - title: `${this.item.name}: ${this.name}`, + title: `${this.item.name}: ${game.i18n.localize(this.name)}`, source: { item: this.item._id, action: this._id, @@ -209,15 +209,15 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel } async consume(config, successCost = false) { - const actor= this.actor.system.partner ?? this.actor, + const actor = this.actor.system.partner ?? this.actor, usefulResources = { - ...foundry.utils.deepClone(actor.system.resources), - fear: { - value: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), - max: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, - reversed: false - } - }; + ...foundry.utils.deepClone(actor.system.resources), + fear: { + value: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), + max: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, + reversed: false + } + }; for (var cost of config.costs) { if (cost.keyIsID) { diff --git a/module/dice/_module.mjs b/module/dice/_module.mjs index f34f32d3..e6755a74 100644 --- a/module/dice/_module.mjs +++ b/module/dice/_module.mjs @@ -1,3 +1,4 @@ +export { default as BaseRoll } from './baseRoll.mjs'; export { default as D20Roll } from './d20Roll.mjs'; export { default as DamageRoll } from './damageRoll.mjs'; export { default as DHRoll } from './dhRoll.mjs'; diff --git a/module/dice/baseRoll.mjs b/module/dice/baseRoll.mjs new file mode 100644 index 00000000..4d065fff --- /dev/null +++ b/module/dice/baseRoll.mjs @@ -0,0 +1,7 @@ +export default class BaseRoll extends Roll { + /** @inheritdoc */ + static CHAT_TEMPLATE = 'systems/daggerheart/templates/ui/chat/foundryRoll.hbs'; + + /** @inheritdoc */ + static TOOLTIP_TEMPLATE = 'systems/daggerheart/templates/ui/chat/foundryRollTooltip.hbs'; +} diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index 79449bc0..c7f30e48 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -13,6 +13,10 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { /* We can change to fully implementing the renderHTML function if needed, instead of augmenting it. */ const html = await super.renderHTML({ actor: actorData, author: this.author }); + if (this.flags.core?.RollTable) { + html.querySelector('.roll-buttons.apply-buttons').remove(); + } + this.enrichChatMessage(html); this.addChatListeners(html); diff --git a/system.json b/system.json index d954c6d5..e6b7650f 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "1.0.5", + "version": "1.0.6", "compatibility": { "minimum": "13", "verified": "13.347", diff --git a/templates/ui/chat/foundryRoll.hbs b/templates/ui/chat/foundryRoll.hbs index a3c55a9e..8fc62219 100644 --- a/templates/ui/chat/foundryRoll.hbs +++ b/templates/ui/chat/foundryRoll.hbs @@ -8,7 +8,9 @@

{{total}}

-
- - -
\ No newline at end of file +{{#unless flags.core.RollTable}} +
+ + +
+{{/unless}} \ No newline at end of file diff --git a/templates/ui/tooltip/action.hbs b/templates/ui/tooltip/action.hbs index 20929bf3..a3020aff 100644 --- a/templates/ui/tooltip/action.hbs +++ b/templates/ui/tooltip/action.hbs @@ -1,5 +1,5 @@
-

{{item.name}}

+

{{localize item.name}}

{{{description}}}
{{#if item.uses.max}}