Merge branch 'main' into release

This commit is contained in:
WBHarry 2026-03-27 08:27:10 +01:00
commit 3a4b66f487
13 changed files with 87 additions and 9 deletions

View file

@ -3,6 +3,7 @@ import * as applications from './module/applications/_module.mjs';
import * as data from './module/data/_module.mjs';
import * as models from './module/data/_module.mjs';
import * as documents from './module/documents/_module.mjs';
import { macros } from './module/_module.mjs';
import * as collections from './module/documents/collections/_module.mjs';
import * as dice from './module/dice/_module.mjs';
import * as fields from './module/data/fields/_module.mjs';
@ -93,6 +94,7 @@ Hooks.once('init', () => {
data,
models,
documents,
macros,
dice,
fields
};

View file

@ -2486,6 +2486,14 @@
"secondaryWeapon": "Secondary Weapon"
}
},
"MACROS": {
"Spotlight": {
"errors": {
"noActiveCombat": "There is no active encounter",
"noCombatantSelected": "A combatant token must be either selected or hovered to spotlight it"
}
}
},
"ROLLTABLES": {
"FIELDS": {
"formulaName": { "label": "Formula Name" }
@ -2725,6 +2733,12 @@
"setResourceIdentifier": "Set Resource Identifier"
}
},
"Keybindings": {
"spotlight": {
"name": "Spotlight Combatant",
"hint": "Move the spotlight to a hovered or selected token that's present in an active encounter"
}
},
"Menu": {
"title": "Daggerheart Game Settings",
"automation": {

View file

@ -7,3 +7,4 @@ export * as documents from './documents/_module.mjs';
export * as enrichers from './enrichers/_module.mjs';
export * as helpers from './helpers/_module.mjs';
export * as systemRegistration from './systemRegistration/_module.mjs';
export * as macros from './macros/_modules.mjs';

View file

@ -91,7 +91,6 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica
const effects = DhEffectsDisplay.getTokenEffects();
const effect = effects.find(x => x.id === element.dataset.effectId);
await effect.delete();
this.render();
}
setupHooks() {

View file

@ -1,3 +1,7 @@
export const keybindings = {
spotlight: 'DHSpotlight'
};
export const menu = {
Automation: {
Name: 'GameSettingsAutomation',

View file

@ -660,7 +660,6 @@ export default class DhCharacter extends DhCreature {
prepareDerivedData() {
super.prepareDerivedData();
let baseHope = this.resources.hope.value;
if (this.companion) {
for (let levelKey in this.companion.system.levelData.levelups) {
const level = this.companion.system.levelData.levelups[levelKey];
@ -675,7 +674,6 @@ export default class DhCharacter extends DhCreature {
}
this.resources.hope.max -= this.scars;
this.resources.hope.value = Math.min(baseHope, this.resources.hope.max);
this.attack.roll.trait = this.rules.attack.roll.trait ?? this.attack.roll.trait;
this.resources.armor = {

View file

@ -60,4 +60,14 @@ export default class DhCreature extends BaseDataActor {
}
}
}
prepareDerivedData() {
const minLimitResource = resource => {
if (resource) resource.value = Math.min(resource.value, resource.max);
};
minLimitResource(this.resources.stress);
minLimitResource(this.resources.hitPoints);
minLimitResource(this.resources.hope);
}
}

View file

@ -88,14 +88,15 @@ class ResourcesField extends fields.TypedObjectField {
* This returns the element if its a valid resource key and overwrites the element's label for that retrieval.
*/
_getField(path) {
if ( path.length === 0 ) return this;
if (path.length === 0) return this;
const first = path.shift();
if (first === this.element.name) return this.element_getField(path);
const resources = CONFIG.DH.RESOURCE[this.actorType].all;
if (first in resources) {
this.element.label = resources[first].label;
return this.element._getField(path);
const field = this.element._getField(path);
field.label = resources[first].label;
return field;
}
return undefined;

View file

@ -29,6 +29,18 @@ export default class DhpActor extends Actor {
return this.system.metadata.isNPC;
}
prepareData() {
super.prepareData();
// Update effects if it is the user's character or is controlled
if (canvas.ready) {
const controlled = canvas.tokens.controlled.some((t) => t.actor === this);
if (game.user.character === this || controlled) {
ui.effectsDisplay.render();
}
}
}
/* -------------------------------------------- */
/** @inheritDoc */

View file

@ -0,0 +1 @@
export { default as spotlightCombatant } from './spotlightCombatant.mjs';

View file

@ -0,0 +1,21 @@
/**
* Spotlights a combatant.
* The combatant can be selected in a number of ways. If many are applied at the same time, the following order is used:
* 1) SelectedCombatant
* 2) HoveredCombatant
*/
const spotlightCombatant = () => {
if (!game.combat)
return ui.notifications.error(game.i18n.localize('DAGGERHEART.MACROS.Spotlight.errors.noActiveCombat'));
const selectedCombatant = canvas.tokens.controlled.length > 0 ? canvas.tokens.controlled[0].combatant : null;
const hoveredCombatant = game.canvas.tokens.hover?.combatant;
const combatant = selectedCombatant ?? hoveredCombatant;
if (!combatant)
return ui.notifications.error(game.i18n.localize('DAGGERHEART.MACROS.Spotlight.errors.noCombatantSelected'));
ui.combat.setCombatantSpotlight(combatant.id);
};
export default spotlightCombatant;

View file

@ -18,6 +18,7 @@ import {
import { CompendiumBrowserSettings, DhTagTeamRoll } from '../data/_module.mjs';
export const registerDHSettings = () => {
registerKeyBindings();
registerMenuSettings();
registerMenus();
registerNonConfigSettings();
@ -33,6 +34,20 @@ export const registerDHSettings = () => {
});
};
export const registerKeyBindings = () => {
game.keybindings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.keybindings.spotlight, {
name: game.i18n.localize('DAGGERHEART.SETTINGS.Keybindings.spotlight.name'),
hint: game.i18n.localize('DAGGERHEART.SETTINGS.Keybindings.spotlight.hint'),
uneditable: [],
editable: [],
onDown: game.system.api.macros.spotlightCombatant,
onUp: () => {},
restricted: true,
reservedModifiers: [],
precedence: CONST.KEYBINDING_PRECEDENCE.NORMAL
});
};
const registerMenuSettings = () => {
game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules, {
scope: 'world',

View file

@ -2,7 +2,7 @@
"id": "daggerheart",
"title": "Daggerheart",
"description": "An unofficial implementation of the Daggerheart system",
"version": "1.9.5",
"version": "1.9.6",
"compatibility": {
"minimum": "13.346",
"verified": "13.351",