From 318d00b47d9173f52adf749aeeb83664f6bafd92 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Mon, 1 Jun 2026 10:24:44 +0200 Subject: [PATCH 1/3] Add NPC Improvements --- module/applications/sheets/actors/party.mjs | 15 +------ styles/less/sheets/actors/npc/header.less | 2 +- templates/sheets/actors/npc/header.hbs | 10 +++-- .../sheets/actors/party/party-members.hbs | 42 ++++++++++--------- 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/module/applications/sheets/actors/party.mjs b/module/applications/sheets/actors/party.mjs index cec1e1f0..927a8810 100644 --- a/module/applications/sheets/actors/party.mjs +++ b/module/applications/sheets/actors/party.mjs @@ -47,11 +47,6 @@ export default class Party extends DHBaseActorSheet { template: 'systems/daggerheart/templates/sheets/actors/party/party-members.hbs', scrollable: [''] }, - /* NOT YET IMPLEMENTED */ - // projects: { - // template: 'systems/daggerheart/templates/sheets/actors/party/projects.hbs', - // scrollable: [''] - // }, inventory: { template: 'systems/daggerheart/templates/sheets/actors/party/inventory.hbs', scrollable: ['.tab.inventory .items-section'] @@ -62,19 +57,13 @@ export default class Party extends DHBaseActorSheet { /** @inheritdoc */ static TABS = { primary: { - tabs: [ - { id: 'partyMembers' }, - /* NOT YET IMPLEMENTED */ - // { id: 'projects' }, - { id: 'inventory' }, - { id: 'notes' } - ], + tabs: [{ id: 'partyMembers' }, { id: 'inventory' }, { id: 'notes' }], initial: 'partyMembers', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; - static ALLOWED_ACTOR_TYPES = ['character', 'companion', 'adversary']; + static ALLOWED_ACTOR_TYPES = ['character', 'companion', 'adversary', 'npc']; static DICE_ROLL_ACTOR_TYPES = ['character']; async _onRender(context, options) { diff --git a/styles/less/sheets/actors/npc/header.less b/styles/less/sheets/actors/npc/header.less index d49d763c..086a254c 100644 --- a/styles/less/sheets/actors/npc/header.less +++ b/styles/less/sheets/actors/npc/header.less @@ -5,7 +5,7 @@ .portrait { cursor: pointer; - width: 275px; + max-width: 275px; img { height: 275px; diff --git a/templates/sheets/actors/npc/header.hbs b/templates/sheets/actors/npc/header.hbs index 8dc345dc..fce300da 100644 --- a/templates/sheets/actors/npc/header.hbs +++ b/templates/sheets/actors/npc/header.hbs @@ -31,10 +31,12 @@ {{{description}}} -
- {{localize 'DAGGERHEART.ACTORS.NPC.FIELDS.motives.label'}}: - {{source.system.motives}} -
+ {{#if source.system.motives}} +
+ {{localize 'DAGGERHEART.ACTORS.NPC.FIELDS.motives.label'}}: + {{source.system.motives}} +
+ {{/if}} \ No newline at end of file diff --git a/templates/sheets/actors/party/party-members.hbs b/templates/sheets/actors/party/party-members.hbs index c7870bc6..55cacb79 100644 --- a/templates/sheets/actors/party/party-members.hbs +++ b/templates/sheets/actors/party/party-members.hbs @@ -42,7 +42,7 @@ {{#if member.difficulty includeZero=true}}
{{member.difficulty}}
{{/if}} - {{#unless (eq member.type 'companion')}} + {{#unless (or (eq member.type 'companion') (eq member.type 'npc'))}}

{{localize "DAGGERHEART.ACTORS.Party.Thresholds.minor"}}

{{member.damageThresholds.major}}

@@ -58,7 +58,7 @@
- {{#unless (or (eq member.type 'companion') (eq member.type 'adversary')) }} + {{#unless (or (eq member.type 'companion') (eq member.type 'adversary') (eq member.type 'npc')) }}

{{localize "DAGGERHEART.GENERAL.hope"}}

{{#times member.resources.hope.max}} @@ -79,7 +79,7 @@
- {{#unless (eq member.type 'companion') }} + {{#unless (or (eq member.type 'companion') (eq member.type 'npc')) }}
@@ -101,25 +101,27 @@
{{/unless}} -
-
- - - - - {{member.resources.stress.value}} - / - {{member.resources.stress.max}} - -
-
- {{#times member.resources.stress.max}} - + {{#unless (eq member.type 'npc')}} +
+
+ + - {{/times}} + + {{member.resources.stress.value}} + / + {{member.resources.stress.max}} + +
+
+ {{#times member.resources.stress.max}} + + + {{/times}} +
-
+ {{/unless}} {{#if member.armorScore.max}}
From 98ce49b928196c931f315bf2be03e98150ddbb50 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Mon, 1 Jun 2026 05:06:24 -0400 Subject: [PATCH 2/3] Avoid default type on name and item create dialogs (#1958) --- daggerheart.mjs | 30 ++++++++++++++++++++++++++++++ module/documents/actor.mjs | 5 +++++ module/documents/item.mjs | 1 + 3 files changed, 36 insertions(+) diff --git a/daggerheart.mjs b/daggerheart.mjs index 23977628..25c41ced 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -446,3 +446,33 @@ Hooks.on('canvasTearDown', canvas => { Hooks.on('canvasReady', canas => { game.system.registeredTriggers.registerSceneTriggers(canvas.scene); }); + +/** Make the user to select a document type, instead of having a default doc type for them to accidentally keep */ +Hooks.on('renderDialogV2', (_dialog, html) => { + if (!html.classList.contains('dialog')) return; + const cls = html.classList.contains('item-create') + ? documents.DHItem.implementation + : html.classList.contains('actor-create') + ? documents.DhpActor.implementation + : null; + if (!cls) return; + + const form = html.querySelector('form'); + const submit = html.querySelector('button[type=submit]'); + const select = html.querySelector('select[name=type]'); + const nameInput = html.querySelector('input[name=name]'); + if (!form || !select || !submit || !nameInput) return; + + nameInput.placeholder = cls.defaultName({}); + const emptyOption = document.createElement('option'); + emptyOption.value = ''; + emptyOption.selected = true; + select.required = true; + select.prepend(emptyOption); + submit.addEventListener('click', event => { + if (!form.reportValidity()) { + event.preventDefault(); + event.stopPropagation(); + } + }); +}); diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 6c462d98..fb10435f 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -65,6 +65,11 @@ export default class DhpActor extends Actor { }; } + static createDialog(data, createOptions, options, renderOptions) { + options.classes = [options.classes ?? [], 'actor-create'].flat(); // handled in hook + return super.createDialog(data, createOptions, options, renderOptions); + } + /* -------------------------------------------- */ /** @inheritDoc */ diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 603ca594..f46e24e6 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -82,6 +82,7 @@ export default class DHItem extends foundry.documents.Item { /** @inheritdoc */ static async createDialog(data = {}, createOptions = {}, options = {}) { const { folders, types, template, context = {}, ...dialogOptions } = options; + dialogOptions.classes = [options.classes ?? [], 'item-create'].flat(); // handled in hook if (types?.length === 0) { throw new Error('The array of sub-types to restrict to must not be empty.'); From d0c29ede56b9834c4a71ac58656524b1996b724f Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Mon, 1 Jun 2026 12:24:00 +0200 Subject: [PATCH 3/3] Fixed so the combat tracker doesn't error out if a combatant has no attached token (#1960) --- module/applications/ui/combatTracker.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/applications/ui/combatTracker.mjs b/module/applications/ui/combatTracker.mjs index 0989bcb8..8dd76850 100644 --- a/module/applications/ui/combatTracker.mjs +++ b/module/applications/ui/combatTracker.mjs @@ -133,7 +133,7 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C canPing: combatant.sceneId === canvas.scene?.id && game.user.hasPermission('PING_CANVAS'), type: combatant.actor?.system?.type, img: await this._getCombatantThumbnail(combatant), - disposition: combatant.token.disposition + disposition: combatant.token?.disposition }; turn.css = [turn.active ? 'active' : null, hidden ? 'hide' : null, isDefeated ? 'defeated' : null].filterJoin(