From 8b7a45541095b8c665ac9ffd4d841dd77e57fd23 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Sun, 8 Mar 2026 19:35:27 +0100 Subject: [PATCH] . --- daggerheart.mjs | 34 +++++++++- .../applications/sheets/actors/character.mjs | 12 ++-- module/config/actorConfig.mjs | 68 +++++++++++++++++-- module/data/actor/adversary.mjs | 6 +- module/data/actor/character.mjs | 30 +------- module/data/actor/companion.mjs | 6 +- module/data/actor/creature.mjs | 29 ++++++++ .../less/sheets/actors/character/header.less | 4 -- .../less/ux/tooltip/resource-management.less | 18 +++++ templates/sheets/actors/character/header.hbs | 2 +- templates/ui/tooltip/resourceManagement.hbs | 14 +++- 11 files changed, 162 insertions(+), 61 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index ac9772cd..0e19c563 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -102,7 +102,19 @@ Hooks.once('init', () => { initial: 0, max: 4, reverse: false, - label: 'Corruption' + label: 'Corruption', + images: { + full: { + value: 'icons/magic/fire/barrier-wall-explosion-orange.webp', + isPath: true, + isNotTransparent: true + }, + empty: { + value: 'icons/magic/fire/barrier-wall-flame-ring-blue.webp', + isPath: true, + isNotTransparent: true + } + } }; CONFIG.DH.ACTOR.characterResources.hunger = { @@ -110,7 +122,15 @@ Hooks.once('init', () => { initial: 0, max: 6, reverse: false, - label: 'Hunger' + label: 'Hunger', + images: { + full: { + value: 'fa-solid fa-burger' + }, + empty: { + value: 'fa-regular fa-burger' + } + } }; CONFIG.DH.ACTOR.characterResources.glitched = { @@ -118,7 +138,15 @@ Hooks.once('init', () => { initial: 0, max: 6, reverse: false, - label: 'Glitched' + label: 'Glitched', + images: { + full: { + value: 'fa-solid fa-robot' + }, + empty: { + value: 'fa-regular fa-robot' + } + } }; game.system.registeredTriggers = new game.system.api.data.RegisteredTriggers(); diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index fbe52578..f304a6ff 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -958,7 +958,9 @@ export default class CharacterSheet extends DHBaseActorSheet { id: resource.id, label: game.i18n.localize(resource.label), value: resourceData.value, - max: resourceData.max + max: resourceData.max, + fullIcon: resource.images?.full ?? { value: 'fa-solid fa-circle' }, + emptyIcon: resource.images?.empty ?? { value: 'fa-regular fa-circle' } }; return acc; @@ -999,11 +1001,11 @@ export default class CharacterSheet extends DHBaseActorSheet { const section = target.closest('.resource-section'); for (const element of section.querySelectorAll('.resource-value')) { if (Number.parseInt(element.dataset.value) <= value) { - element.querySelector('.fa-diamond').classList.remove('hidden'); - element.querySelector('.fa-circle').classList.add('hidden'); + element.querySelector('.full').classList.remove('hidden'); + element.querySelector('.empty').classList.add('hidden'); } else { - element.querySelector('.fa-diamond').classList.add('hidden'); - element.querySelector('.fa-circle').classList.remove('hidden'); + element.querySelector('.full').classList.add('hidden'); + element.querySelector('.empty').classList.remove('hidden'); } } } diff --git a/module/config/actorConfig.mjs b/module/config/actorConfig.mjs index ae92a893..7762c523 100644 --- a/module/config/actorConfig.mjs +++ b/module/config/actorConfig.mjs @@ -55,7 +55,20 @@ export const abilities = { } }; -const baseResources = { +/** + * Full custom typing: + * id + * initial + * max + * reverse + * label + * images { + * full { value, isPath, isNotTransparent } + * empty { value, isPath isNotTransparent } + * } + */ + +export const characterBaseResources = { hitPoints: { id: 'hitPoints', initial: 0, @@ -80,20 +93,63 @@ const baseResources = { } }; -export const characterBaseResources = { - ...baseResources -}; - export const characterResources = { ...characterBaseResources }; +export const adversaryBaseResources = { + hitPoints: { + id: 'hitPoints', + initial: 0, + max: 0, + reverse: true, + label: 'DAGGERHEART.GENERAL.HitPoints.plural', + maxLabel: 'DAGGERHEART.ACTORS.Character.maxHPBonus' + }, + stress: { + id: 'stress', + initial: 0, + max: 0, + reverse: true, + label: 'DAGGERHEART.GENERAL.stress' + } +}; + +export const adversaryResources = { + ...adversaryBaseResources +}; + +export const companionBaseResources = { + stress: { + id: 'stress', + initial: 0, + max: 0, + reverse: true, + label: 'DAGGERHEART.GENERAL.stress' + }, + hope: { + id: 'hope', + initial: 0, + min: 0, + reverse: false, + label: 'DAGGERHEART.GENERAL.hope' + } +}; + +export const companionResources = { + ...companionBaseResources +}; + export const getScrollingTextResources = actorType => ({ armor: { label: 'DAGGERHEART.GENERAL.armor', reverse: true }, - ...(actorType === 'character' ? characterResources : {}) + ...(actorType === 'character' + ? characterResources + : actorType === 'adversary' + ? adversaryResources + : companionResources) }); export const featureProperties = { diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index 0a446c15..62bed7c7 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -2,7 +2,7 @@ import DHAdversarySettings from '../../applications/sheets-configs/adversary-set import { ActionField } from '../fields/actionField.mjs'; import { commonActorRules } from './base.mjs'; import DhCreature from './creature.mjs'; -import { resourceField, bonusField } from '../fields/actorField.mjs'; +import { bonusField } from '../fields/actorField.mjs'; import { calculateExpectedValue, parseTermsFromSimpleFormula } from '../../helpers/utils.mjs'; import { adversaryExpectedDamage, adversaryScalingData } from '../../config/actorConfig.mjs'; @@ -65,10 +65,6 @@ export default class DhpAdversary extends DhCreature { label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold' }) }), - resources: new fields.SchemaField({ - hitPoints: resourceField(0, 0, 'DAGGERHEART.GENERAL.HitPoints.plural', true), - stress: resourceField(0, 0, 'DAGGERHEART.GENERAL.stress', true) - }), rules: new fields.SchemaField({ ...commonActorRules() }), diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 34b397e9..c606e17b 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -3,7 +3,7 @@ import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import DhLevelData from '../levelData.mjs'; import { commonActorRules } from './base.mjs'; import DhCreature from './creature.mjs'; -import { attributeField, resourceField, stressDamageReductionRule, bonusField } from '../fields/actorField.mjs'; +import { attributeField, stressDamageReductionRule, bonusField } from '../fields/actorField.mjs'; import { ActionField } from '../fields/actionField.mjs'; import DHCharacterSettings from '../../applications/sheets-configs/character-settings.mjs'; @@ -27,34 +27,6 @@ export default class DhCharacter extends DhCreature { return { ...super.defineSchema(), - resources: new fields.SchemaField({ - ...Object.values(CONFIG.DH.ACTOR.characterResources).reduce((acc, resource) => { - if (resource.max !== undefined) { - acc[resource.id] = resourceField( - resource.max, - resource.initial, - resource.label, - resource.reverse, - resource.maxLabel - ); - } else { - acc[resource.id] = new fields.SchemaField( - { - value: new fields.NumberField({ - initial: resource.initial, - min: resource.min, - integer: true, - label: resource.label - }), - isReversed: new fields.BooleanField({ initial: resource.reverse }) - }, - { label: resource.label } - ); - } - - return acc; - }, {}) - }), traits: new fields.SchemaField({ agility: attributeField('DAGGERHEART.CONFIG.Traits.agility.name'), strength: attributeField('DAGGERHEART.CONFIG.Traits.strength.name'), diff --git a/module/data/actor/companion.mjs b/module/data/actor/companion.mjs index 6f51b593..45bd8395 100644 --- a/module/data/actor/companion.mjs +++ b/module/data/actor/companion.mjs @@ -4,7 +4,7 @@ import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import { ActionField } from '../fields/actionField.mjs'; import { adjustDice, adjustRange } from '../../helpers/utils.mjs'; import DHCompanionSettings from '../../applications/sheets-configs/companion-settings.mjs'; -import { resourceField, bonusField } from '../fields/actorField.mjs'; +import { bonusField } from '../fields/actorField.mjs'; export default class DhCompanion extends DhCreature { static LOCALIZATION_PREFIXES = ['DAGGERHEART.ACTORS.Companion']; @@ -26,10 +26,6 @@ export default class DhCompanion extends DhCreature { return { ...super.defineSchema(), partner: new ForeignDocumentUUIDField({ type: 'Actor' }), - resources: new fields.SchemaField({ - stress: resourceField(3, 0, 'DAGGERHEART.GENERAL.stress', true), - hope: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.hope' }) - }), evasion: new fields.NumberField({ required: true, min: 1, diff --git a/module/data/actor/creature.mjs b/module/data/actor/creature.mjs index c8bf8448..33b47415 100644 --- a/module/data/actor/creature.mjs +++ b/module/data/actor/creature.mjs @@ -1,3 +1,4 @@ +import { resourceField } from '../fields/actorField.mjs'; import BaseDataActor from './base.mjs'; export default class DhCreature extends BaseDataActor { @@ -7,6 +8,34 @@ export default class DhCreature extends BaseDataActor { return { ...super.defineSchema(), + resources: new fields.SchemaField({ + ...Object.values(CONFIG.DH.ACTOR[`${this.metadata.type}Resources`]).reduce((acc, resource) => { + if (resource.max !== undefined) { + acc[resource.id] = resourceField( + resource.max, + resource.initial, + resource.label, + resource.reverse, + resource.maxLabel + ); + } else { + acc[resource.id] = new fields.SchemaField( + { + value: new fields.NumberField({ + initial: resource.initial, + min: resource.min, + integer: true, + label: resource.label + }), + isReversed: new fields.BooleanField({ initial: resource.reverse }) + }, + { label: resource.label } + ); + } + + return acc; + }, {}) + }), advantageSources: new fields.ArrayField(new fields.StringField(), { label: 'DAGGERHEART.ACTORS.Character.advantageSources.label', hint: 'DAGGERHEART.ACTORS.Character.advantageSources.hint' diff --git a/styles/less/sheets/actors/character/header.less b/styles/less/sheets/actors/character/header.less index a90e6a2e..58d09c47 100644 --- a/styles/less/sheets/actors/character/header.less +++ b/styles/less/sheets/actors/character/header.less @@ -138,10 +138,6 @@ align-items: center; gap: 4px; margin-right: 20px; - - .resource-manager { - color: light-dark(@dark-blue, @golden); - } } .downtime-section { diff --git a/styles/less/ux/tooltip/resource-management.less b/styles/less/ux/tooltip/resource-management.less index 57878662..9c07cd9a 100644 --- a/styles/less/ux/tooltip/resource-management.less +++ b/styles/less/ux/tooltip/resource-management.less @@ -32,6 +32,24 @@ .hidden { display: none; } + + img { + width: 18px; + height: 18px; + + &.empty { + opacity: 0.4; + } + + &.filter { + filter: @golden-filter; + } + + &.non-transparent { + border-radius: 50%; + border: 1px solid @golden; + } + } } } } diff --git a/templates/sheets/actors/character/header.hbs b/templates/sheets/actors/character/header.hbs index fec866a2..f4ad22d4 100644 --- a/templates/sheets/actors/character/header.hbs +++ b/templates/sheets/actors/character/header.hbs @@ -83,7 +83,7 @@ {{/times}} - + {{#if document.system.class.value}}
diff --git a/templates/ui/tooltip/resourceManagement.hbs b/templates/ui/tooltip/resourceManagement.hbs index 4030819a..bd7b8ce7 100644 --- a/templates/ui/tooltip/resourceManagement.hbs +++ b/templates/ui/tooltip/resourceManagement.hbs @@ -1,11 +1,19 @@
{{#each resources as |resource|}} -
+

{{resource.label}}

{{#times resource.max}} - - + {{#unless resource.fullIcon.isPath}} + + {{else}} + + {{/unless}} + {{#unless resource.emptyIcon.isPath}} + + {{else}} + + {{/unless}} {{/times}}