From cf571aa2a50023b5bf174e4d93d7cfb7536b446c Mon Sep 17 00:00:00 2001 From: Psitacus <59754077+Psitacus@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:17:31 -0600 Subject: [PATCH 01/24] minor compendium qol changes, and a fix for rogue traits (#661) Co-authored-by: psitacus --- .../classes/class_Rogue_CvHlkHZfpMiCz5uT.json | 8 +++--- ...domainCard_Enrapture_a8lFiKX1o8T924ze.json | 25 +++++++++++-------- ...eature_Sparing_Touch_GfOSgVJW8bS1OjNq.json | 4 +-- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json b/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json index 307fd7b2..617ea0f0 100644 --- a/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json +++ b/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json @@ -49,8 +49,8 @@ "suggestedTraits": { "agility": 1, "strength": -1, - "finesse": 0, - "instinct": 2, + "finesse": 2, + "instinct": 0, "presence": 1, "knowledge": 0 }, @@ -76,8 +76,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754325275832, - "modifiedTime": 1754325686143, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754500637635, + "lastModifiedBy": "Q9NoTaEarn3VMS6Z" }, "_key": "!items!CvHlkHZfpMiCz5uT" } diff --git a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json index 145e63b5..fc87d922 100644 --- a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json +++ b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json @@ -31,7 +31,12 @@ "type": "any", "amount": null }, - "effects": [], + "effects": [ + { + "_id": "EYG5dLImk6GkmfRd", + "onSave": false + } + ], "roll": { "type": "spellcast", "trait": null, @@ -127,7 +132,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784451, - "modifiedTime": 1754340901029, + "modifiedTime": 1754500747453, "lastModifiedBy": "Q9NoTaEarn3VMS6Z" }, "_id": "a8lFiKX1o8T924ze", @@ -135,6 +140,10 @@ "effects": [ { "name": "Enraptured", + "img": "icons/magic/control/hypnosis-mesmerism-eye.webp", + "origin": "Compendium.daggerheart.domains.Item.a8lFiKX1o8T924ze", + "transfer": false, + "_id": "EYG5dLImk6GkmfRd", "type": "base", "system": { "rangeDependence": { @@ -144,8 +153,6 @@ "range": "melee" } }, - "_id": "FOQ2yqrpl2TPVxvt", - "img": "icons/magic/control/hypnosis-mesmerism-eye.webp", "changes": [], "disabled": false, "duration": { @@ -157,10 +164,8 @@ "startRound": null, "startTurn": null }, - "description": "

While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.

", - "origin": null, + "description": "

While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.

", "tint": "#ffffff", - "transfer": true, "statuses": [], "sort": 0, "flags": {}, @@ -171,11 +176,11 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "createdTime": 1754106690796, - "modifiedTime": 1754340886910, + "createdTime": 1754500747406, + "modifiedTime": 1754500810477, "lastModifiedBy": "Q9NoTaEarn3VMS6Z" }, - "_key": "!items.effects!a8lFiKX1o8T924ze.FOQ2yqrpl2TPVxvt" + "_key": "!items.effects!a8lFiKX1o8T924ze.EYG5dLImk6GkmfRd" } ], "ownership": { diff --git a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json index 832b5532..70d9b630 100644 --- a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json +++ b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json @@ -8,7 +8,7 @@ "description": "

Once per long rest, touch a creature and clear 2 Hit Points or 2 Stress from them.

", "resource": { "type": "simple", - "value": 0, + "value": 1, "max": "1", "icon": "", "recovery": "longRest" @@ -178,7 +178,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754353243691, - "modifiedTime": 1754353387422, + "modifiedTime": 1754500973073, "lastModifiedBy": "Q9NoTaEarn3VMS6Z" }, "_key": "!items!GfOSgVJW8bS1OjNq" From bcedc74bf388aaee1bfad864fb87590ab40db582 Mon Sep 17 00:00:00 2001 From: Dapoulp <74197441+Dapoulp@users.noreply.github.com> Date: Wed, 6 Aug 2025 20:28:53 +0200 Subject: [PATCH 02/24] Feature/635 allow weapon direct damage (#657) * #635 & #637 * #653 --- module/applications/dialogs/_module.mjs | 1 - .../dialogs/damageSelectionDialog.mjs | 128 ------------------ .../sheets/actors/environment.mjs | 6 +- .../sheets/api/application-mixin.mjs | 16 ++- module/applications/ui/chatLog.mjs | 7 +- module/data/action/attackAction.mjs | 4 +- module/data/action/baseAction.mjs | 28 ++-- module/data/action/beastformAction.mjs | 4 +- module/data/action/damageAction.mjs | 2 +- module/data/action/macroAction.mjs | 2 - module/data/action/summonAction.mjs | 1 - module/data/chat-message/adversaryRoll.mjs | 2 +- module/dice/d20Roll.mjs | 2 +- module/documents/item.mjs | 2 +- styles/less/global/tab-navigation.less | 1 + templates/ui/chat/ability-use.hbs | 7 +- 16 files changed, 57 insertions(+), 156 deletions(-) delete mode 100644 module/applications/dialogs/damageSelectionDialog.mjs diff --git a/module/applications/dialogs/_module.mjs b/module/applications/dialogs/_module.mjs index 11d6dd2b..520c90b6 100644 --- a/module/applications/dialogs/_module.mjs +++ b/module/applications/dialogs/_module.mjs @@ -2,7 +2,6 @@ export { default as BeastformDialog } from './beastformDialog.mjs'; export { default as d20RollDialog } from './d20RollDialog.mjs'; export { default as DamageDialog } from './damageDialog.mjs'; export { default as DamageReductionDialog } from './damageReductionDialog.mjs'; -export { default as DamageSelectionDialog } from './damageSelectionDialog.mjs'; export { default as DeathMove } from './deathMove.mjs'; export { default as Downtime } from './downtime.mjs'; export { default as MulticlassChoiceDialog } from './multiclassChoiceDialog.mjs'; diff --git a/module/applications/dialogs/damageSelectionDialog.mjs b/module/applications/dialogs/damageSelectionDialog.mjs deleted file mode 100644 index 3d4b312c..00000000 --- a/module/applications/dialogs/damageSelectionDialog.mjs +++ /dev/null @@ -1,128 +0,0 @@ -// TO DELETE ? - -const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; - -export default class DamageSelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(rollString, bonusDamage, resolve, hope = 0) { - super({}); - - this.data = { - rollString, - bonusDamage: bonusDamage.reduce((acc, x) => { - if (x.appliesOn === CONFIG.DH.EFFECTS.applyLocations.damageRoll.id) { - acc.push({ - ...x, - hopeUses: 0 - }); - } - - return acc; - }, []), - hope - }; - this.resolve = resolve; - } - - static DEFAULT_OPTIONS = { - tag: 'form', - classes: ['daggerheart', 'dialog', 'dh-style', 'views', 'damage-selection'], - position: { - width: 400, - height: 'auto' - }, - actions: { - decreaseHopeUse: this.decreaseHopeUse, - increaseHopeUse: this.increaseHopeUse, - rollDamage: this.rollDamage - }, - form: { - handler: this.updateSelection, - submitOnChange: true, - closeOnSubmit: false - } - }; - - /** @override */ - static PARTS = { - damageSelection: { - id: 'damageSelection', - template: 'systems/daggerheart/templates/dialogs/dice-roll/damageSelection.hbs' - } - }; - - /* -------------------------------------------- */ - - /** @inheritDoc */ - get title() { - return `Damage Options`; - } - - async _prepareContext(_options) { - return { - rollString: this.getRollString(), - bonusDamage: this.data.bonusDamage, - hope: this.data.hope + 1, - hopeUsed: this.getHopeUsed() - }; - } - - static updateSelection(event, _, formData) { - const { bonusDamage, ...rest } = foundry.utils.expandObject(formData.object); - - for (var index in bonusDamage) { - this.data.bonusDamage[index].initiallySelected = bonusDamage[index].initiallySelected; - if (bonusDamage[index].hopeUses) { - const value = Number.parseInt(bonusDamage[index].hopeUses); - if (!Number.isNaN(value)) this.data.bonusDamage[index].hopeUses = value; - } - } - - this.data = foundry.utils.mergeObject(this.data, rest); - this.render(true); - } - - getRollString() { - return this.data.rollString.concat( - this.data.bonusDamage.reduce((acc, x) => { - if (x.initiallySelected) { - const nr = 1 + x.hopeUses; - const baseDamage = x.value; - return acc.concat(` + ${nr}${baseDamage}`); - } - - return acc; - }, '') - ); - } - - getHopeUsed() { - return this.data.bonusDamage.reduce((acc, x) => acc + x.hopeUses, 0); - } - - static decreaseHopeUse(_, button) { - const index = Number.parseInt(button.dataset.index); - if (this.data.bonusDamage[index].hopeUses - 1 >= 0) { - this.data.bonusDamage[index].hopeUses -= 1; - this.render(true); - } - } - - static increaseHopeUse(_, button) { - const index = Number.parseInt(button.dataset.index); - if (this.data.bonusDamage[index].hopeUses <= this.data.hope + 1) { - this.data.bonusDamage[index].hopeUses += 1; - this.render(true); - } - } - - static rollDamage(event) { - event.preventDefault(); - - this.resolve({ - rollString: this.getRollString(), - bonusDamage: this.data.bonusDamage, - hopeUsed: this.getHopeUsed() - }); - this.close(); - } -} diff --git a/module/applications/sheets/actors/environment.mjs b/module/applications/sheets/actors/environment.mjs index 7a9c92ac..70f833de 100644 --- a/module/applications/sheets/actors/environment.mjs +++ b/module/applications/sheets/actors/environment.mjs @@ -7,7 +7,11 @@ export default class DhpEnvironment extends DHBaseActorSheet { static DEFAULT_OPTIONS = { classes: ['environment'], position: { - width: 500 + width: 500, + height: 725 + }, + window: { + resizable: true }, actions: {}, dragDrop: [{ dragSelector: '.action-section .inventory-item', dropSelector: null }] diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 9e5d6ac9..95f091ce 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -323,6 +323,20 @@ export default function DHApplicationMixin(Base) { ]; if (usable) + options.unshift({ + name: 'DAGGERHEART.GENERAL.damage', + icon: 'fa-solid fa-explosion', + condition: target => { + const doc = getDocFromElementSync(target); + return doc?.system?.attack?.damage.parts.length || doc?.damage?.parts.length; + }, + callback: async (target, event) => { + const doc = await getDocFromElement(target), + action = doc?.system?.attack ?? doc; + return action && action.use(event, { byPassRoll: true }) + } + }); + options.unshift({ name: 'DAGGERHEART.APPLICATIONS.ContextMenu.useItem', icon: 'fa-solid fa-burst', @@ -334,7 +348,7 @@ export default function DHApplicationMixin(Base) { }); if (toChat) - options.unshift({ + options.push({ name: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat', icon: 'fa-solid fa-message', callback: async target => (await getDocFromElement(target)).toChat(this.document.id) diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index 958d0386..6c864d09 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -194,8 +194,11 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo event.stopPropagation(); const item = await foundry.utils.fromUuid(message.system.origin); - const action = item.system.actions.get(event.currentTarget.id); - await item.use(action); + const action = item.system.attack?.id === event.currentTarget.id ? item.system.attack : item.system.actions.get(event.currentTarget.id); + if(event.currentTarget.dataset.directDamage) + action.use(event, { byPassRoll: true }) + else + action.use(event); } async actionUseButton(event, message) { diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index 4713938c..1ba5f91e 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -34,8 +34,8 @@ export default class DHAttackAction extends DHDamageAction { }; } - async use(event, ...args) { - const result = await super.use(event, args); + async use(event, options) { + const result = await super.use(event, options); const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.characterAttack.id); diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index b8655c91..8f04d1a0 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -111,12 +111,13 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel return actorData; } - async use(event, ...args) { + async use(event, options = {}) { if (!this.actor) throw new Error("An Action can't be used outside of an Actor context."); if (this.chatDisplay) await this.toChat(); - - let config = this.prepareConfig(event); + + let { byPassRoll } = options, + config = this.prepareConfig(event, byPassRoll); for (let i = 0; i < this.constructor.extraSchemas.length; i++) { let clsField = this.constructor.getActionField(this.constructor.extraSchemas[i]); if (clsField?.prepareConfig) { @@ -133,14 +134,14 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel if (!config) return; } - if (this.hasRoll) { + if (config.hasRoll) { const rollConfig = this.prepareRoll(config); config.roll = rollConfig; config = await this.actor.diceRoll(config); if (!config) return; } - if (this.doFollowUp()) { + if (this.doFollowUp(config)) { if (this.rollDamage && this.damage.parts.length) await this.rollDamage(event, config); else if (this.trigger) await this.trigger(event, config); else if (this.hasSave || this.hasEffect) { @@ -160,7 +161,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel } /* */ - prepareConfig(event) { + prepareConfig(event, byPass = false) { + const hasRoll = this.getUseHasRoll(byPass); return { event, title: `${this.item.name}: ${this.name}`, @@ -170,10 +172,10 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel actor: this.actor.uuid }, dialog: { - configure: this.hasRoll + configure: hasRoll }, type: this.type, - hasRoll: this.hasRoll, + hasRoll: hasRoll, hasDamage: this.damage?.parts?.length && this.type !== 'healing', hasHealing: this.damage?.parts?.length && this.type === 'healing', hasEffect: !!this.effects?.length, @@ -182,12 +184,12 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel selectedRollMode: game.settings.get('core', 'rollMode'), isFastForward: event.shiftKey, data: this.getRollData(), - evaluate: this.hasRoll + evaluate: hasRoll }; } requireConfigurationDialog(config) { - return !config.event.shiftKey && !this.hasRoll && (config.costs?.length || config.uses); + return !config.event.shiftKey && !config.hasRoll && (config.costs?.length || config.uses); } prepareRoll() { @@ -205,7 +207,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel } doFollowUp(config) { - return !this.hasRoll; + return !config.hasRoll; } async consume(config, successCost = false) { @@ -257,6 +259,10 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel /* */ /* ROLL */ + getUseHasRoll(byPass = false) { + return this.hasRoll && !byPass; + } + get hasRoll() { return !!this.roll?.type; } diff --git a/module/data/action/beastformAction.mjs b/module/data/action/beastformAction.mjs index 836024ff..8c2dd31e 100644 --- a/module/data/action/beastformAction.mjs +++ b/module/data/action/beastformAction.mjs @@ -4,7 +4,7 @@ import DHBaseAction from './baseAction.mjs'; export default class DhBeastformAction extends DHBaseAction { static extraSchemas = [...super.extraSchemas, 'beastform']; - async use(event, ...args) { + async use(event, options) { const beastformConfig = this.prepareBeastformConfig(); const abort = await this.handleActiveTransformations(); @@ -20,7 +20,7 @@ export default class DhBeastformAction extends DHBaseAction { const { selected, evolved, hybrid } = await BeastformDialog.configure(beastformConfig, this.item); if (!selected) return; - const result = await super.use(event, args); + const result = await super.use(event, options); if (!result) return; await this.transform(selected, evolved, hybrid); diff --git a/module/data/action/damageAction.mjs b/module/data/action/damageAction.mjs index 40fa2a12..a5c58feb 100644 --- a/module/data/action/damageAction.mjs +++ b/module/data/action/damageAction.mjs @@ -6,7 +6,7 @@ export default class DHDamageAction extends DHBaseAction { getFormulaValue(part, data) { let formulaValue = part.value; - if (this.hasRoll && part.resultBased && data.system.roll.result.duality === -1) return part.valueAlt; + if (data.hasRoll && part.resultBased && data.system.roll.result.duality === -1) return part.valueAlt; const isAdversary = this.actor.type === 'adversary'; if (isAdversary && this.actor.system.type === CONFIG.DH.ACTOR.adversaryTypes.horde.id) { diff --git a/module/data/action/macroAction.mjs b/module/data/action/macroAction.mjs index bfdc8f6b..c4a08df7 100644 --- a/module/data/action/macroAction.mjs +++ b/module/data/action/macroAction.mjs @@ -10,8 +10,6 @@ export default class DHMacroAction extends DHBaseAction { } async trigger(event, ...args) { - // const config = await super.use(event, args); - // if (['error', 'warning'].includes(config.type)) return; const fixUUID = !this.documentUUID.includes('Macro.') ? `Macro.${this.documentUUID}` : this.documentUUID, macro = await fromUuid(fixUUID); try { diff --git a/module/data/action/summonAction.mjs b/module/data/action/summonAction.mjs index 13b4ee99..b06f1d38 100644 --- a/module/data/action/summonAction.mjs +++ b/module/data/action/summonAction.mjs @@ -11,7 +11,6 @@ export default class DHSummonAction extends DHBaseAction { async trigger(event, ...args) { if (!this.canSummon || !canvas.scene) return; - // const config = await super.use(event, args); } get canSummon() { diff --git a/module/data/chat-message/adversaryRoll.mjs b/module/data/chat-message/adversaryRoll.mjs index d6c8851c..c0c218e3 100644 --- a/module/data/chat-message/adversaryRoll.mjs +++ b/module/data/chat-message/adversaryRoll.mjs @@ -132,7 +132,7 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { if(this.targetSelection === true) { this.targetShort = this.targets.reduce((a,c) => { if(c.hit) a.hit += 1; - else c.miss += 1; + else a.miss += 1; return a; }, {hit: 0, miss: 0}) } diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index b30bafbf..62dc0d7f 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -145,7 +145,7 @@ export default class D20Roll extends DHRoll { config.targetSelection = true; config.targets.forEach(target => { const difficulty = config.roll.difficulty ?? target.difficulty ?? target.evasion; - target.hit = this.isCritical || roll.total >= difficulty; + target.hit = roll.isCritical || roll.total >= difficulty; }); data.success = config.targets.some(target => target.hit) } else if (config.roll.difficulty) { diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 96d4596b..e1589661 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -163,7 +163,7 @@ export default class DHItem extends foundry.documents.Item { img: this.img, tags: this._getTags() }, - actions: item.system.actions, + actions: item.system.actionsList, description: this.system.description }; diff --git a/styles/less/global/tab-navigation.less b/styles/less/global/tab-navigation.less index 014da89f..53295b63 100755 --- a/styles/less/global/tab-navigation.less +++ b/styles/less/global/tab-navigation.less @@ -17,6 +17,7 @@ .feature-tab { border: none; + white-space: nowrap; a { color: light-dark(@dark-blue, @golden); diff --git a/templates/ui/chat/ability-use.hbs b/templates/ui/chat/ability-use.hbs index 0db5d5c8..1ab42978 100644 --- a/templates/ui/chat/ability-use.hbs +++ b/templates/ui/chat/ability-use.hbs @@ -19,7 +19,12 @@ - {{#if action.cost.value}}
{{action.cost.value}} {{action.cost.type}}
{{/if}} + {{#if (eq action.systemPath "attack")}} + + {{/if}} + {{!-- {{#if action.cost.value}}
{{action.cost.value}} {{action.cost.type}}
{{/if}} --}} {{/each}} \ No newline at end of file From ead2f6b8f3d91ba9e1cbc578d0cb28bc01eb9c70 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 01:10:15 +0200 Subject: [PATCH 03/24] [Fix] 654 - CharacterCreation DomainCard Effects (#665) * Character creation fix and levelup style fixes * . * Fixed old origin logic --- .../characterCreation/characterCreation.mjs | 21 +++------ module/applications/levelup/levelup.mjs | 6 ++- module/config/generalConfig.mjs | 3 +- module/data/action/baseAction.mjs | 43 ++++++++----------- module/documents/activeEffect.mjs | 3 +- module/helpers/utils.mjs | 15 +++++++ .../selections-container.less | 9 +++- .../dialog/level-up/selections-container.less | 9 ++++ .../less/dialog/level-up/tiers-container.less | 1 + .../characterCreation/setupTabs/ancestry.hbs | 2 +- templates/levelup/tabs/selections.hbs | 2 +- 11 files changed, 66 insertions(+), 48 deletions(-) diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index ddcaaaea..2b251a8b 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -1,6 +1,6 @@ import { abilities } from '../../config/actorConfig.mjs'; import { burden } from '../../config/generalConfig.mjs'; -import { createEmbeddedItemWithEffects } from '../../helpers/utils.mjs'; +import { createEmbeddedItemsWithEffects, createEmbeddedItemWithEffects } from '../../helpers/utils.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -555,13 +555,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl await createEmbeddedItemWithEffects(this.character, this.setup.community); await createEmbeddedItemWithEffects(this.character, this.setup.class); await createEmbeddedItemWithEffects(this.character, this.setup.subclass); - await this.character.createEmbeddedDocuments( - 'Item', - Object.values(this.setup.domainCards).map(x => ({ - ...x, - effects: x.effects?.map(effect => effect.toObject()) - })) - ); + await createEmbeddedItemsWithEffects(this.character, Object.values(this.setup.domainCards)); if (this.equipment.armor.uuid) await createEmbeddedItemWithEffects(this.character, this.equipment.armor, { @@ -583,14 +577,9 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl if (this.equipment.inventory.choiceB.uuid) await createEmbeddedItemWithEffects(this.character, this.equipment.inventory.choiceB); - await this.character.createEmbeddedDocuments( - 'Item', - this.setup.class.system.inventory.take - .filter(x => x) - .map(x => ({ - ...x, - effects: x.effects?.map(effect => effect.toObject()) - })) + await createEmbeddedItemsWithEffects( + this.character, + this.setup.class.system.inventory.take.filter(x => x) ); await this.character.update({ diff --git a/module/applications/levelup/levelup.mjs b/module/applications/levelup/levelup.mjs index 172b7e40..1c3f2de7 100644 --- a/module/applications/levelup/levelup.mjs +++ b/module/applications/levelup/levelup.mjs @@ -44,10 +44,12 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) static PARTS = { tabs: { template: 'systems/daggerheart/templates/levelup/tabs/tab-navigation.hbs' }, - advancements: { template: 'systems/daggerheart/templates/levelup/tabs/advancements.hbs' }, + advancements: { + template: 'systems/daggerheart/templates/levelup/tabs/advancements.hbs' + }, selections: { template: 'systems/daggerheart/templates/levelup/tabs/selections.hbs', - scrollable: ['.selections'] + scrollable: ['.levelup-selections-container'] }, summary: { template: 'systems/daggerheart/templates/levelup/tabs/summary.hbs' }, footer: { template: 'systems/daggerheart/templates/levelup/tabs/footer.hbs' } diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 09814f1a..0968c0c1 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -479,7 +479,8 @@ export const multiplierTypes = { cast: 'Spellcast', scale: 'Cost Scaling', result: 'Roll Result', - flat: 'Flat' + flat: 'Flat', + tier: 'Tier' }; export const diceSetNumbers = { diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 8f04d1a0..070864da 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -115,7 +115,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel if (!this.actor) throw new Error("An Action can't be used outside of an Actor context."); if (this.chatDisplay) await this.toChat(); - + let { byPassRoll } = options, config = this.prepareConfig(event, byPassRoll); for (let i = 0; i < this.constructor.extraSchemas.length; i++) { @@ -222,16 +222,13 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel }; } } - + const resources = config.costs - .filter(c => - c.enabled !== false - && - ( - (!successCost && (!c.consumeOnSuccess || config.roll?.success)) - || - (successCost && c.consumeOnSuccess) - ) + .filter( + c => + c.enabled !== false && + ((!successCost && (!c.consumeOnSuccess || config.roll?.success)) || + (successCost && c.consumeOnSuccess)) ) .map(c => { const resource = usefulResources[c.key]; @@ -244,17 +241,15 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel }); await this.actor.modifyResource(resources); - if (config.uses?.enabled - && - ( - (!successCost && (!config.uses?.consumeOnSuccess || config.roll?.success)) - || - (successCost && config.uses?.consumeOnSuccess) - ) - ) this.update({ 'uses.value': this.uses.value + 1 }); + if ( + config.uses?.enabled && + ((!successCost && (!config.uses?.consumeOnSuccess || config.roll?.success)) || + (successCost && config.uses?.consumeOnSuccess)) + ) + this.update({ 'uses.value': this.uses.value + 1 }); - if(config.roll?.success || successCost) - (config.message ?? config.parent).update({'system.successConsumed': true}) + if (config.roll?.success || successCost) + (config.message ?? config.parent).update({ 'system.successConsumed': true }); } /* */ @@ -307,11 +302,9 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel } async applyEffect(effect, actor) { - const origin = effect.parent?.parent ? effect.parent.parent.uuid : effect.parent.uuid; - // Enable an existing effect on the target if it originated from this effect - const existingEffect = actor.effects.find(e => e.origin === origin); + const existingEffect = actor.effects.find(e => e.origin === effect.uuid); if (existingEffect) { - return existingEffect.update( + return effect.update( foundry.utils.mergeObject({ ...effect.constructor.getInitialDuration(), disabled: false @@ -324,7 +317,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel ...effect.toObject(), disabled: false, transfer: false, - origin: origin + origin: effect.uuid }); await ActiveEffect.implementation.create(effectData, { parent: actor }); } diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 337805a7..3aced0bf 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -75,7 +75,8 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { if (isOriginTarget && change.effect.origin) { change.value = change.value.replaceAll(/origin\.@/gi, '@'); try { - const doc = foundry.utils.fromUuidSync(change.effect.origin); + const effect = foundry.utils.fromUuidSync(change.effect.origin); + const doc = effect.parent?.parent; if (doc) parseModel = doc; } catch (_) {} } diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index f1df4723..2447727a 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -371,6 +371,21 @@ export async function createEmbeddedItemWithEffects(actor, baseData, update) { return doc; } +export async function createEmbeddedItemsWithEffects(actor, baseData) { + const effectData = []; + for (let d of baseData) { + const data = d.uuid.startsWith('Compendium') ? await foundry.utils.fromUuid(d.uuid) : d; + effectData.push({ + ...data, + id: data.id, + uuid: data.uuid, + effects: data.effects?.map(effect => effect.toObject()) + }); + } + + await actor.createEmbeddedDocuments('Item', effectData); +} + export const slugify = name => { return name.toLowerCase().replaceAll(' ', '-').replaceAll('.', ''); }; diff --git a/styles/less/dialog/character-creation/selections-container.less b/styles/less/dialog/character-creation/selections-container.less index 9f81f93b..bc7a6987 100644 --- a/styles/less/dialog/character-creation/selections-container.less +++ b/styles/less/dialog/character-creation/selections-container.less @@ -112,6 +112,10 @@ flex-direction: column; text-align: center; + .card-preview-container { + flex: 1; + } + .card-preview-container { border-color: light-dark(@dark-blue, @golden); } @@ -157,7 +161,10 @@ .selections-outer-container { display: flex; justify-content: space-evenly; - height: 210px; + + &.enlarged { + height: 240px; + } } .section-container { diff --git a/styles/less/dialog/level-up/selections-container.less b/styles/less/dialog/level-up/selections-container.less index 843fead0..da5d5273 100644 --- a/styles/less/dialog/level-up/selections-container.less +++ b/styles/less/dialog/level-up/selections-container.less @@ -83,10 +83,15 @@ background: grey; padding: 0 12px; border-radius: 6px; + z-index: 2; } img { height: 124px; + + &.svg { + filter: @beige-filter; + } } .levelup-domain-selected { @@ -138,6 +143,10 @@ padding: 0 12px; } + .levelup-trait-increases { + width: 100%; + } + .levelup-radio-choices { display: flex; gap: 8px; diff --git a/styles/less/dialog/level-up/tiers-container.less b/styles/less/dialog/level-up/tiers-container.less index 1149ede3..225c31fb 100644 --- a/styles/less/dialog/level-up/tiers-container.less +++ b/styles/less/dialog/level-up/tiers-container.less @@ -27,6 +27,7 @@ } .checkbox-group-container { + width: 100%; display: grid; grid-template-columns: 1fr 3fr; gap: 4px; diff --git a/templates/characterCreation/setupTabs/ancestry.hbs b/templates/characterCreation/setupTabs/ancestry.hbs index 1c87ca47..c5895472 100644 --- a/templates/characterCreation/setupTabs/ancestry.hbs +++ b/templates/characterCreation/setupTabs/ancestry.hbs @@ -19,7 +19,7 @@ -
+
{{#> "systems/daggerheart/templates/components/card-preview.hbs" primaryAncestry altPartialBlock=true secondaryDisabled=secondaryAncestry.uuid mixedAncestry=mixedAncestry }} {{#if uuid}} diff --git a/templates/levelup/tabs/selections.hbs b/templates/levelup/tabs/selections.hbs index edfca6b4..7ebe32bb 100644 --- a/templates/levelup/tabs/selections.hbs +++ b/templates/levelup/tabs/selections.hbs @@ -99,7 +99,7 @@ {{#each this.multiclass.domains}}
{{localize this.label}}
- + {{#if this.selected}}
From a1a3ccc461f79e767b9eed28db46bffd0e7db275 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 01:10:56 +0200 Subject: [PATCH 04/24] [feature] Action UsesButton (#662) * Added a button to spend/restore uses of an action * Fixed some compendium Uses on actions * Went over all item compendia and fixed some Uses on actions * Fixed folder order in Subclass compendium --- lang/en.json | 3 +- module/applications/dialogs/damageDialog.mjs | 4 +- module/applications/dialogs/downtime.mjs | 6 ++- module/applications/sheets/api/base-actor.mjs | 26 ++++++++++- module/data/fields/actionField.mjs | 6 +++ module/dice/damageRoll.mjs | 7 ++- ...feature_Danger_Sense_AXqcoxnRoWBbbKpK.json | 6 +-- .../feature_Luckbender_U6iFjZgLYawlOlQZ.json | 6 +-- ...re_Channel_Raw_Power_P02cbN50LIoD662z.json | 22 +++------ .../feature_Rally_PydiMnNCKpd44SGS.json | 23 ++++------ ...ture_Rally__Level_5__TVeEyqmPPiRa2r3i.json | 23 ++++------ ...ure_Strange_Patterns_6YsfFjmCGuFYVhT4.json | 9 ++-- ...eature_Know_the_Tide_07x6Qe6qMzDw2xN4.json | 4 +- ...ainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json | 6 +-- ...nCard_Confusing_Aura_R8NDiJXJWmC48WSr.json | 10 ++--- .../domainCard_Copycat_3A7LZ1xmDEMGa165.json | 35 +++++++++++---- ...omainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json | 18 +++----- ...mainCard_Falling_Sky_hZJp9mdkMnqKDROe.json | 8 ++-- ...omainCard_Full_Surge_SgvjJfMyubZowPxS.json | 6 +-- ...inCard_Healing_Field_GlRm1Dxlc0Z1b04o.json | 7 +-- ..._Inspirational_Words_cWu1o82ZF7GvnbXc.json | 7 +-- ...nCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json | 8 ++-- ...inCard_Mending_Touch_TGjR4vJVNbQRV8zr.json | 9 ++-- ...ainCard_Night_Terror_zcldCuqOg3dphUVI.json | 19 +++----- ...nCard_Plant_Dominion_9a6xP5pxhVvdugk9.json | 7 +-- ...mainCard_Reassurance_iYNVTB7uAD1FTCZu.json | 6 +-- ...Rejuvenation_Barrier_HtWx5IIemCoorMj2.json | 10 ++--- ...mainCard_Restoration_wUQFsRtww18naYaq.json | 7 +-- ...omainCard_Shadowbind_kguhWlidhxe2GbT0.json | 8 ++-- ...ard_Share_the_Burden_8nRle10pw1HO8QVu.json | 30 +++++++++++-- .../domainCard_Smite_U1uWJE94HZVudujz.json | 8 ++-- ...d_Splintering_Strike_TYKfM3H9vBXyWiH4.json | 40 +++++++++++++---- ...d_Strategic_Approach_5b1awkgTmMp3FVrm.json | 9 ++-- ...nCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json | 23 ++++------ ...inCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json | 7 +-- ...omainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json | 10 ++--- ...d_Zone_of_Protection_lOZaRb4fCVgQsWB5.json | 14 ++---- .../folders_Level_10_pPzU9WOQNv3ckO1w.json | 6 +-- .../folders_Level_1_EJoXzO85rG5EiZsh.json | 6 +-- .../folders_Level_2_xZrCYAd05ayNu1yW.json | 6 +-- .../folders_Level_3_uXGugK72AffddFdH.json | 6 +-- .../folders_Level_4_BJIiOIWAQUz5zuqo.json | 6 +-- .../folders_Level_5_ZZHIbaynhzVArA1p.json | 6 +-- .../folders_Level_6_u5Lq2kfC8LlDAGDC.json | 6 +-- .../folders_Level_7_gEVGjjPrjqxxZkb5.json | 6 +-- .../folders_Level_8_qY4Zqc1Ch6p317uK.json | 6 +-- .../folders_Level_9_R5afi5bhq9ccnYY2.json | 6 +-- ...re_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json | 10 +---- ..._Contacts_Everywhere_cXbRm744mW6UXGam.json | 23 ++++------ .../feature_Eloquent_5bmB1YcxiJVNVXDM.json | 18 +++----- ...ure_Gifted_Performer_99U7YWNCxFZHCiT0.json | 20 ++++----- ...feature_Loyal_Friend_xjZHD5Yo3Tu26rLm.json | 30 +++++++++++-- ...ature_Rousing_Speech_PCmYTX02JLzBpgml.json | 23 ++++------ ...eature_Sparing_Touch_GfOSgVJW8bS1OjNq.json | 18 ++++++-- ...eature_Transcendence_th6HZwEFnVBjUtqm.json | 22 +++------ ..._Warden_s_Protection_2F1bUFY80oce97C9.json | 12 ++--- .../folders_Bard_0DMzpFZB8A6vwpRX.json | 6 +-- .../folders_Druid_AZWrSJzGXltzQhAJ.json | 6 +-- .../folders_Guardian_WMlU3baiUdMgfuak.json | 6 +-- .../folders_Ranger_ArVAtkgkm5bYpKHL.json | 6 +-- .../folders_Rogue_36dtJE1CPjPt76pP.json | 6 +-- .../folders_Seraph_RZOEu0ZYQNPs6O2c.json | 6 +-- .../folders_Sorcerer_F0mW5ofdyyfE2hHo.json | 6 +-- ...rs_Subclass_Features_Sfpr4iK1cGrmncok.json | 6 +-- .../folders_Warrior_aTyhcJgENR9uI7u4.json | 6 +-- .../folders_Wizard_Bb9SLVpYHGBrOB59.json | 6 +-- styles/less/global/elements.less | 45 ++++++++++++++++++- styles/less/global/inventory-item.less | 16 ++++--- styles/less/utils/colors.less | 1 + .../global/partials/inventory-item-V2.hbs | 14 ++++-- 70 files changed, 471 insertions(+), 358 deletions(-) diff --git a/lang/en.json b/lang/en.json index b080fcc8..927953ac 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2361,7 +2361,8 @@ "pendingSaves": "Pending Reaction Rolls", "openSheetSettings": "Open Settings", "rulesOn": "Rules On", - "rulesOff": "Rules Off" + "rulesOff": "Rules Off", + "remainingUses": "Uses refresh on {type}" } } } diff --git a/module/applications/dialogs/damageDialog.mjs b/module/applications/dialogs/damageDialog.mjs index 42fe10c5..2d372725 100644 --- a/module/applications/dialogs/damageDialog.mjs +++ b/module/applications/dialogs/damageDialog.mjs @@ -38,7 +38,9 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application }; get title() { - return game.i18n.localize(`DAGGERHEART.EFFECTS.ApplyLocations.${this.config.hasHealing ? 'healing' : 'damage'}Roll.name`); + return game.i18n.localize( + `DAGGERHEART.EFFECTS.ApplyLocations.${this.config.hasHealing ? 'healing' : 'damage'}Roll.name` + ); } async _prepareContext(_options) { diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index 8d6bbda1..15ffc189 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -233,7 +233,11 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV const feature = await foundry.utils.fromUuid(data.uuid); const increasing = feature.system.resource.progression === CONFIG.DH.ITEM.itemResourceProgression.increasing.id; - const resetValue = increasing ? 0 : (feature.system.resource.max ?? 0); + const resetValue = increasing + ? 0 + : feature.system.resource.max + ? Roll.replaceFormulaData(feature.system.resource.max, this.actor) + : 0; await feature.update({ 'system.resource.value': resetValue }); } diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 56e48232..1c803eb4 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -22,7 +22,8 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { }, actions: { openSettings: DHBaseActorSheet.#openSettings, - sendExpToChat: DHBaseActorSheet.#sendExpToChat + sendExpToChat: DHBaseActorSheet.#sendExpToChat, + increaseActionUses: event => DHBaseActorSheet.#modifyActionUses(event, true) }, contextMenus: [ { @@ -70,6 +71,15 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { return context; } + /**@inheritdoc */ + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + + htmlElement.querySelectorAll('.item-button .action-uses-button').forEach(element => { + element.addEventListener('contextmenu', DHBaseActorSheet.#modifyActionUses); + }); + } + /** * Prepare render context for the Effect part. * @param {ApplicationRenderContext} context @@ -154,6 +164,20 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { cls.create(msg); } + /** + * + */ + static async #modifyActionUses(event, increase) { + event.stopPropagation(); + event.preventDefault(); + const actionId = event.target.dataset.itemUuid; + const action = await foundry.utils.fromUuid(actionId); + + const newValue = (action.uses.value ?? 0) + (increase ? 1 : -1); + await action.update({ 'uses.value': Math.min(Math.max(newValue, 0), action.uses.max ?? 0) }); + this.render(); + } + /* -------------------------------------------- */ /* Application Drag/Drop */ /* -------------------------------------------- */ diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index 00948f40..a31197b5 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -164,6 +164,12 @@ export function ActionMixin(Base) { return foundry.utils.getProperty(this.parent, this.systemPath) instanceof Collection; } + get remainingUses() { + if (!this.uses) return null; + + return Math.max((this.uses.max ?? 0) - (this.uses.value ?? 0), 0); + } + static async create(data, operation = {}) { const { parent, renderSheet } = operation; let { type } = data; diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index 11d317aa..999a4bb8 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -9,9 +9,8 @@ export default class DamageRoll extends DHRoll { static DefaultDialog = DamageDialog; static async buildEvaluate(roll, config = {}, message = {}) { - if (config.evaluate !== false) - for (const roll of config.roll) await roll.roll.evaluate(); - + if (config.evaluate !== false) for (const roll of config.roll) await roll.roll.evaluate(); + roll._evaluated = true; const parts = config.roll.map(r => this.postEvaluate(r)); @@ -42,7 +41,7 @@ export default class DamageRoll extends DHRoll { if (config.source?.message) { const chatMessage = ui.chat.collection.get(config.source.message); chatMessage.update({ 'system.damage': config.damage }); - } + } } static unifyDamageRoll(rolls) { diff --git a/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json b/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json index a9dd34f4..e8152918 100644 --- a/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json +++ b/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json @@ -26,8 +26,8 @@ ], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "shortRest" }, "effects": [], "target": { @@ -58,7 +58,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753997061290, - "modifiedTime": 1753997114091, + "modifiedTime": 1754498245294, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!AXqcoxnRoWBbbKpK" diff --git a/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json b/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json index 3319eee8..51b33024 100644 --- a/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json +++ b/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json @@ -26,8 +26,8 @@ ], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "session" }, "effects": [], "target": { @@ -58,7 +58,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753994658436, - "modifiedTime": 1753994711690, + "modifiedTime": 1754498186961, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!U6iFjZgLYawlOlQZ" diff --git a/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json b/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json index b4f79450..f01b29b1 100644 --- a/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json +++ b/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json @@ -6,15 +6,7 @@ "img": "icons/magic/unholy/strike-body-explode-disintegrate.webp", "system": { "description": "

Once per long rest, you can place a domain card from your loadout into your vault and choose to either:

  • Gain Hope equal to the level of the card.

  • Enhance a spell that deals damage, gaining a bonus to your damage roll equal to twice the level of the card.

", - "resource": { - "type": "simple", - "value": 1, - "max": "1", - "icon": "", - "recovery": "longRest", - "diceStates": {}, - "dieFaces": "d4" - }, + "resource": null, "actions": { "YFmqnbMx540su2Ni": { "type": "effect", @@ -26,17 +18,17 @@ "cost": [ { "scalable": false, - "key": "P02cbN50LIoD662z", + "key": "hitPoints", "value": 1, - "keyIsID": true, + "keyIsID": false, "step": null, "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "", - "recovery": null, + "max": "1", + "recovery": "longRest", "consumeOnSuccess": false }, "effects": [], @@ -67,8 +59,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754349703843, - "modifiedTime": 1754349703843, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754498040342, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!P02cbN50LIoD662z" } diff --git a/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json b/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json index cd9fe232..4b509228 100644 --- a/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json +++ b/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json @@ -5,15 +5,7 @@ "img": "icons/tools/instruments/drum-hand-tan.webp", "system": { "description": "

Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice. At level 5, your Rally Die increases to a d8.

", - "resource": { - "type": "simple", - "value": 1, - "max": "1", - "icon": "", - "recovery": "session", - "diceStates": {}, - "dieFaces": "d4" - }, + "resource": null, "actions": { "vI4Fph3y9ygsya9e": { "type": "effect", @@ -25,15 +17,16 @@ "cost": [ { "scalable": false, - "key": "Y7waM3ljoRLyk38N", + "key": "hitPoints", "value": 1, - "keyIsID": true, - "step": null + "keyIsID": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "", + "max": "1", "recovery": "session" }, "effects": [ @@ -114,8 +107,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754174497668, - "modifiedTime": 1754246215191, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754494820213, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "ownership": { "default": 0, diff --git a/src/packs/classes/feature_Rally__Level_5__TVeEyqmPPiRa2r3i.json b/src/packs/classes/feature_Rally__Level_5__TVeEyqmPPiRa2r3i.json index 1f85310e..bba20558 100644 --- a/src/packs/classes/feature_Rally__Level_5__TVeEyqmPPiRa2r3i.json +++ b/src/packs/classes/feature_Rally__Level_5__TVeEyqmPPiRa2r3i.json @@ -5,15 +5,7 @@ "img": "icons/tools/instruments/drum-hand-tan.webp", "system": { "description": "

Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice. At level 5, your Rally Die increases to a d8.

", - "resource": { - "type": "simple", - "value": 1, - "max": "1", - "icon": "", - "recovery": "session", - "diceStates": {}, - "dieFaces": "d4" - }, + "resource": null, "actions": { "Z1KWFrpXOqZWuZD1": { "type": "effect", @@ -25,15 +17,16 @@ "cost": [ { "scalable": false, - "key": "oxv0m8AFUQVFKtZ4", + "key": "hitPoints", "value": 1, - "keyIsID": true, - "step": null + "keyIsID": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "", + "max": "1", "recovery": "session" }, "effects": [ @@ -114,8 +107,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754174499893, - "modifiedTime": 1754246215922, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754494835723, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "ownership": { "default": 0, diff --git a/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json b/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json index c9bac1eb..afe896de 100644 --- a/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json +++ b/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json @@ -7,10 +7,11 @@ "system": { "description": "

Choose a number between 1 and 12. When you roll that number on a Duality Die, gain a Hope or clear a Stress.

You can change this number when you take a long rest.

", "resource": { - "type": "simple", + "type": "diceValue", "value": 1, - "max": "", - "icon": "fa-solid fa-hashtag" + "max": "1", + "icon": "fa-solid fa-hashtag", + "dieFaces": "d12" }, "actions": { "RkqPzF1bdWzPPMml": { @@ -100,7 +101,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754254942995, - "modifiedTime": 1754255067467, + "modifiedTime": 1754498121727, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!6YsfFjmCGuFYVhT4" diff --git a/src/packs/communities/feature_Know_the_Tide_07x6Qe6qMzDw2xN4.json b/src/packs/communities/feature_Know_the_Tide_07x6Qe6qMzDw2xN4.json index cab7e54d..d2c1c314 100644 --- a/src/packs/communities/feature_Know_the_Tide_07x6Qe6qMzDw2xN4.json +++ b/src/packs/communities/feature_Know_the_Tide_07x6Qe6qMzDw2xN4.json @@ -30,8 +30,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754010247432, - "modifiedTime": 1754010247432, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754498464092, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "sort": 0, "ownership": { diff --git a/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json b/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json index 5630c6bb..ce88eb60 100644 --- a/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json +++ b/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json @@ -66,7 +66,7 @@ } ], "roll": { - "type": null, + "type": "spellcast", "trait": null, "difficulty": null, "bonus": null, @@ -154,8 +154,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784434, - "modifiedTime": 1754253433766, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754475145346, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "5EP2Lgf7ojfrc0Is", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json b/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json index 36dec337..ee91b2fc 100644 --- a/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json +++ b/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json @@ -20,9 +20,9 @@ "cost": [], "uses": { "value": null, - "max": "", - "recovery": null, - "consumeOnSuccess": false + "max": "1", + "recovery": "longRest", + "consumeOnSuccess": true }, "damage": { "parts": [], @@ -128,8 +128,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784437, - "modifiedTime": 1754254161910, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754501480068, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "R8NDiJXJWmC48WSr", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Copycat_3A7LZ1xmDEMGa165.json b/src/packs/domains/domainCard_Copycat_3A7LZ1xmDEMGa165.json index edb22494..6e9762c6 100644 --- a/src/packs/domains/domainCard_Copycat_3A7LZ1xmDEMGa165.json +++ b/src/packs/domains/domainCard_Copycat_3A7LZ1xmDEMGa165.json @@ -9,12 +9,31 @@ "recallCost": 3, "level": 9, "type": "spell", - "resource": { - "type": "simple", - "value": 1, - "recovery": "longRest", - "max": "1", - "icon": "" + "resource": null, + "actions": { + "RKEceNKiQirYwN45": { + "type": "effect", + "_id": "RKEceNKiQirYwN45", + "systemPath": "actions", + "description": "

Once per long rest, this card can mimic the features of another domain card of level 8 or lower in another player’s loadout. Spend Hope equal to half the card’s level to gain access to the feature. It lasts until your next rest or they place the card in their vault.

", + "chatDisplay": true, + "actionType": "action", + "cost": [], + "uses": { + "value": null, + "max": "1", + "recovery": "longRest", + "consumeOnSuccess": false + }, + "effects": [], + "target": { + "type": "any", + "amount": null + }, + "name": "Mimic", + "img": "icons/magic/perception/hand-eye-black.webp", + "range": "" + } } }, "flags": {}, @@ -26,8 +45,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784439, - "modifiedTime": 1754329311656, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499898585, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "3A7LZ1xmDEMGa165", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json index 0b88d8ce..6b8cc8b1 100644 --- a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json +++ b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json @@ -29,9 +29,9 @@ ], "uses": { "value": null, - "max": "", - "recovery": null, - "consumeOnSuccess": false + "max": "1", + "recovery": "shortRest", + "consumeOnSuccess": true }, "damage": { "parts": [ @@ -99,13 +99,7 @@ "range": "veryFar" } }, - "resource": { - "type": "simple", - "value": 1, - "recovery": "shortRest", - "max": "1", - "icon": "" - } + "resource": null }, "flags": {}, "_stats": { @@ -116,8 +110,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784449, - "modifiedTime": 1754254262215, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754501560924, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "C0qLOwSSvZ6PG3Ws", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json b/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json index d047c737..fd032d37 100644 --- a/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json +++ b/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json @@ -4,7 +4,7 @@ "type": "domainCard", "folder": "7Cs44YADBTmmtCw6", "system": { - "description": "

Make a Spellcast Roll against all adversaries within Far range. Mark any number of Stress to make shards of arcana rain down from above. Targets you succeed against take 1d20+2 magic damage for each Stress marked.

", + "description": "

Make a Spellcast Roll against all adversaries within Far range. Mark any number of Stress to make shards of arcana rain down from above. Targets you succeed against take 1d20+2 magic damage for each Stress marked.

@Template[type:emanation|range:f]

", "domain": "arcana", "recallCost": 1, "level": 10, @@ -14,7 +14,7 @@ "type": "attack", "_id": "xJfXJDVsBayGaqkr", "systemPath": "actions", - "description": "

Make a Spellcast Roll against all adversaries within Far range. Mark any number of Stress to make shards of arcana rain down from above. Targets you succeed against take 1d20+2 magic damage for each Stress marked.

", + "description": "

Make a Spellcast Roll against all adversaries within Far range. Mark any number of Stress to make shards of arcana rain down from above. Targets you succeed against take 1d20+2 magic damage for each Stress marked.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -103,8 +103,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784452, - "modifiedTime": 1754254370187, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754501517016, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "hZJp9mdkMnqKDROe", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json index b27dda2c..ca10655c 100644 --- a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json +++ b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json @@ -28,8 +28,8 @@ ], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "longRest" }, "effects": [ { @@ -56,7 +56,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784460, - "modifiedTime": 1754242182536, + "modifiedTime": 1754498928489, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "SgvjJfMyubZowPxS", diff --git a/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json b/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json index 6cf1c52c..a9b0561d 100644 --- a/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json +++ b/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json @@ -173,7 +173,8 @@ "value": 1, "recovery": "longRest", "max": "1", - "icon": "" + "icon": "", + "progression": "decreasing" } }, "flags": {}, @@ -185,8 +186,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784466, - "modifiedTime": 1754338717920, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499077474, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "GlRm1Dxlc0Z1b04o", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json b/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json index eac0b208..424b08b7 100644 --- a/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json +++ b/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json @@ -14,7 +14,8 @@ "value": 0, "recovery": "longRest", "max": "@system.traits.presence.value", - "icon": "" + "icon": "", + "progression": "decreasing" }, "actions": { "5sGMd6m6Ltahit4h": { @@ -253,8 +254,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784473, - "modifiedTime": 1754340989544, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499693699, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "cWu1o82ZF7GvnbXc", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json index 952e478c..2713e2c7 100644 --- a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json +++ b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json @@ -4,7 +4,7 @@ "type": "domainCard", "folder": "7O1tTswJMNdPgLsx", "system": { - "description": "

Make a Spellcast Roll against all targets within Far range. Targets you succeed against become temporarily Enraptured. While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice. Mark a Stress to force all Enraptured targets to mark a Stress, ending this spell.

", + "description": "

Make a Spellcast Roll against all targets within Far range. Targets you succeed against become temporarily Enraptured. While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice. Mark a Stress to force all Enraptured targets to mark a Stress, ending this spell.

@Template[type:emanation|range:f]

", "domain": "grace", "recallCost": 3, "level": 8, @@ -14,7 +14,7 @@ "type": "attack", "_id": "r5eA3tAH7EplOQCP", "systemPath": "actions", - "description": "

Make a Spellcast Roll against all targets within Far range. Targets you succeed against become temporarily Enraptured. While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.

", + "description": "

Make a Spellcast Roll against all targets within Far range. Targets you succeed against become temporarily Enraptured. While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice. Mark a Stress to force all Enraptured targets to mark a Stress, ending this spell.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -132,8 +132,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784481, - "modifiedTime": 1754342040215, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499825008, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "ubpixIgZrJXKyM3b", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json b/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json index bbe13819..437adffc 100644 --- a/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json +++ b/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json @@ -338,9 +338,10 @@ "resource": { "type": "simple", "value": 1, - "recovery": "longRest", + "progression": "decreasing", "max": "1", - "icon": "" + "icon": "fa-solid fa-hands-praying", + "recovery": "longRest" } }, "flags": {}, @@ -352,8 +353,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784482, - "modifiedTime": 1754269394280, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754498631054, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "TGjR4vJVNbQRV8zr", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json index 89d5fe1a..cb538eb1 100644 --- a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json +++ b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json @@ -4,7 +4,7 @@ "type": "domainCard", "folder": "2rqOUxEglhhPKk2j", "system": { - "description": "

Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily Horrified. While Horrified, they’re Vulnerable. Steal a number of Fear from the GM equal to the number of targets that are Horrified (up to the number of Fear in the GM’s pool). Roll a number of d6s equal to the number of stolen Fear and deal the total damage to each Horrified target. Discard the stolen Fear.

", + "description": "

Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily Horrified. While Horrified, they’re Vulnerable. Steal a number of Fear from the GM equal to the number of targets that are Horrified (up to the number of Fear in the GM’s pool). Roll a number of d6s equal to the number of stolen Fear and deal the total damage to each Horrified target. Discard the stolen Fear.

@Template[type:emanation|range:vc]

", "domain": "midnight", "recallCost": 2, "level": 9, @@ -14,14 +14,14 @@ "type": "attack", "_id": "e4A6GQERsn08IBby", "systemPath": "actions", - "description": "

Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily Horrified. While Horrified, they’re Vulnerable. Steal a number of Fear from the GM equal to the number of targets that are Horrified (up to the number of Fear in the GM’s pool). Roll a number of d6s equal to the number of stolen Fear and deal the total damage to each Horrified target. Discard the stolen Fear.

", + "description": "

Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily Horrified. While Horrified, they’re Vulnerable. Steal a number of Fear from the GM equal to the number of targets that are Horrified (up to the number of Fear in the GM’s pool). Roll a number of d6s equal to the number of stolen Fear and deal the total damage to each Horrified target. Discard the stolen Fear.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "longRest" }, "damage": { "parts": [], @@ -121,12 +121,7 @@ "range": "" } }, - "resource": { - "type": "simple", - "value": 0, - "max": "", - "icon": "" - } + "resource": null }, "flags": {}, "_stats": { @@ -137,8 +132,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784487, - "modifiedTime": 1754331219352, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499654051, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "zcldCuqOg3dphUVI", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json b/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json index c8f3272e..8176850e 100644 --- a/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json +++ b/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json @@ -21,7 +21,8 @@ "uses": { "value": null, "max": "1", - "recovery": "longRest" + "recovery": "longRest", + "consumeOnSuccess": true }, "damage": { "parts": [], @@ -67,8 +68,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784493, - "modifiedTime": 1754340285152, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499238543, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "9a6xP5pxhVvdugk9", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Reassurance_iYNVTB7uAD1FTCZu.json b/src/packs/domains/domainCard_Reassurance_iYNVTB7uAD1FTCZu.json index c55cd75b..43c17e96 100644 --- a/src/packs/domains/domainCard_Reassurance_iYNVTB7uAD1FTCZu.json +++ b/src/packs/domains/domainCard_Reassurance_iYNVTB7uAD1FTCZu.json @@ -19,7 +19,7 @@ "actionType": "action", "cost": [], "uses": { - "value": 1, + "value": 0, "max": "1", "recovery": "shortRest", "consumeOnSuccess": false @@ -44,8 +44,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784499, - "modifiedTime": 1754269219077, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754498645559, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "iYNVTB7uAD1FTCZu", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json b/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json index 2cc41796..4d910604 100644 --- a/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json +++ b/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json @@ -4,7 +4,7 @@ "type": "domainCard", "folder": "qY4Zqc1Ch6p317uK", "system": { - "description": "

Make a Spellcast Roll (15). Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear 1d4 Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.

When you move, the barrier follows you.

", + "description": "

Make a Spellcast Roll (15). Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear 1d4 Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.

When you move, the barrier follows you.

@Template[type:emanation|range:vc]

", "domain": "sage", "recallCost": 1, "level": 8, @@ -14,7 +14,7 @@ "type": "healing", "_id": "XdAwXl2uWNinInFe", "systemPath": "actions", - "description": "

Make a Spellcast Roll (15). Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear 1d4 Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.

When you move, the barrier follows you.

", + "description": "

Make a Spellcast Roll (15). Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear 1d4 Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.

When you move, the barrier follows you.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -22,7 +22,7 @@ "value": null, "max": "1", "recovery": "shortRest", - "consumeOnSuccess": false + "consumeOnSuccess": true }, "damage": { "parts": [ @@ -93,8 +93,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784502, - "modifiedTime": 1754339870857, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499308449, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "HtWx5IIemCoorMj2", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json b/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json index e0d05dd3..c75e8ca6 100644 --- a/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json +++ b/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json @@ -14,7 +14,8 @@ "value": 0, "recovery": "longRest", "max": "@cast", - "icon": "" + "icon": "", + "progression": "decreasing" }, "actions": { "udmHKUtCDClxeB4h": { @@ -214,8 +215,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784502, - "modifiedTime": 1754269768509, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754498742091, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "wUQFsRtww18naYaq", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json b/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json index 73608be0..000a1b1f 100644 --- a/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json +++ b/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json @@ -4,7 +4,7 @@ "type": "domainCard", "folder": "Abn46nCQst6kpGeA", "system": { - "description": "

Make a Spellcast Roll against all adversaries within Very Close range. Targets you succeed against are temporarily Restrained as their shadow binds them in place.

", + "description": "

Make a Spellcast Roll against all adversaries within Very Close range. Targets you succeed against are temporarily Restrained as their shadow binds them in place.

@Template[type:emanation|range:vc]

", "domain": "midnight", "recallCost": 0, "level": 2, @@ -14,7 +14,7 @@ "type": "attack", "_id": "Llr9uIDUCrfsiZNn", "systemPath": "actions", - "description": "

Make a Spellcast Roll against all adversaries within Very Close range. Targets you succeed against are temporarily Restrained as their shadow binds them in place.

", + "description": "

Make a Spellcast Roll against all adversaries within Very Close range. Targets you succeed against are temporarily Restrained as their shadow binds them in place.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -72,8 +72,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784512, - "modifiedTime": 1754330643864, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499502570, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "kguhWlidhxe2GbT0", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Share_the_Burden_8nRle10pw1HO8QVu.json b/src/packs/domains/domainCard_Share_the_Burden_8nRle10pw1HO8QVu.json index ec17d233..62c4de86 100644 --- a/src/packs/domains/domainCard_Share_the_Burden_8nRle10pw1HO8QVu.json +++ b/src/packs/domains/domainCard_Share_the_Burden_8nRle10pw1HO8QVu.json @@ -9,7 +9,31 @@ "recallCost": 0, "level": 6, "type": "spell", - "actions": {} + "actions": { + "MjSx44ovuKBGVKGs": { + "type": "effect", + "_id": "MjSx44ovuKBGVKGs", + "systemPath": "actions", + "description": "

Once per rest, take on the Stress from a willing creature within Melee range. The target describes what intimate knowledge or emotions telepathically leak from their mind in this moment between you. Transfer any number of their marked Stress to you, then gain a Hope for each Stress transferred.

", + "chatDisplay": true, + "actionType": "action", + "cost": [], + "uses": { + "value": null, + "max": "1", + "recovery": "shortRest", + "consumeOnSuccess": false + }, + "effects": [], + "target": { + "type": "any", + "amount": null + }, + "name": "Take Stress", + "img": "systems/daggerheart/assets/icons/domains/domain-card/grace.png", + "range": "" + } + } }, "flags": {}, "_stats": { @@ -20,8 +44,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784515, - "modifiedTime": 1754327488946, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499760780, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "8nRle10pw1HO8QVu", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json b/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json index 8a67261a..939fff19 100644 --- a/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json +++ b/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json @@ -29,8 +29,8 @@ ], "uses": { "value": null, - "max": "", - "recovery": null, + "max": "1", + "recovery": "shortRest", "consumeOnSuccess": false }, "effects": [ @@ -58,8 +58,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784519, - "modifiedTime": 1754269704377, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754498725946, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "U1uWJE94HZVudujz", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json b/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json index e5354c04..ed3d5f4c 100644 --- a/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json +++ b/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json @@ -10,9 +10,9 @@ "level": 9, "type": "ability", "actions": { - "B4vyaTibK0GiRBCW": { - "type": "effect", - "_id": "B4vyaTibK0GiRBCW", + "yjEcSlzsWGX79gpB": { + "type": "attack", + "_id": "yjEcSlzsWGX79gpB", "systemPath": "actions", "description": "

Spend a Hope and make an attack against all adversaries within your weapon’s range. Once per long rest, on a success against any targets, add up the damage dealt, then redistribute that damage however you wish between the targets you succeeded against. When you deal damage to a target, roll an additional damage die and add its result to the damage you deal to that target.

", "chatDisplay": true, @@ -29,15 +29,39 @@ ], "uses": { "value": null, - "max": "", - "recovery": null, - "consumeOnSuccess": false + "max": "1", + "recovery": "longRest", + "consumeOnSuccess": true + }, + "damage": { + "parts": [], + "includeBase": false }, - "effects": [], "target": { "type": "any", "amount": null }, + "effects": [], + "roll": { + "type": "attack", + "trait": null, + "difficulty": null, + "bonus": null, + "advState": "neutral", + "diceRolling": { + "multiplier": "prof", + "flatMultiplier": 1, + "dice": "d6", + "compare": null, + "treshold": null + }, + "useDefault": false + }, + "save": { + "trait": null, + "difficulty": null, + "damageMod": "none" + }, "name": "Spend Hope", "img": "icons/skills/melee/strike-sword-steel-yellow.webp", "range": "" @@ -53,7 +77,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784522, - "modifiedTime": 1754252510860, + "modifiedTime": 1754501075258, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "TYKfM3H9vBXyWiH4", diff --git a/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json b/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json index 19f05212..ae4ab09d 100644 --- a/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json +++ b/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json @@ -11,10 +11,11 @@ "type": "ability", "resource": { "type": "simple", - "value": 1, - "max": "", + "value": 0, + "max": "max(@system.traits.knowledge.value, 1)", "icon": "fa-solid fa-bullseye", - "recovery": "longRest" + "recovery": "longRest", + "progression": "decreasing" }, "actions": { "jTC0GbsBpGmaQLi7": { @@ -60,7 +61,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784523, - "modifiedTime": 1754249661976, + "modifiedTime": 1754501630846, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "5b1awkgTmMp3FVrm", diff --git a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json index d632315f..124144a8 100644 --- a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json +++ b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json @@ -108,16 +108,17 @@ "cost": [ { "scalable": false, - "key": "n0P3VS1WfxvmXbB6", + "key": "hitPoints", "value": 1, - "keyIsID": true, - "step": null + "keyIsID": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "shortRest" }, "effects": [], "target": { @@ -129,13 +130,7 @@ "range": "" } }, - "resource": { - "type": "simple", - "value": 1, - "recovery": "shortRest", - "max": "1", - "icon": "" - } + "resource": null }, "flags": {}, "_stats": { @@ -146,8 +141,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784534, - "modifiedTime": 1754338673637, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499113867, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "n0P3VS1WfxvmXbB6", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json index cca1f984..17f934d6 100644 --- a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json +++ b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json @@ -14,7 +14,8 @@ "value": 0, "max": "@cast", "icon": "", - "recovery": "session" + "recovery": "session", + "progression": "decreasing" }, "actions": { "MWvrKuwejWcQm7N1": { @@ -143,8 +144,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784537, - "modifiedTime": 1754253370819, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754501257508, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "o62i0QdbUDIiAhSq", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json b/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json index 10062194..269139cf 100644 --- a/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json +++ b/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json @@ -20,7 +20,7 @@ "type": "effect", "_id": "nYu6LRNVDKfWUJhx", "systemPath": "actions", - "description": "", + "description": "

Once per long rest, mark a Stress to channel the natural world around you and enhance yourself. Describe how your appearance changes, then place a d6 on this card with the 1 value facing up.

While the Wild Surge Die is active, you add its value to every action roll you make. After you add its value to a roll, increase the Wild Surge Die’s value by one. When the die’s value would exceed 6 or you take a rest, this form drops and you must mark an additional Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -34,8 +34,8 @@ ], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "longRest" }, "effects": [], "target": { @@ -57,8 +57,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784547, - "modifiedTime": 1754340095871, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754499199811, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "DjnKlZQYaWdQGKcK", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json b/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json index f94f270c..c712284d 100644 --- a/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json +++ b/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json @@ -4,7 +4,7 @@ "type": "domainCard", "folder": "OwsbTSWzKq2WJmQN", "system": { - "description": "

Make a Spellcast Roll (16). Once per long rest on a success, choose a point within Far range and create a visible zone of protection there for all allies within Very Close range of that point. When you do, place a d6 on this card with the 1 value facing up. When an ally in this zone takes damage, they reduce it by the die’s value. You then increase the die’s value by one. When the die’s value would exceed 6, this effect ends.

@Template[type:emanation|range:vc]

", + "description": "

Make a Spellcast Roll (16). Once per long rest on a success, choose a point within Far range and create a visible zone of protection there for all allies within Very Close range of that point. When you do, place a d6 on this card with the 1 value facing up. When an ally in this zone takes damage, they reduce it by the die’s value. You then increase the die’s value by one. When the die’s value would exceed 6, this effect ends.

@Template[type:emanation|range:vc]

", "domain": "splendor", "recallCost": 2, "level": 6, @@ -58,13 +58,7 @@ "range": "far" } }, - "resource": { - "type": "simple", - "value": 0, - "max": "6", - "icon": "", - "recovery": "longRest" - } + "resource": null }, "flags": {}, "_stats": { @@ -75,8 +69,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1753922784549, - "modifiedTime": 1754269795161, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754498786877, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_id": "lOZaRb4fCVgQsWB5", "sort": 3400000, diff --git a/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json b/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json index 3862d063..1f1931b2 100644 --- a/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json +++ b/src/packs/domains/folders_Level_10_pPzU9WOQNv3ckO1w.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "pPzU9WOQNv3ckO1w", "description": "", - "sort": 1000000, + "sort": 2000000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681545540 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499337594 }, "_key": "!folders!pPzU9WOQNv3ckO1w" } diff --git a/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json b/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json index 9217a20b..9423f226 100644 --- a/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json +++ b/src/packs/domains/folders_Level_1_EJoXzO85rG5EiZsh.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "EJoXzO85rG5EiZsh", "description": "", - "sort": 100000, + "sort": 1100000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681545540 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499330683 }, "_key": "!folders!EJoXzO85rG5EiZsh" } diff --git a/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json b/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json index e9a40501..7a56682e 100644 --- a/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json +++ b/src/packs/domains/folders_Level_2_xZrCYAd05ayNu1yW.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "xZrCYAd05ayNu1yW", "description": "", - "sort": 200000, + "sort": 1200000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681545540 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499331503 }, "_key": "!folders!xZrCYAd05ayNu1yW" } diff --git a/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json b/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json index c57e63f7..63c28dc7 100644 --- a/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json +++ b/src/packs/domains/folders_Level_3_uXGugK72AffddFdH.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "uXGugK72AffddFdH", "description": "", - "sort": 300000, + "sort": 1300000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681545540 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499332151 }, "_key": "!folders!uXGugK72AffddFdH" } diff --git a/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json b/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json index 51cc633d..7a709b1b 100644 --- a/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json +++ b/src/packs/domains/folders_Level_4_BJIiOIWAQUz5zuqo.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "BJIiOIWAQUz5zuqo", "description": "", - "sort": 400000, + "sort": 1400000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681545540 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499332813 }, "_key": "!folders!BJIiOIWAQUz5zuqo" } diff --git a/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json b/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json index 979c57cb..ae30d6cf 100644 --- a/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json +++ b/src/packs/domains/folders_Level_5_ZZHIbaynhzVArA1p.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "ZZHIbaynhzVArA1p", "description": "", - "sort": 500000, + "sort": 1500000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681545540 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499333460 }, "_key": "!folders!ZZHIbaynhzVArA1p" } diff --git a/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json b/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json index 8227afb8..cf8ffd59 100644 --- a/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json +++ b/src/packs/domains/folders_Level_6_u5Lq2kfC8LlDAGDC.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "u5Lq2kfC8LlDAGDC", "description": "", - "sort": 550000, + "sort": 1600000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681547474 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499335115 }, "_key": "!folders!u5Lq2kfC8LlDAGDC" } diff --git a/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json b/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json index 7cc2eb64..1b10b32e 100644 --- a/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json +++ b/src/packs/domains/folders_Level_7_gEVGjjPrjqxxZkb5.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "gEVGjjPrjqxxZkb5", "description": "", - "sort": 575000, + "sort": 1700000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681548701 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499335821 }, "_key": "!folders!gEVGjjPrjqxxZkb5" } diff --git a/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json b/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json index f33373f3..6b91dfe3 100644 --- a/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json +++ b/src/packs/domains/folders_Level_8_qY4Zqc1Ch6p317uK.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "qY4Zqc1Ch6p317uK", "description": "", - "sort": 587500, + "sort": 1800000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681549490 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499336356 }, "_key": "!folders!qY4Zqc1Ch6p317uK" } diff --git a/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json b/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json index cbf3f378..6e3657b4 100644 --- a/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json +++ b/src/packs/domains/folders_Level_9_R5afi5bhq9ccnYY2.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "R5afi5bhq9ccnYY2", "description": "", - "sort": 600000, + "sort": 1900000, "flags": {}, "_stats": { "compendiumSource": null, @@ -15,8 +15,8 @@ "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "YNJ4HgHtFrTI89mx", - "modifiedTime": 1752681545540 + "lastModifiedBy": "MQSznptE5yLT7kj8", + "modifiedTime": 1754499336949 }, "_key": "!folders!R5afi5bhq9ccnYY2" } diff --git a/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json b/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json index 7906daf6..752fee05 100644 --- a/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json +++ b/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json @@ -6,13 +6,7 @@ "img": "icons/magic/nature/tree-twisted-glow-yellow.webp", "system": { "description": "

Once per long rest, you can create a space of natural serenity within Close range. When you spend a few minutes resting within the space, clear Stress equal to your Instinct, distributed as you choose between you and your allies.

", - "resource": { - "type": "simple", - "value": 1, - "recovery": "longRest", - "max": "1", - "icon": "" - }, + "resource": null, "actions": { "az7YUpxy1ysn12tO": { "type": "healing", @@ -108,7 +102,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754179740310, - "modifiedTime": 1754353339637, + "modifiedTime": 1754496518048, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!etaQ01yGJhBLDUqZ" diff --git a/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json b/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json index 84425f80..3c8fa5b5 100644 --- a/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json +++ b/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json @@ -6,13 +6,7 @@ "img": "icons/skills/social/theft-pickpocket-bribery-brown.webp", "system": { "description": "

Once per session, you can briefly call on a shady contact. Choose one of the following benefits and describe what brought them here to help you in this moment:

  • They provide 1 handful of gold, a unique tool, or a mundane object that the situation requires.

  • On your next action roll, their help provides a +3 bonus to the result of your Hope or Fear Die.

  • The next time you deal damage, they snipe from the shadows, adding 2d8 to your damage roll.

", - "resource": { - "type": "simple", - "value": 1, - "max": "", - "icon": "", - "recovery": "session" - }, + "resource": null, "actions": { "GZDYjtPh0lCJ5VNq": { "type": "effect", @@ -24,16 +18,17 @@ "cost": [ { "scalable": false, - "key": "cXbRm744mW6UXGam", + "key": "hitPoints", "value": 1, - "keyIsID": true, - "step": null + "keyIsID": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "session" }, "effects": [], "target": { @@ -63,8 +58,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754320389008, - "modifiedTime": 1754322535699, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754496752362, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!cXbRm744mW6UXGam" } diff --git a/src/packs/subclasses/feature_Eloquent_5bmB1YcxiJVNVXDM.json b/src/packs/subclasses/feature_Eloquent_5bmB1YcxiJVNVXDM.json index 0d80a6f6..daca1154 100644 --- a/src/packs/subclasses/feature_Eloquent_5bmB1YcxiJVNVXDM.json +++ b/src/packs/subclasses/feature_Eloquent_5bmB1YcxiJVNVXDM.json @@ -5,15 +5,7 @@ "img": "icons/skills/social/diplomacy-writing-letter.webp", "system": { "description": "

Your moving words boost morale. Once per session, when you encourage an ally, you can do one of the following:

  • Allow them to find a mundane object or tool they need.

  • Help an Ally without spending Hope.

  • Give them an additional downtime move during their next rest.

", - "resource": { - "type": "simple", - "value": 1, - "recovery": "session", - "max": "1", - "icon": "", - "diceStates": {}, - "dieFaces": "d4" - }, + "resource": null, "actions": { "o1MWnafbLsXnvSUl": { "type": "effect", @@ -25,8 +17,8 @@ "cost": [], "uses": { "value": null, - "max": "", - "recovery": null + "max": "1", + "recovery": "session" }, "effects": [], "target": { @@ -51,8 +43,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754174646194, - "modifiedTime": 1754236474581, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754494786779, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "ownership": { "default": 0, diff --git a/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json b/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json index 5319981f..57cbdc0c 100644 --- a/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json +++ b/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json @@ -16,9 +16,9 @@ "actionType": "action", "cost": [], "uses": { - "value": null, - "max": "", - "recovery": null + "value": 0, + "max": "1", + "recovery": "longRest" }, "damage": { "parts": [ @@ -83,9 +83,9 @@ "actionType": "action", "cost": [], "uses": { - "value": null, - "max": "", - "recovery": null + "value": 0, + "max": "1", + "recovery": "longRest" }, "effects": [ { @@ -110,8 +110,8 @@ "actionType": "action", "cost": [], "uses": { - "value": null, - "max": "", + "value": 0, + "max": "1", "recovery": "longRest" }, "damage": { @@ -228,8 +228,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754174646194, - "modifiedTime": 1754236401349, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754475491670, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "ownership": { "default": 0, diff --git a/src/packs/subclasses/feature_Loyal_Friend_xjZHD5Yo3Tu26rLm.json b/src/packs/subclasses/feature_Loyal_Friend_xjZHD5Yo3Tu26rLm.json index 55d09063..5f8c3ed7 100644 --- a/src/packs/subclasses/feature_Loyal_Friend_xjZHD5Yo3Tu26rLm.json +++ b/src/packs/subclasses/feature_Loyal_Friend_xjZHD5Yo3Tu26rLm.json @@ -7,7 +7,31 @@ "system": { "description": "

Once per long rest, when the damage from an attack would mark your companion’s last Stress or your last Hit Point and you’re within Close range of each other, you or your companion can rush to the other’s side and take that damage instead.

", "resource": null, - "actions": {}, + "actions": { + "Z82YQzYWo4eektMa": { + "type": "effect", + "_id": "Z82YQzYWo4eektMa", + "systemPath": "actions", + "description": "

Once per long rest, when the damage from an attack would mark your companion’s last Stress or your last Hit Point and you’re within Close range of each other, you or your companion can rush to the other’s side and take that damage instead.

", + "chatDisplay": true, + "actionType": "action", + "cost": [], + "uses": { + "value": null, + "max": "1", + "recovery": "longRest", + "consumeOnSuccess": false + }, + "effects": [], + "target": { + "type": "any", + "amount": null + }, + "name": "Rush", + "img": "icons/creatures/mammals/humanoid-wolf-dog-blue.webp", + "range": "close" + } + }, "originItemType": null, "originId": null }, @@ -26,8 +50,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754267956703, - "modifiedTime": 1754267994139, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754496703770, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!xjZHD5Yo3Tu26rLm" } diff --git a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json index b9f7dab7..312e055b 100644 --- a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json +++ b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json @@ -5,15 +5,7 @@ "img": "icons/tools/instruments/megaphone.webp", "system": { "description": "

Once per long rest, you can give a heartfelt, inspiring speech. All allies within Far range clear 2 Stress.

", - "resource": { - "type": "simple", - "value": 1, - "max": "1", - "icon": "", - "recovery": "longRest", - "diceStates": {}, - "dieFaces": "d4" - }, + "resource": null, "actions": { "WNtHiko4DRGbxKnm": { "type": "healing", @@ -25,15 +17,16 @@ "cost": [ { "scalable": false, - "key": "iLytX899psvrPRnG", + "key": "hitPoints", "value": 1, - "keyIsID": true, - "step": null + "keyIsID": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "", + "max": "1", "recovery": "longRest" }, "damage": { @@ -104,8 +97,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754174646194, - "modifiedTime": 1754236406644, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754494763682, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "ownership": { "default": 0, diff --git a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json index 70d9b630..cf0a8f93 100644 --- a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json +++ b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json @@ -9,8 +9,9 @@ "resource": { "type": "simple", "value": 1, + "progression": "decreasing", "max": "1", - "icon": "", + "icon": "fa-solid fa-hands-praying", "recovery": "longRest" }, "actions": { @@ -69,7 +70,7 @@ }, "target": { "type": "any", - "amount": null + "amount": 1 }, "effects": [], "roll": { @@ -98,7 +99,16 @@ "description": "

Once per long rest, touch a creature and clear 2 Hit Points or 2 Stress from them.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "GfOSgVJW8bS1OjNq", + "value": 1, + "keyIsID": true, + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -137,7 +147,7 @@ }, "target": { "type": "any", - "amount": null + "amount": 1 }, "effects": [], "roll": { diff --git a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json index cffaba38..cf2c658d 100644 --- a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json +++ b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json @@ -6,15 +6,7 @@ "img": "icons/magic/fire/elemental-fire-flying.webp", "system": { "description": "

Once per long rest, you can transform into a physical manifestation of your element. When you do, describe your transformation and choose two of the following benefits to gain until your next rest:

  • +4 bonus to your Severe threshold

  • +1 bonus to a character trait of your choice

  • +1 bonus to your Proficiency

  • +2 bonus to your Evasion

", - "resource": { - "type": "simple", - "value": 1, - "max": "1", - "icon": "", - "recovery": "longRest", - "diceStates": {}, - "dieFaces": "d4" - }, + "resource": null, "actions": { "RIbyJjEkCgqoDmyn": { "type": "effect", @@ -26,17 +18,17 @@ "cost": [ { "scalable": false, - "key": "th6HZwEFnVBjUtqm", + "key": "hitPoints", "value": 1, - "keyIsID": true, + "keyIsID": false, "step": null, "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "", - "recovery": null, + "max": "1", + "recovery": "longRest", "consumeOnSuccess": false }, "effects": [], @@ -250,8 +242,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754349515898, - "modifiedTime": 1754349515898, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754497438787, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!th6HZwEFnVBjUtqm" } diff --git a/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json b/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json index b681d64e..3d6055d2 100644 --- a/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json +++ b/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json @@ -6,13 +6,7 @@ "img": "icons/magic/nature/barrier-shield-wood-vines.webp", "system": { "description": "

Once per long rest, spend 2 Hope to clear 2 Hit Points on 1d4 allies within Close range.

", - "resource": { - "type": "simple", - "value": 1, - "max": "1", - "icon": "", - "recovery": "longRest" - }, + "resource": null, "actions": { "ozYzhQfRt5sp19di": { "type": "healing", @@ -23,7 +17,7 @@ "actionType": "action", "cost": [], "uses": { - "value": null, + "value": 0, "max": "1", "recovery": "longRest", "consumeOnSuccess": false @@ -101,7 +95,7 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754183079986, - "modifiedTime": 1754353582707, + "modifiedTime": 1754496541966, "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!items!2F1bUFY80oce97C9" diff --git a/src/packs/subclasses/folders_Bard_0DMzpFZB8A6vwpRX.json b/src/packs/subclasses/folders_Bard_0DMzpFZB8A6vwpRX.json index 1c1e3286..f325dd28 100644 --- a/src/packs/subclasses/folders_Bard_0DMzpFZB8A6vwpRX.json +++ b/src/packs/subclasses/folders_Bard_0DMzpFZB8A6vwpRX.json @@ -6,7 +6,7 @@ "sorting": "m", "_id": "0DMzpFZB8A6vwpRX", "description": "", - "sort": 200000, + "sort": 1000000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754236641265, - "modifiedTime": 1754268224220, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501841544, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!0DMzpFZB8A6vwpRX" } diff --git a/src/packs/subclasses/folders_Druid_AZWrSJzGXltzQhAJ.json b/src/packs/subclasses/folders_Druid_AZWrSJzGXltzQhAJ.json index 6be0ee6d..325060e7 100644 --- a/src/packs/subclasses/folders_Druid_AZWrSJzGXltzQhAJ.json +++ b/src/packs/subclasses/folders_Druid_AZWrSJzGXltzQhAJ.json @@ -6,7 +6,7 @@ "sorting": "m", "_id": "AZWrSJzGXltzQhAJ", "description": "", - "sort": 300000, + "sort": 1100000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754236669632, - "modifiedTime": 1754268224220, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501843662, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!AZWrSJzGXltzQhAJ" } diff --git a/src/packs/subclasses/folders_Guardian_WMlU3baiUdMgfuak.json b/src/packs/subclasses/folders_Guardian_WMlU3baiUdMgfuak.json index 21134aa6..daf366db 100644 --- a/src/packs/subclasses/folders_Guardian_WMlU3baiUdMgfuak.json +++ b/src/packs/subclasses/folders_Guardian_WMlU3baiUdMgfuak.json @@ -6,7 +6,7 @@ "sorting": "m", "_id": "WMlU3baiUdMgfuak", "description": "", - "sort": 400000, + "sort": 1200000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754245852289, - "modifiedTime": 1754268224220, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501845702, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!WMlU3baiUdMgfuak" } diff --git a/src/packs/subclasses/folders_Ranger_ArVAtkgkm5bYpKHL.json b/src/packs/subclasses/folders_Ranger_ArVAtkgkm5bYpKHL.json index 2c8fd45e..658ddf81 100644 --- a/src/packs/subclasses/folders_Ranger_ArVAtkgkm5bYpKHL.json +++ b/src/packs/subclasses/folders_Ranger_ArVAtkgkm5bYpKHL.json @@ -6,7 +6,7 @@ "sorting": "m", "_id": "ArVAtkgkm5bYpKHL", "description": "", - "sort": 500000, + "sort": 1300000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754268221221, - "modifiedTime": 1754268224220, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501849009, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!ArVAtkgkm5bYpKHL" } diff --git a/src/packs/subclasses/folders_Rogue_36dtJE1CPjPt76pP.json b/src/packs/subclasses/folders_Rogue_36dtJE1CPjPt76pP.json index 9209901b..6593650d 100644 --- a/src/packs/subclasses/folders_Rogue_36dtJE1CPjPt76pP.json +++ b/src/packs/subclasses/folders_Rogue_36dtJE1CPjPt76pP.json @@ -6,7 +6,7 @@ "sorting": "m", "_id": "36dtJE1CPjPt76pP", "description": "", - "sort": 550000, + "sort": 1400000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754322803534, - "modifiedTime": 1754322806911, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501852870, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!36dtJE1CPjPt76pP" } diff --git a/src/packs/subclasses/folders_Seraph_RZOEu0ZYQNPs6O2c.json b/src/packs/subclasses/folders_Seraph_RZOEu0ZYQNPs6O2c.json index 8fac588e..3854caa2 100644 --- a/src/packs/subclasses/folders_Seraph_RZOEu0ZYQNPs6O2c.json +++ b/src/packs/subclasses/folders_Seraph_RZOEu0ZYQNPs6O2c.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "RZOEu0ZYQNPs6O2c", "description": "", - "sort": 0, + "sort": 1500000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754352793139, - "modifiedTime": 1754352793139, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754501855742, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!RZOEu0ZYQNPs6O2c" } diff --git a/src/packs/subclasses/folders_Sorcerer_F0mW5ofdyyfE2hHo.json b/src/packs/subclasses/folders_Sorcerer_F0mW5ofdyyfE2hHo.json index 8358cbaf..5aaa1502 100644 --- a/src/packs/subclasses/folders_Sorcerer_F0mW5ofdyyfE2hHo.json +++ b/src/packs/subclasses/folders_Sorcerer_F0mW5ofdyyfE2hHo.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "F0mW5ofdyyfE2hHo", "description": "", - "sort": 800000, + "sort": 1600000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754349604935, - "modifiedTime": 1754349604956, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754501856827, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!F0mW5ofdyyfE2hHo" } diff --git a/src/packs/subclasses/folders_Subclass_Features_Sfpr4iK1cGrmncok.json b/src/packs/subclasses/folders_Subclass_Features_Sfpr4iK1cGrmncok.json index a4f97fbe..dbbb6ee9 100644 --- a/src/packs/subclasses/folders_Subclass_Features_Sfpr4iK1cGrmncok.json +++ b/src/packs/subclasses/folders_Subclass_Features_Sfpr4iK1cGrmncok.json @@ -6,7 +6,7 @@ "sorting": "m", "_id": "Sfpr4iK1cGrmncok", "description": "", - "sort": 100000, + "sort": 900000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754174646170, - "modifiedTime": 1754268224220, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501800511, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!Sfpr4iK1cGrmncok" } diff --git a/src/packs/subclasses/folders_Warrior_aTyhcJgENR9uI7u4.json b/src/packs/subclasses/folders_Warrior_aTyhcJgENR9uI7u4.json index 631be023..d9f88587 100644 --- a/src/packs/subclasses/folders_Warrior_aTyhcJgENR9uI7u4.json +++ b/src/packs/subclasses/folders_Warrior_aTyhcJgENR9uI7u4.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "aTyhcJgENR9uI7u4", "description": "", - "sort": 600000, + "sort": 1700000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754256060634, - "modifiedTime": 1754268224220, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501859285, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!aTyhcJgENR9uI7u4" } diff --git a/src/packs/subclasses/folders_Wizard_Bb9SLVpYHGBrOB59.json b/src/packs/subclasses/folders_Wizard_Bb9SLVpYHGBrOB59.json index 46fe527d..744a1230 100644 --- a/src/packs/subclasses/folders_Wizard_Bb9SLVpYHGBrOB59.json +++ b/src/packs/subclasses/folders_Wizard_Bb9SLVpYHGBrOB59.json @@ -6,7 +6,7 @@ "sorting": "a", "_id": "Bb9SLVpYHGBrOB59", "description": "", - "sort": 700000, + "sort": 1800000, "flags": {}, "_stats": { "compendiumSource": null, @@ -16,8 +16,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754253525540, - "modifiedTime": 1754268224220, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1754501860252, + "lastModifiedBy": "MQSznptE5yLT7kj8" }, "_key": "!folders!Bb9SLVpYHGBrOB59" } diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index 35262b3b..f99646b7 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -486,8 +486,43 @@ flex-wrap: wrap; margin-top: 2px; - button { - white-space: nowrap; + .item-button { + display: flex; + border: 1px solid light-dark(#18162e, #18162e); + color: light-dark(#18162e, #18162e); + outline: none; + box-shadow: none; + border-radius: 6px; + + button { + padding: 6px 6px 6px 10px; + border-radius: 3px 0px 0px 3px; + color: light-dark(@dark-blue, @dark-blue); + white-space: nowrap; + border: 0; + font-family: @font-body; + + &:hover { + color: light-dark(@dark-blue, @golden); + } + + &:last-child { + padding: 6px; + background: light-dark(@dark-blue-10, @golden-secondary); + border-radius: 0px 3px 3px 0px; + color: light-dark(@dark-blue, @dark-golden); + + &:hover { + background: light-dark(@light-black, @dark-blue); + color: light-dark(@dark-blue, @golden-secondary); + } + } + } + + .spacer { + border-right: 1px solid black; + content: ''; + } } } } @@ -644,6 +679,12 @@ } &.theme-light { + .tagify { + tag div img { + filter: @beige-filter; + } + } + .tagify__dropdown { .tagify__dropdown__wrapper { background-image: url(../assets/parchments/dh-parchment-light.png); diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index 0ca383d5..e79a88c7 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -24,13 +24,15 @@ width: 100%; list-style-type: none; - &:not(.single-img):hover { - .inventory-item-header .img-portait { - .roll-img { - opacity: 1; - } - .item-img { - opacity: 0; + &:not(.single-img) { + .inventory-item-header:hover { + .img-portait { + .roll-img { + opacity: 1; + } + .item-img { + opacity: 0; + } } } } diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less index aed3b7dc..64edfc6f 100755 --- a/styles/less/utils/colors.less +++ b/styles/less/utils/colors.less @@ -5,6 +5,7 @@ @golden-10: #f3c26710; @golden-40: #f3c26740; @golden-bg: #f3c2671a; +@golden-secondary: #eaaf42; @golden-filter: brightness(0) saturate(100%) invert(89%) sepia(13%) saturate(2008%) hue-rotate(332deg) brightness(99%) contrast(92%); diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index e49ad1b5..c79430ad 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -146,9 +146,17 @@ Parameters: {{#if (and showActions (eq item.type 'feature'))}}
{{#each item.system.actions as | action |}} - +
+ + {{#if action.uses.max}} +
+ + {{/if}} +
{{/each}}
{{/if}} From 6d1d0335cc1126210d88c08f68d4061e11c639c3 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:18:36 +0200 Subject: [PATCH 05/24] Fixed so unnarmed strike does a roll instead of opening the sheet (#678) --- templates/sheets/global/partials/inventory-item-V2.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index c79430ad..fcaa2c38 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -19,7 +19,7 @@ Parameters: data-action-id="{{item.id}}" {{/if}} data-item-uuid="{{item.uuid}}" data-type="{{type}}" data-no-compendium-edit="{{noCompendiumEdit}}" draggable="true">
{{!-- Image --}} -
From fd18dfd92f4d8da2d3526a22a6e4cdbde70f6cc2 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:19:05 +0200 Subject: [PATCH 06/24] Renamed folder from Daggerheart to Daggerheart SRD (#676) --- system.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system.json b/system.json index 05d12975..470c7ff2 100644 --- a/system.json +++ b/system.json @@ -169,7 +169,7 @@ ], "packFolders": [ { - "name": "Daggerheart", + "name": "Daggerheart SRD", "sorting": "m", "color": "#08718c", "packs": ["adversaries", "environments", "journals"], From 48e386d8ab21fe34743b86beec2574bbe964931b Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:19:31 +0200 Subject: [PATCH 07/24] Removed id from features sheet (#677) --- module/applications/sheets/items/feature.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/module/applications/sheets/items/feature.mjs b/module/applications/sheets/items/feature.mjs index fcbec97f..1575067b 100644 --- a/module/applications/sheets/items/feature.mjs +++ b/module/applications/sheets/items/feature.mjs @@ -3,7 +3,6 @@ import DHBaseItemSheet from '../api/base-item.mjs'; export default class FeatureSheet extends DHBaseItemSheet { /** @inheritDoc */ static DEFAULT_OPTIONS = { - id: 'daggerheart-feature', classes: ['feature'], actions: {} }; From f5febe74fe17120c2a815d28624bb0ecb7124243 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:20:05 +0200 Subject: [PATCH 08/24] . (#675) --- .../characterCreation/characterCreation.mjs | 12 +++++++++++- module/helpers/utils.mjs | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index 2b251a8b..cdc80bef 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -370,13 +370,18 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl ); context.armor = { ...this.equipment.armor, - suggestion: { ...suggestions.armor, taken: suggestions.armor?.uuid === this.equipment.armor?.uuid }, + suggestion: { + ...suggestions.armor, + uuid: suggestions.armor?.uuid, + taken: suggestions.armor?.uuid === this.equipment.armor?.uuid + }, compendium: 'armors' }; context.primaryWeapon = { ...this.equipment.primaryWeapon, suggestion: { ...suggestions.primaryWeapon, + uuid: suggestions.primaryWeapon?.uuid, taken: suggestions.primaryWeapon?.uuid === this.equipment.primaryWeapon?.uuid }, compendium: 'weapons' @@ -385,6 +390,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl ...this.equipment.secondaryWeapon, suggestion: { ...suggestions.secondaryWeapon, + uuid: suggestions.secondaryWeapon?.uuid, taken: suggestions.secondaryWeapon?.uuid === this.equipment.secondaryWeapon?.uuid }, disabled: this.equipment.primaryWeapon?.system?.burden === burden.twoHanded.value, @@ -679,6 +685,10 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl return; } + if (item.system.burden === CONFIG.DH.GENERAL.burden.twoHanded.value) { + this.equipment.secondaryWeapon = {}; + } + this.equipment.primaryWeapon = { ...item, uuid: item.uuid }; } else if (item.type === 'weapon' && event.target.closest('.secondary-weapon-card')) { if (this.equipment.primaryWeapon?.system?.burden === burden.twoHanded.value) { diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index 2447727a..89088dad 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -362,6 +362,7 @@ export async function createEmbeddedItemWithEffects(actor, baseData, update) { const [doc] = await actor.createEmbeddedDocuments('Item', [ { ...(update ?? data), + ...baseData, id: data.id, uuid: data.uuid, effects: data.effects?.map(effect => effect.toObject()) From 0108e3d222cec97a3bdfe14d6d4edd827f2a3601 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:20:46 +0200 Subject: [PATCH 09/24] Bunch o fxies (#674) --- module/applications/dialogs/downtime.mjs | 10 +++++++--- module/data/actor/character.mjs | 2 +- module/data/fields/action/usesField.mjs | 6 +++++- module/data/fields/actionField.mjs | 6 +++++- templates/dialogs/dice-roll/costSelection.hbs | 2 +- templates/sheets/actors/character/header.hbs | 2 +- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index 15ffc189..10708d02 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -94,7 +94,10 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV const actionItems = this.actor.items.reduce((acc, x) => { if (x.system.actions) { const recoverable = x.system.actions.reduce((acc, action) => { - if (action.uses.recovery && (action.uses.recovery === 'shortRest') === this.shortrest) { + if ( + (action.uses.recovery && (action.uses.recovery === 'longRest') === !this.shortrest) || + action.uses.recovery === 'shortRest' + ) { acc.push({ title: x.name, name: action.name, @@ -116,7 +119,8 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV if ( x.system.resource && x.system.resource.type && - (x.system.resource.recovery === 'shortRest') === this.shortrest + ((x.system.resource.recovery === 'longRest') === !this.shortrest || + x.system.resource.recovery === 'shortRest') ) { acc.push({ title: game.i18n.localize(`TYPES.Item.${x.type}`), @@ -226,7 +230,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV ) { for (var data of this.refreshables.actionItems) { const action = await foundry.utils.fromUuid(data.uuid); - await action.parent.parent.update({ [`system.actions.${action.id}.uses.value`]: action.uses.max ?? 1 }); + await action.parent.parent.update({ [`system.actions.${action.id}.uses.value`]: 0 }); } for (var data of this.refreshables.resourceItems) { diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 8e665265..ee84aa7d 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -73,7 +73,7 @@ export default class DhCharacter extends BaseDataActor { ), gold: new fields.SchemaField({ coins: new fields.NumberField({ initial: 0, integer: true }), - handfulls: new fields.NumberField({ initial: 0, integer: true }), + handfulls: new fields.NumberField({ initial: 1, integer: true }), bags: new fields.NumberField({ initial: 0, integer: true }), chests: new fields.NumberField({ initial: 0, integer: true }) }), diff --git a/module/data/fields/action/usesField.mjs b/module/data/fields/action/usesField.mjs index 14ceba61..3993ca3b 100644 --- a/module/data/fields/action/usesField.mjs +++ b/module/data/fields/action/usesField.mjs @@ -12,7 +12,10 @@ export default class UsesField extends fields.SchemaField { initial: null, nullable: true }), - consumeOnSuccess: new fields.BooleanField({ initial: false, label: "DAGGERHEART.ACTIONS.Settings.consumeOnSuccess.label" }) + consumeOnSuccess: new fields.BooleanField({ + initial: false, + label: 'DAGGERHEART.ACTIONS.Settings.consumeOnSuccess.label' + }) }; super(usesFields, options, context); } @@ -30,6 +33,7 @@ export default class UsesField extends fields.SchemaField { if (!uses) return null; return { ...uses, + remaining: this.remainingUses, enabled: uses.hasOwnProperty('enabled') ? uses.enabled : true }; } diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index a31197b5..c3bdcaaa 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -1,4 +1,5 @@ import DHActionConfig from '../../applications/sheets-configs/action-config.mjs'; +import { itemAbleRollParse } from '../../helpers/utils.mjs'; import MappingField from './mappingField.mjs'; /** @@ -167,7 +168,10 @@ export function ActionMixin(Base) { get remainingUses() { if (!this.uses) return null; - return Math.max((this.uses.max ?? 0) - (this.uses.value ?? 0), 0); + return Math.max( + (this.uses.max ? itemAbleRollParse(this.uses.max, this.actor) : 0) - (this.uses.value ?? 0), + 0 + ); } static async create(data, operation = {}) { diff --git a/templates/dialogs/dice-roll/costSelection.hbs b/templates/dialogs/dice-roll/costSelection.hbs index cf906538..765fbaf9 100644 --- a/templates/dialogs/dice-roll/costSelection.hbs +++ b/templates/dialogs/dice-roll/costSelection.hbs @@ -9,7 +9,7 @@
- + {{/if}} {{#each costs as | cost index |}} diff --git a/templates/sheets/actors/character/header.hbs b/templates/sheets/actors/character/header.hbs index 827d49d6..4c4304aa 100644 --- a/templates/sheets/actors/character/header.hbs +++ b/templates/sheets/actors/character/header.hbs @@ -127,6 +127,6 @@
{{#> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}} - + {{/'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}} \ No newline at end of file From cd30aeaa7d28e76b395b4cb93efa7fdcb22ecdbc Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:30:19 +0200 Subject: [PATCH 10/24] [Fix] 680 - VeryFar Ruler (#692) * . * Removed veryFar template from Stardrop Feature --- daggerheart.mjs | 5 +- lang/en.json | 4 -- module/applications/settings/_module.mjs | 1 - .../settings/rangeMeasurementSettings.mjs | 66 ------------------- module/canvas/placeables/measuredTemplate.mjs | 6 +- module/canvas/placeables/ruler.mjs | 2 +- module/canvas/placeables/tokenRuler.mjs | 2 +- module/config/generalConfig.mjs | 8 ++- module/config/settingsConfig.mjs | 1 - module/data/settings/RangeMeasurement.mjs | 25 ------- module/data/settings/VariantRules.mjs | 25 ++++++- module/data/settings/_module.mjs | 1 - module/enrichers/TemplateEnricher.mjs | 8 +-- module/helpers/utils.mjs | 4 +- module/systemRegistration/settings.mjs | 23 +------ .../settings/range-measurement-settings.hbs | 25 ------- templates/settings/variant-rules.hbs | 13 +++- 17 files changed, 56 insertions(+), 163 deletions(-) delete mode 100644 module/applications/settings/rangeMeasurementSettings.mjs delete mode 100644 module/data/settings/RangeMeasurement.mjs delete mode 100644 templates/settings/range-measurement-settings.hbs diff --git a/daggerheart.mjs b/daggerheart.mjs index 4f9c4a44..a2f41735 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -259,7 +259,10 @@ Hooks.on('moveToken', async (movedToken, data) => { const rangeDependantEffects = movedToken.actor.effects.filter(effect => effect.system.rangeDependence?.enabled); const updateEffects = async (disposition, token, effects, effectUpdates) => { - const rangeMeasurement = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement); + const rangeMeasurement = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.variantRules + ).rangeMeasurement; for (let effect of effects.filter(x => x.system.rangeDependence?.enabled)) { const { target, range, type } = effect.system.rangeDependence; diff --git a/lang/en.json b/lang/en.json index 927953ac..5bcc3dd4 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2210,10 +2210,6 @@ "actionTokens": { "enabled": { "label": "Enabled" }, "tokens": { "label": "Tokens" } - }, - "useCoins": { - "label": "Use Coins", - "hint": "test" } } }, diff --git a/module/applications/settings/_module.mjs b/module/applications/settings/_module.mjs index de11242e..b565777c 100644 --- a/module/applications/settings/_module.mjs +++ b/module/applications/settings/_module.mjs @@ -1,5 +1,4 @@ export { default as DhAppearanceSettings } from './appearanceSettings.mjs'; export { default as DhAutomationSettings } from './automationSettings.mjs'; export { default as DhHomebrewSettings } from './homebrewSettings.mjs'; -export { default as DhRangeMeasurementSettings } from './rangeMeasurementSettings.mjs'; export { default as DhVariantRuleSettings } from './variantRuleSettings.mjs'; diff --git a/module/applications/settings/rangeMeasurementSettings.mjs b/module/applications/settings/rangeMeasurementSettings.mjs deleted file mode 100644 index 410b2cbe..00000000 --- a/module/applications/settings/rangeMeasurementSettings.mjs +++ /dev/null @@ -1,66 +0,0 @@ -import { DhRangeMeasurement } from '../../data/settings/_module.mjs'; - -const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; - -export default class DhRangeMeasurementSettings extends HandlebarsApplicationMixin(ApplicationV2) { - constructor() { - super({}); - - this.settings = new DhRangeMeasurement( - game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement).toObject() - ); - } - - get title() { - return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); - } - - static DEFAULT_OPTIONS = { - tag: 'form', - id: 'daggerheart-automation-settings', - classes: ['daggerheart', 'dialog', 'dh-style', 'setting'], - position: { width: '600', height: 'auto' }, - window: { - icon: 'fa-solid fa-gears' - }, - actions: { - reset: this.reset, - save: this.save - }, - form: { handler: this.updateData, submitOnChange: true } - }; - - static PARTS = { - main: { - template: 'systems/daggerheart/templates/settings/range-measurement-settings.hbs' - } - }; - - async _prepareContext(_options) { - const context = await super._prepareContext(_options); - context.settingFields = this.settings; - - return context; - } - - static async updateData(event, element, formData) { - const updatedSettings = foundry.utils.expandObject(formData.object); - - await this.settings.updateSource(updatedSettings); - this.render(); - } - - static async reset() { - this.settings = new DhRangeMeasurement(); - this.render(); - } - - static async save() { - await game.settings.set( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement, - this.settings.toObject() - ); - this.close(); - } -} diff --git a/module/canvas/placeables/measuredTemplate.mjs b/module/canvas/placeables/measuredTemplate.mjs index 42601d6c..c9950650 100644 --- a/module/canvas/placeables/measuredTemplate.mjs +++ b/module/canvas/placeables/measuredTemplate.mjs @@ -4,8 +4,8 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur const rangeMeasurementSettings = game.settings.get( CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement - ); + CONFIG.DH.SETTINGS.gameSettings.variantRules + ).rangeMeasurement; if (rangeMeasurementSettings.enabled) { const splitRulerText = this.ruler.text.split(' '); if (splitRulerText.length > 0) { @@ -29,7 +29,7 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur if (distance <= settings.far) { return game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name'); } - if (distance <= settings.veryFar) { + if (distance > settings.far) { return game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name'); } diff --git a/module/canvas/placeables/ruler.mjs b/module/canvas/placeables/ruler.mjs index 498ee3df..6585a1cd 100644 --- a/module/canvas/placeables/ruler.mjs +++ b/module/canvas/placeables/ruler.mjs @@ -5,7 +5,7 @@ export default class DhpRuler extends foundry.canvas.interaction.Ruler { const context = super._getWaypointLabelContext(waypoint, state); if (!context) return; - const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement); + const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement; if (range.enabled) { const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range); diff --git a/module/canvas/placeables/tokenRuler.mjs b/module/canvas/placeables/tokenRuler.mjs index ea30ca95..ff8fc0d5 100644 --- a/module/canvas/placeables/tokenRuler.mjs +++ b/module/canvas/placeables/tokenRuler.mjs @@ -5,7 +5,7 @@ export default class DhpTokenRuler extends foundry.canvas.placeables.tokens.Toke const context = super._getWaypointLabelContext(waypoint, state); if (!context) return; - const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement); + const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement; if (range.enabled) { const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range); diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 0968c0c1..7785b6a6 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -21,7 +21,7 @@ export const ruleChoice = { } }; -export const range = { +export const templateRanges = { self: { id: 'self', short: 's', @@ -56,7 +56,11 @@ export const range = { label: 'DAGGERHEART.CONFIG.Range.far.name', description: 'DAGGERHEART.CONFIG.Range.far.description', distance: 20 - }, + } +}; + +export const range = { + ...templateRanges, veryFar: { id: 'veryFar', short: 'vf', diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index df3cb619..dd8aeffe 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -20,7 +20,6 @@ export const menu = { export const gameSettings = { Automation: 'Automation', Homebrew: 'Homebrew', - RangeMeasurement: 'RangeMeasurement', appearance: 'Appearance', variantRules: 'VariantRules', Resources: { diff --git a/module/data/settings/RangeMeasurement.mjs b/module/data/settings/RangeMeasurement.mjs deleted file mode 100644 index 552963f0..00000000 --- a/module/data/settings/RangeMeasurement.mjs +++ /dev/null @@ -1,25 +0,0 @@ -export default class DhRangeMeasurement extends foundry.abstract.DataModel { - static defineSchema() { - const fields = foundry.data.fields; - return { - enabled: new fields.BooleanField({ required: true, initial: true, label: 'DAGGERHEART.GENERAL.enabled' }), - melee: new fields.NumberField({ required: true, initial: 5, label: 'DAGGERHEART.CONFIG.Range.melee.name' }), - veryClose: new fields.NumberField({ - required: true, - initial: 15, - label: 'DAGGERHEART.CONFIG.Range.veryClose.name' - }), - close: new fields.NumberField({ - required: true, - initial: 30, - label: 'DAGGERHEART.CONFIG.Range.close.name' - }), - far: new fields.NumberField({ required: true, initial: 60, label: 'DAGGERHEART.CONFIG.Range.far.name' }), - veryFar: new fields.NumberField({ - required: true, - initial: 120, - label: 'DAGGERHEART.CONFIG.Range.veryFar.name' - }) - }; - } -} diff --git a/module/data/settings/VariantRules.mjs b/module/data/settings/VariantRules.mjs index 4428ae75..ad7d707a 100644 --- a/module/data/settings/VariantRules.mjs +++ b/module/data/settings/VariantRules.mjs @@ -17,9 +17,28 @@ export default class DhVariantRules extends foundry.abstract.DataModel { label: 'DAGGERHEART.SETTINGS.VariantRules.FIELDS.actionTokens.tokens.label' }) }), - useCoins: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.VariantRules.FIELDS.useCoins.label' + rangeMeasurement: new fields.SchemaField({ + enabled: new fields.BooleanField({ + required: true, + initial: true, + label: 'DAGGERHEART.GENERAL.enabled' + }), + melee: new fields.NumberField({ + required: true, + initial: 5, + label: 'DAGGERHEART.CONFIG.Range.melee.name' + }), + veryClose: new fields.NumberField({ + required: true, + initial: 15, + label: 'DAGGERHEART.CONFIG.Range.veryClose.name' + }), + close: new fields.NumberField({ + required: true, + initial: 30, + label: 'DAGGERHEART.CONFIG.Range.close.name' + }), + far: new fields.NumberField({ required: true, initial: 60, label: 'DAGGERHEART.CONFIG.Range.far.name' }) }) }; } diff --git a/module/data/settings/_module.mjs b/module/data/settings/_module.mjs index 032974a9..db1fbfec 100644 --- a/module/data/settings/_module.mjs +++ b/module/data/settings/_module.mjs @@ -1,5 +1,4 @@ export { default as DhAppearance } from './Appearance.mjs'; export { default as DhAutomation } from './Automation.mjs'; export { default as DhHomebrew } from './Homebrew.mjs'; -export { default as DhRangeMeasurement } from './RangeMeasurement.mjs'; export { default as DhVariantRules } from './VariantRules.mjs'; diff --git a/module/enrichers/TemplateEnricher.mjs b/module/enrichers/TemplateEnricher.mjs index 7f45b266..93dd6b96 100644 --- a/module/enrichers/TemplateEnricher.mjs +++ b/module/enrichers/TemplateEnricher.mjs @@ -1,5 +1,3 @@ -import { range as configRange } from '../config/generalConfig.mjs'; - export default function DhTemplateEnricher(match, _options) { const parts = match[1].split('|').map(x => x.trim()); @@ -17,7 +15,7 @@ export default function DhTemplateEnricher(match, _options) { type = matchedType; break; case 'range': - const matchedRange = Object.values(configRange).find( + const matchedRange = Object.values(CONFIG.DH.GENERAL.templateRanges).find( x => x.id.toLowerCase() === split[1] || x.short === split[1] ); range = matchedRange?.id; @@ -55,7 +53,9 @@ export const renderMeasuredTemplate = async event => { ? '180' : undefined; - const baseDistance = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement)[range]; + const baseDistance = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement[ + range + ]; const distance = type === CONFIG.DH.GENERAL.templateTypes.EMANATION ? baseDistance + 2.5 : baseDistance; const { width, height } = game.canvas.scene.dimensions; diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index 89088dad..7b588fc7 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -313,8 +313,10 @@ export const itemAbleRollParse = (value, actor, item) => { const isItemTarget = value.toLowerCase().includes('item.@'); const slicedValue = isItemTarget ? value.replaceAll(/item\.@/gi, '@') : value; + const model = isItemTarget ? item : actor; + try { - return Roll.replaceFormulaData(slicedValue, isItemTarget ? item : actor); + return Roll.replaceFormulaData(slicedValue, model?.getRollData?.() ?? model); } catch (_) { return ''; } diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index fea12acd..d100bcc0 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -1,17 +1,10 @@ import { defaultLevelTiers, DhLevelTiers } from '../data/levelTier.mjs'; import DhCountdowns from '../data/countdowns.mjs'; -import { - DhAppearance, - DhAutomation, - DhHomebrew, - DhRangeMeasurement, - DhVariantRules -} from '../data/settings/_module.mjs'; +import { DhAppearance, DhAutomation, DhHomebrew, DhVariantRules } from '../data/settings/_module.mjs'; import { DhAppearanceSettings, DhAutomationSettings, DhHomebrewSettings, - DhRangeMeasurementSettings, DhVariantRuleSettings } from '../applications/settings/_module.mjs'; @@ -58,12 +51,6 @@ const registerMenuSettings = () => { } } }); - - game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement, { - scope: 'world', - config: false, - type: DhRangeMeasurement - }); }; const registerMenus = () => { @@ -83,14 +70,6 @@ const registerMenus = () => { type: DhHomebrewSettings, restricted: true }); - game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.menu.Range.Name, { - name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.range.name'), - label: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.range.label'), - hint: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.range.hint'), - icon: CONFIG.DH.SETTINGS.menu.Range.Icon, - type: DhRangeMeasurementSettings, - restricted: true - }); game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance, { name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.title'), diff --git a/templates/settings/range-measurement-settings.hbs b/templates/settings/range-measurement-settings.hbs deleted file mode 100644 index 617d1899..00000000 --- a/templates/settings/range-measurement-settings.hbs +++ /dev/null @@ -1,25 +0,0 @@ -
-
-

{{localize 'DAGGERHEART.SETTINGS.Menu.range.name'}}

-
-
- {{formGroup settingFields.schema.fields.enabled value=settingFields._source.enabled localize=true}} - {{formGroup settingFields.schema.fields.melee value=settingFields._source.melee localize=true}} - {{formGroup settingFields.schema.fields.veryClose value=settingFields._source.veryClose localize=true}} - {{formGroup settingFields.schema.fields.close value=settingFields._source.close localize=true}} - {{formGroup settingFields.schema.fields.far value=settingFields._source.far localize=true}} - {{formGroup settingFields.schema.fields.veryFar value=settingFields._source.veryFar localize=true}} -
- -
- - -
-
- \ No newline at end of file diff --git a/templates/settings/variant-rules.hbs b/templates/settings/variant-rules.hbs index 75a5534b..03027f69 100644 --- a/templates/settings/variant-rules.hbs +++ b/templates/settings/variant-rules.hbs @@ -3,6 +3,17 @@

{{localize 'DAGGERHEART.SETTINGS.Menu.variantRules.name'}}

+
+ {{localize 'DAGGERHEART.SETTINGS.Menu.range.name'}} + + {{formGroup settingFields.schema.fields.rangeMeasurement.fields.enabled value=settingFields._source.rangeMeasurement.enabled localize=true}} + {{formGroup settingFields.schema.fields.rangeMeasurement.fields.melee value=settingFields._source.rangeMeasurement.melee localize=true}} + {{formGroup settingFields.schema.fields.rangeMeasurement.fields.veryClose value=settingFields._source.rangeMeasurement.veryClose localize=true}} + {{formGroup settingFields.schema.fields.rangeMeasurement.fields.close value=settingFields._source.rangeMeasurement.close localize=true}} + {{formGroup settingFields.schema.fields.rangeMeasurement.fields.far value=settingFields._source.rangeMeasurement.far localize=true}} + {{formGroup settingFields.schema.fields.rangeMeasurement.fields.veryFar value=settingFields._source.rangeMeasurement.veryFar localize=true}} +
+
@@ -12,8 +23,6 @@
- {{formGroup settingFields.schema.fields.useCoins value=settingFields._source.useCoins localize=true }} -
\ No newline at end of file From df99d0e4c6a5dbe65d640896c1df988907567d88 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 17:11:32 +0200 Subject: [PATCH 12/24] [Feature] 688 - Token Resource Bar (#699) * Fixed resource bar to a segmented one in one colour. Fixed handful localization * Darkened the blue --- lang/en.json | 4 +-- .../applications/sheets/actors/character.mjs | 2 +- module/canvas/placeables/token.mjs | 36 +++++++++++++++++++ module/config/itemConfig.mjs | 2 +- module/data/actor/character.mjs | 2 +- module/data/settings/Homebrew.mjs | 6 ++-- templates/settings/homebrew-settings.hbs | 2 +- .../settings/homebrew-settings/settings.hbs | 2 +- .../sheets/actors/character/inventory.hbs | 6 ++-- 9 files changed, 49 insertions(+), 13 deletions(-) diff --git a/lang/en.json b/lang/en.json index 5bcc3dd4..84fdaf18 100755 --- a/lang/en.json +++ b/lang/en.json @@ -880,7 +880,7 @@ "Gold": { "title": "Gold", "coins": "Coins", - "handfulls": "Handfulls", + "handfuls": "Handfuls", "bags": "Bags", "chests": "Chests" }, @@ -2138,7 +2138,7 @@ "title": "Currency Overrides", "currencyName": "Currency Name", "coinName": "Coin Name", - "handfullName": "Handfull Name", + "handfulName": "Handful Name", "bagName": "Bag Name", "chestName": "Chest Name" }, diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 76ca7562..457d949d 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -156,7 +156,7 @@ export default class CharacterSheet extends DHBaseActorSheet { currency: { title: game.i18n.localize('DAGGERHEART.CONFIG.Gold.title'), coins: game.i18n.localize('DAGGERHEART.CONFIG.Gold.coins'), - handfulls: game.i18n.localize('DAGGERHEART.CONFIG.Gold.handfulls'), + handfuls: game.i18n.localize('DAGGERHEART.CONFIG.Gold.handfuls'), bags: game.i18n.localize('DAGGERHEART.CONFIG.Gold.bags'), chests: game.i18n.localize('DAGGERHEART.CONFIG.Gold.chests') } diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index 4c2ae4ed..e6179b10 100644 --- a/module/canvas/placeables/token.mjs +++ b/module/canvas/placeables/token.mjs @@ -53,4 +53,40 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { this.effects.renderable = true; this.renderFlags.set({ refreshEffects: true }); } + + /** @inheritDoc */ + _drawBar(number, bar, data) { + const val = Number(data.value); + const pct = Math.clamp(val, 0, data.max) / data.max; + + // Determine sizing + const { width, height } = this.document.getSize(); + const s = canvas.dimensions.uiScale; + const bw = width; + const bh = 8 * (this.document.height >= 2 ? 1.5 : 1) * s; + + // Determine the color to use + const fillColor = + number === 0 ? foundry.utils.Color.fromRGB([1, 0, 0]) : foundry.utils.Color.fromString('#0032b1'); + + // Draw the bar + const widthUnit = bw / data.max; + bar.clear().lineStyle(s, 0x000000, 1.0); + const sections = [...Array(data.max).keys()]; + for (let mark of sections) { + const x = mark * widthUnit; + const marked = mark + 1 <= data.value; + const color = marked ? fillColor : foundry.utils.Color.fromRGB([0, 0, 0]); + if (mark === 0 || mark === sections.length - 1) { + bar.beginFill(color, marked ? 1.0 : 0.5).drawRect(x, 0, widthUnit, bh, 2 * s); // Would like drawRoundedRect, but it's very troublsome with the corners. Leaving for now. + } else { + bar.beginFill(color, marked ? 1.0 : 0.5).drawRect(x, 0, widthUnit, bh, 2 * s); + } + } + + // Set position + const posY = number === 0 ? height - bh : 0; + bar.position.set(0, posY); + return true; + } } diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index e54abc8b..cb4c5f97 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -857,7 +857,7 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description', img: 'icons/commodities/currency/coins-crown-stack-gold.webp', - // Should cost handfull of gold, + // Should cost handful of gold, effects: [ { name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.name', diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index ee84aa7d..613f82da 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -73,7 +73,7 @@ export default class DhCharacter extends BaseDataActor { ), gold: new fields.SchemaField({ coins: new fields.NumberField({ initial: 0, integer: true }), - handfulls: new fields.NumberField({ initial: 1, integer: true }), + handfuls: new fields.NumberField({ initial: 1, integer: true }), bags: new fields.NumberField({ initial: 0, integer: true }), chests: new fields.NumberField({ initial: 0, integer: true }) }), diff --git a/module/data/settings/Homebrew.mjs b/module/data/settings/Homebrew.mjs index d2296dc6..e18fee39 100644 --- a/module/data/settings/Homebrew.mjs +++ b/module/data/settings/Homebrew.mjs @@ -45,10 +45,10 @@ export default class DhHomebrew extends foundry.abstract.DataModel { initial: 'Coins', label: 'DAGGERHEART.SETTINGS.Homebrew.currency.coinName' }), - handfulls: new fields.StringField({ + handfuls: new fields.StringField({ required: true, - initial: 'Handfulls', - label: 'DAGGERHEART.SETTINGS.Homebrew.currency.handfullName' + initial: 'Handfuls', + label: 'DAGGERHEART.SETTINGS.Homebrew.currency.handfulName' }), bags: new fields.StringField({ required: true, diff --git a/templates/settings/homebrew-settings.hbs b/templates/settings/homebrew-settings.hbs index b70d63ad..4e2c442f 100644 --- a/templates/settings/homebrew-settings.hbs +++ b/templates/settings/homebrew-settings.hbs @@ -24,7 +24,7 @@ {{formGroup settingFields.schema.fields.currency.fields.enabled value=settingFields._source.currency.enabled localize=true}} {{formGroup settingFields.schema.fields.currency.fields.title value=settingFields._source.currency.title localize=true}} {{formGroup settingFields.schema.fields.currency.fields.coins value=settingFields._source.currency.coins localize=true}} - {{formGroup settingFields.schema.fields.currency.fields.handfulls value=settingFields._source.currency.handfulls localize=true}} + {{formGroup settingFields.schema.fields.currency.fields.handfuls value=settingFields._source.currency.handfuls localize=true}} {{formGroup settingFields.schema.fields.currency.fields.bags value=settingFields._source.currency.bags localize=true}} {{formGroup settingFields.schema.fields.currency.fields.chests value=settingFields._source.currency.chests localize=true}} diff --git a/templates/settings/homebrew-settings/settings.hbs b/templates/settings/homebrew-settings/settings.hbs index be408353..1c7c787d 100644 --- a/templates/settings/homebrew-settings/settings.hbs +++ b/templates/settings/homebrew-settings/settings.hbs @@ -29,7 +29,7 @@ {{formGroup settingFields.schema.fields.currency.fields.enabled value=settingFields._source.currency.enabled localize=true}} {{formGroup settingFields.schema.fields.currency.fields.title value=settingFields._source.currency.title localize=true}} {{formGroup settingFields.schema.fields.currency.fields.coins value=settingFields._source.currency.coins localize=true}} - {{formGroup settingFields.schema.fields.currency.fields.handfulls value=settingFields._source.currency.handfulls localize=true}} + {{formGroup settingFields.schema.fields.currency.fields.handfuls value=settingFields._source.currency.handfuls localize=true}} {{formGroup settingFields.schema.fields.currency.fields.bags value=settingFields._source.currency.bags localize=true}} {{formGroup settingFields.schema.fields.currency.fields.chests value=settingFields._source.currency.chests localize=true}} diff --git a/templates/sheets/actors/character/inventory.hbs b/templates/sheets/actors/character/inventory.hbs index 10433483..017d37d9 100644 --- a/templates/sheets/actors/character/inventory.hbs +++ b/templates/sheets/actors/character/inventory.hbs @@ -19,9 +19,9 @@ localize=true toggled=true}}
- {{localize this.inventory.currency.handfulls}} - {{formInput systemFields.gold.fields.handfulls value=source.system.gold.handfulls - enriched=source.system.gold.handfulls localize=true toggled=true}} + {{localize this.inventory.currency.handfuls}} + {{formInput systemFields.gold.fields.handfuls value=source.system.gold.handfuls + enriched=source.system.gold.handfuls localize=true toggled=true}}
{{localize this.inventory.currency.bags}} From 5045801475d247e7a7ea8d1b9de9bc15ec0d51bc Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 19:23:34 +0200 Subject: [PATCH 13/24] Improved tooltips wiht more data (#701) --- module/data/fields/action/beastformField.mjs | 20 +++++++++++++++- module/data/item/beastform.mjs | 20 ++++++++++++++++ module/documents/tooltipManager.mjs | 2 +- styles/less/ux/tooltip/tooltip.less | 8 +++++++ templates/actionTypes/beastform.hbs | 10 +------- .../action-settings/effect.hbs | 2 +- templates/ui/tooltip/beastform.hbs | 23 +++++++++++++++++++ 7 files changed, 73 insertions(+), 12 deletions(-) diff --git a/module/data/fields/action/beastformField.mjs b/module/data/fields/action/beastformField.mjs index 25e3cf9c..832bd9f6 100644 --- a/module/data/fields/action/beastformField.mjs +++ b/module/data/fields/action/beastformField.mjs @@ -4,7 +4,25 @@ export default class BeastformField extends fields.SchemaField { constructor(options = {}, context = {}) { const beastformFields = { tierAccess: new fields.SchemaField({ - exact: new fields.NumberField({ integer: true, nullable: true, initial: null }) + exact: new fields.NumberField({ + integer: true, + nullable: true, + initial: null, + choices: () => { + const settingsTiers = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.LevelTiers + ).tiers; + return Object.values(settingsTiers).reduce( + (acc, tier) => { + acc[tier.tier] = game.i18n.localize(tier.name); + return acc; + }, + { 1: game.i18n.localize('DAGGERHEART.GENERAL.Tiers.1') } + ); + }, + hint: 'DAGGERHEART.ACTIONS.Config.beastform.exactHint' + }) }) }; super(beastformFields, options, context); diff --git a/module/data/item/beastform.mjs b/module/data/item/beastform.mjs index 4ebcfade..68c934ed 100644 --- a/module/data/item/beastform.mjs +++ b/module/data/item/beastform.mjs @@ -88,6 +88,26 @@ export default class DHBeastform extends BaseDataItem { /* -------------------------------------------- */ + get beastformAttackData() { + const effect = this.parent.effects.find(x => x.type === 'beastform'); + if (!effect) return null; + + const traitBonus = effect.changes.find(x => x.key === `system.traits.${this.mainTrait}.value`)?.value ?? 0; + const evasionBonus = effect.changes.find(x => x.key === 'system.evasion')?.value ?? 0; + + const damageDiceIndex = effect.changes.find(x => x.key === 'system.rules.attack.damage.diceIndex'); + const damageDice = damageDiceIndex ? Object.keys(CONFIG.DH.GENERAL.diceTypes)[damageDiceIndex.value] : null; + const damageBonus = effect.changes.find(x => x.key === 'system.rules.attack.damage.bonus')?.value ?? 0; + + return { + trait: game.i18n.localize(CONFIG.DH.ACTOR.abilities[this.mainTrait].label), + traitBonus: traitBonus ? Number(traitBonus).signedString() : '', + evasionBonus: evasionBonus ? Number(evasionBonus).signedString() : '', + damageDice: damageDice, + damageBonus: damageBonus ? `${Number(damageBonus).signedString()}` : '' + }; + } + async _preCreate() { if (!this.actor) return; diff --git a/module/documents/tooltipManager.mjs b/module/documents/tooltipManager.mjs index 974f5596..ec6c8d9e 100644 --- a/module/documents/tooltipManager.mjs +++ b/module/documents/tooltipManager.mjs @@ -161,7 +161,7 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti for (const [index, itemValue] of pathValue.entries()) { const itemIsAction = itemValue instanceof game.system.api.models.actions.actionsTypes.base; const value = itemIsAction || !itemValue?.item ? itemValue : itemValue.item; - const enrichedValue = await TextEditor.enrichHTML(value.description); + const enrichedValue = await TextEditor.enrichHTML(value.system?.description ?? value.description); if (itemIsAction) value.enrichedDescription = enrichedValue; else foundry.utils.setProperty(item, `${basePath}.${index}.enrichedDescription`, enrichedValue); } diff --git a/styles/less/ux/tooltip/tooltip.less b/styles/less/ux/tooltip/tooltip.less index 44f8ce1a..43f47da5 100644 --- a/styles/less/ux/tooltip/tooltip.less +++ b/styles/less/ux/tooltip/tooltip.less @@ -34,6 +34,10 @@ text-align: start; } + .simple-info { + font-style: italic; + } + .tooltip-sub-title { margin: 0; color: light-dark(@dark-blue, @beige); @@ -45,6 +49,10 @@ grid-template-columns: 1fr 1fr; gap: 4px; + &.spaced { + margin-top: 8px; + } + &.triple { grid-template-columns: 1fr 1fr 1fr; } diff --git a/templates/actionTypes/beastform.hbs b/templates/actionTypes/beastform.hbs index d7ddba7a..b2710208 100644 --- a/templates/actionTypes/beastform.hbs +++ b/templates/actionTypes/beastform.hbs @@ -4,14 +4,6 @@
-
-
- - -
-

{{localize "DAGGERHEART.ACTIONS.Config.beastform.exactHint"}}

-
+ {{formGroup fields.tierAccess.fields.exact value=beastform.tierAccess.exact labelAttr="label" valueAttr="key" localize=true blank=""}}
\ No newline at end of file diff --git a/templates/sheets-settings/action-settings/effect.hbs b/templates/sheets-settings/action-settings/effect.hbs index cc3fb4cc..f2bc6c0f 100644 --- a/templates/sheets-settings/action-settings/effect.hbs +++ b/templates/sheets-settings/action-settings/effect.hbs @@ -10,5 +10,5 @@ {{#if fields.resource}}{{> 'systems/daggerheart/templates/actionTypes/resource.hbs' fields=fields.resource.fields source=source.resource}}{{/if}} {{#if fields.documentUUID}}{{> 'systems/daggerheart/templates/actionTypes/uuid.hbs' fields=fields.documentUUID source=source.documentUUID}}{{/if}} {{#if fields.effects}}{{> 'systems/daggerheart/templates/actionTypes/effect.hbs' fields=fields.effects.element.fields source=source.effects}}{{/if}} - {{#if fields.beastform}}{{> 'systems/daggerheart/templates/actionTypes/beastform.hbs' fields=fields.effects.element.fields source=source.beastform}}{{/if}} + {{#if fields.beastform}}{{> 'systems/daggerheart/templates/actionTypes/beastform.hbs' fields=fields.beastform.fields source=source.beastform}}{{/if}} \ No newline at end of file diff --git a/templates/ui/tooltip/beastform.hbs b/templates/ui/tooltip/beastform.hbs index 3afc0c84..96a77b9c 100644 --- a/templates/ui/tooltip/beastform.hbs +++ b/templates/ui/tooltip/beastform.hbs @@ -3,6 +3,29 @@
{{{description}}}
+
{{item.system.examples}}
{{> "systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs" chips=item.system.advantageOn label=(localize "DAGGERHEART.ITEMS.Beastform.FIELDS.advantageOn.label")}} + +
+ {{#with item.system.beastformAttackData}} +
+ +
{{this.trait}}
+
+
+ +
{{this.traitBonus}}
+
+
+ +
{{this.evasionBonus}}
+
+
+ +
{{concat this.damageDice ' ' this.damageBonus}}
+
+ {{/with}} +
+ {{> "systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs" features=item.system.features label=(localize "DAGGERHEART.GENERAL.features")}}
\ No newline at end of file From 22283cb506d1b65fe9df329125028c501f6caf7b Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 7 Aug 2025 23:26:42 +0200 Subject: [PATCH 14/24] . (#702) --- lang/en.json | 7 +++++- .../characterCreation/characterCreation.mjs | 25 +++++++++++++------ .../applications/levelup/characterLevelup.mjs | 2 +- .../applications/sheets/actors/character.mjs | 8 ++++++ module/applications/sheets/api/base-actor.mjs | 1 - module/data/actor/character.mjs | 25 +++++++++++++++++-- module/data/settings/Automation.mjs | 5 ++++ module/documents/actor.mjs | 16 ++++++------ .../dialog/level-up/selections-container.less | 3 ++- styles/less/global/elements.less | 3 +-- .../adversary-settings/experiences.less | 17 +++++++++---- system.json | 2 +- templates/settings/automation-settings.hbs | 1 + .../character-settings/experiences.hbs | 9 +++++-- templates/sheets/actors/character/header.hbs | 8 +++--- 15 files changed, 98 insertions(+), 34 deletions(-) diff --git a/lang/en.json b/lang/en.json index 84fdaf18..32ea2227 100755 --- a/lang/en.json +++ b/lang/en.json @@ -188,7 +188,8 @@ "manualMulticlassSubclass": { "title": "Multiclass Subclass", "text": "Do you want to add this subclass as your multiclass subclass?" - } + }, + "cannotRemoveCoreExperience": "You are using Levelup Auto. You cannot remove an experience given to you by the rule progression." }, "Companion": { "FIELDS": { @@ -2115,6 +2116,10 @@ "resourceScrollTexts": { "label": "Show Resource Change Scrolltexts", "hint": "When a character is damaged, uses armor etc, a scrolling text will briefly appear by the token to signify this." + }, + "playerCanEditSheet": { + "label": "Players Can Manually Edit Character Settings", + "hint": "Players are allowed to access the manual Character Settings and change their statistics beyond the rules." } } }, diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index cdc80bef..649c7768 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -20,8 +20,8 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl class: this.character.system.class?.value ?? {}, subclass: this.character.system.class?.subclass ?? {}, experiences: { - [foundry.utils.randomID()]: { name: '', value: 2 }, - [foundry.utils.randomID()]: { name: '', value: 2 } + [foundry.utils.randomID()]: { name: '', value: 2, core: true }, + [foundry.utils.randomID()]: { name: '', value: 2, core: true } }, domainCards: { [foundry.utils.randomID()]: {}, @@ -588,12 +588,21 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl this.setup.class.system.inventory.take.filter(x => x) ); - await this.character.update({ - system: { - traits: this.setup.traits, - experiences: this.setup.experiences - } - }); + await this.character.update( + { + system: { + traits: this.setup.traits, + experiences: { + ...this.setup.experiences, + ...Object.keys(this.character.system.experiences).reduce((acc, key) => { + acc[`-=${key}`] = null; + return acc; + }, {}) + } + } + }, + { overwrite: true } + ); this.close(); } diff --git a/module/applications/levelup/characterLevelup.mjs b/module/applications/levelup/characterLevelup.mjs index 1ce2bceb..de28f241 100644 --- a/module/applications/levelup/characterLevelup.mjs +++ b/module/applications/levelup/characterLevelup.mjs @@ -289,7 +289,7 @@ export default class DhCharacterLevelUp extends LevelUpBase { const experience = Object.keys(this.actor.system.experiences).find( x => x === data ); - return this.actor.system.experiences[experience]?.description ?? ''; + return this.actor.system.experiences[experience]?.name ?? ''; }); advancement[choiceKey].push({ data: data, value: checkbox.value }); break; diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 457d949d..07046831 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -178,6 +178,13 @@ export default class CharacterSheet extends DHBaseActorSheet { async _preparePartContext(partId, context, options) { context = await super._preparePartContext(partId, context, options); switch (partId) { + case 'header': + const { playerCanEditSheet, levelupAuto } = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.Automation + ); + context.showSettings = game.user.isGM || !levelupAuto || (levelupAuto && playerCanEditSheet); + break; case 'loadout': await this._prepareLoadoutContext(context, options); break; @@ -188,6 +195,7 @@ export default class CharacterSheet extends DHBaseActorSheet { await this._prepareBiographyContext(context, options); break; } + return context; } diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 1c803eb4..b664929c 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -175,7 +175,6 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { const newValue = (action.uses.value ?? 0) + (increase ? 1 : -1); await action.update({ 'uses.value': Math.min(Math.max(newValue, 0), action.uses.max ?? 0) }); - this.render(); } /* -------------------------------------------- */ diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 613f82da..d4544d2c 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -68,7 +68,8 @@ export default class DhCharacter extends BaseDataActor { new fields.SchemaField({ name: new fields.StringField(), value: new fields.NumberField({ integer: true, initial: 0 }), - description: new fields.StringField() + description: new fields.StringField(), + core: new fields.BooleanField({ initial: false }) }) ), gold: new fields.SchemaField({ @@ -573,7 +574,10 @@ export default class DhCharacter extends BaseDataActor { case 'experience': selection.data.forEach(id => { const experience = this.experiences[id]; - if (experience) experience.value += selection.value; + if (experience) { + experience.value += selection.value; + experience.leveledUp = true; + } }); break; } @@ -620,6 +624,23 @@ export default class DhCharacter extends BaseDataActor { }; } + async _preUpdate(changes, options, userId) { + const allowed = await super._preUpdate(changes, options, userId); + if (allowed === false) return; + + /* The first two experiences are always marked as core */ + if (changes.system?.experiences && Object.keys(this.experiences).length < 2) { + const experiences = new Set(Object.keys(this.experiences)); + const changeExperiences = new Set(Object.keys(changes.system.experiences)); + const newExperiences = Array.from(changeExperiences.difference(experiences)); + + for (var i = 0; i < Math.min(newExperiences.length, 2 - experiences.size); i++) { + const experience = newExperiences[i]; + changes.system.experiences[experience].core = true; + } + } + } + async _preDelete() { if (this.companion) { this.companion.updateLevel(1); diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs index d2842148..facaec17 100644 --- a/module/data/settings/Automation.mjs +++ b/module/data/settings/Automation.mjs @@ -45,6 +45,11 @@ export default class DhAutomation extends foundry.abstract.DataModel { required: true, initial: true, label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.resourceScrollTexts.label' + }), + playerCanEditSheet: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.playerCanEditSheet.label' }) }; } diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index ce9ffc89..910ec4f1 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -202,7 +202,8 @@ export default class DhpActor extends Actor { await this.update({ [`system.experiences.${experienceKey}`]: { name: experience.name, - value: experience.modifier + value: experience.modifier, + core: true } }); @@ -210,7 +211,8 @@ export default class DhpActor extends Actor { await this.system.companion.update({ [`system.experiences.${experienceKey}`]: { name: '', - value: experience.modifier + value: experience.modifier, + core: true } }); } @@ -559,8 +561,8 @@ export default class DhpActor extends Actor { updates.forEach( u => - (u.value = - u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value) + (u.value = + u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value) ); await this.modifyResource(updates); @@ -606,9 +608,9 @@ export default class DhpActor extends Actor { updates.forEach( u => - (u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) - ? u.value * -1 - : u.value) + (u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) + ? u.value * -1 + : u.value) ); await this.modifyResource(updates); diff --git a/styles/less/dialog/level-up/selections-container.less b/styles/less/dialog/level-up/selections-container.less index da5d5273..a13c9ff3 100644 --- a/styles/less/dialog/level-up/selections-container.less +++ b/styles/less/dialog/level-up/selections-container.less @@ -143,7 +143,8 @@ padding: 0 12px; } - .levelup-trait-increases { + .levelup-trait-increases, + .levelup-experience-increases { width: 100%; } diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index f99646b7..7f8cdd94 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -495,7 +495,6 @@ border-radius: 6px; button { - padding: 6px 6px 6px 10px; border-radius: 3px 0px 0px 3px; color: light-dark(@dark-blue, @dark-blue); white-space: nowrap; @@ -506,7 +505,7 @@ color: light-dark(@dark-blue, @golden); } - &:last-child { + &:not(:first-child) { padding: 6px; background: light-dark(@dark-blue-10, @golden-secondary); border-radius: 0px 3px 3px 0px; diff --git a/styles/less/sheets-settings/adversary-settings/experiences.less b/styles/less/sheets-settings/adversary-settings/experiences.less index dab261a6..da5e750d 100644 --- a/styles/less/sheets-settings/adversary-settings/experiences.less +++ b/styles/less/sheets-settings/adversary-settings/experiences.less @@ -26,12 +26,19 @@ align-items: center; gap: 5px; - &.no-controls { - grid-template-columns: 3fr 1fr; - } + span { + display: flex; + justify-content: center; - a { - text-align: center; + a { + text-align: center; + + &.disabled { + i { + opacity: 0.4; + } + } + } } } diff --git a/system.json b/system.json index 470c7ff2..b6472122 100644 --- a/system.json +++ b/system.json @@ -5,7 +5,7 @@ "version": "0.0.1", "compatibility": { "minimum": "13", - "verified": "13.346", + "verified": "13.347", "maximum": "13" }, "authors": [ diff --git a/templates/settings/automation-settings.hbs b/templates/settings/automation-settings.hbs index 0d193869..9e9da6bb 100644 --- a/templates/settings/automation-settings.hbs +++ b/templates/settings/automation-settings.hbs @@ -12,6 +12,7 @@ {{formGroup settingFields.schema.fields.hordeDamage value=settingFields._source.hordeDamage localize=true}} {{formGroup settingFields.schema.fields.effects.fields.rangeDependent value=settingFields._source.effects.rangeDependent localize=true}} {{formGroup settingFields.schema.fields.levelupAuto value=settingFields._source.levelupAuto localize=true}} + {{formGroup settingFields.schema.fields.playerCanEditSheet value=settingFields._source.playerCanEditSheet localize=true}} {{formGroup settingFields.schema.fields.damageReductionRulesDefault value=settingFields._source.damageReductionRulesDefault localize=true}} {{formGroup settingFields.schema.fields.resourceScrollTexts value=settingFields._source.resourceScrollTexts localize=true}} diff --git a/templates/sheets-settings/character-settings/experiences.hbs b/templates/sheets-settings/character-settings/experiences.hbs index ef31c1cd..9d4aefe4 100644 --- a/templates/sheets-settings/character-settings/experiences.hbs +++ b/templates/sheets-settings/character-settings/experiences.hbs @@ -12,10 +12,15 @@
diff --git a/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs b/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs index cc030523..8fbd5800 100644 --- a/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs +++ b/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs @@ -26,7 +26,7 @@ Parameters: {{localize title}} {{#if canCreate}} - {{localize tabs.settings.label}} {{localize "DAGGERHEART.ITEMS.Subclass.spellcastingTrait"}} - {{formField systemFields.spellcastingTrait value=source.system.spellcastingTrait localize=true}} + {{formInput systemFields.spellcastingTrait value=source.system.spellcastingTrait localize=true}} \ No newline at end of file diff --git a/templates/sheets/items/weapon/settings.hbs b/templates/sheets/items/weapon/settings.hbs index fd8f16d9..021fc627 100644 --- a/templates/sheets/items/weapon/settings.hbs +++ b/templates/sheets/items/weapon/settings.hbs @@ -6,15 +6,15 @@
{{localize tabs.settings.label}} {{localize "DAGGERHEART.GENERAL.Tiers.singular"}} - {{formField systemFields.tier value=source.system.tier}} + {{formInput systemFields.tier value=source.system.tier}} {{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}} - {{formField systemFields.secondary value=source.system.secondary}} + {{formInput systemFields.secondary value=source.system.secondary}} {{localize "DAGGERHEART.GENERAL.Trait.single"}} {{formInput systemFields.attack.fields.roll.fields.trait value=document.system.attack.roll.trait name="system.attack.roll.trait" label="DAGGERHEART.GENERAL.Trait.single" localize=true}} {{localize "DAGGERHEART.GENERAL.range"}} {{formInput systemFields.attack.fields.range value=document.system.attack.range label="Range" name="system.attack.range" localize=true}} {{localize "DAGGERHEART.GENERAL.burden"}} - {{formField systemFields.burden value=source.system.burden localize=true}} + {{formInput systemFields.burden value=source.system.burden localize=true}}
diff --git a/templates/ui/itemBrowser/itemBrowser.hbs b/templates/ui/itemBrowser/itemBrowser.hbs new file mode 100644 index 00000000..65c2121e --- /dev/null +++ b/templates/ui/itemBrowser/itemBrowser.hbs @@ -0,0 +1,89 @@ +
+ {{#if menu.data }} + +
+ +
+
+ {{#each fieldFilter}} + {{#if choices }} +
+ +
+ +
+
+ {{else}} + {{#if filtered }} + {{formField field localize=true blank="" name=name choices=(@root.formatChoices this) valueAttr="value" dataset=(object key=key) value=value}} + {{else}} + {{#if field.label}} + {{formField field localize=true blank="" name=name dataset=(object key=key) value=value}} + {{else}} + {{formField field localize=true blank="" name=name dataset=(object key=key) label=label value=value}} + {{/if}} + {{/if}} + {{/if}} + {{/each}} +
+
+
+ {{!--
--}} + {{#if menu.data.columns.length}} +
+
+
Name
+ {{#each menu.data.columns}} +
{{label}}
+ {{/each}} +
+ {{/if}} +
+ {{#each items}} +
+
+
+ +
{{name}}
+ {{#each ../menu.data.columns}} +
{{#with (@root.formatLabel ../this this) as | label |}}{{{label}}}{{/with}}
+ {{/each}} +
+
+
+
{{{system.description}}}
+
+
+ {{/each}} +
+ {{!--
--}} + {{else}} +
+

Daggerheart Compendium Browser

+ Select a Folder in sidebar to start browsing trought the compendium +
+ {{/if}} +
\ No newline at end of file diff --git a/templates/ui/itemBrowser/sidebar.hbs b/templates/ui/itemBrowser/sidebar.hbs new file mode 100644 index 00000000..6c395a4b --- /dev/null +++ b/templates/ui/itemBrowser/sidebar.hbs @@ -0,0 +1,28 @@ +
+ {{#each compendiums}} +
+ + {{label}} + + +
+ {{#each folders}} +
{{label}}
+ {{!--
{{label}}
--}} +
+ {{#each folders}} +
+ • {{label}} +
+ {{/each}} +
+ {{/each}} +
+ +
+ {{/each}} +
From ff955bbe01fdfa6f355fbe66655847c688733707 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Fri, 8 Aug 2025 09:39:22 +0200 Subject: [PATCH 21/24] Fixed so compendium adversaries can be dragged from environmnets (#716) --- module/applications/sheets/actors/environment.mjs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/applications/sheets/actors/environment.mjs b/module/applications/sheets/actors/environment.mjs index 70f833de..aa2759a2 100644 --- a/module/applications/sheets/actors/environment.mjs +++ b/module/applications/sheets/actors/environment.mjs @@ -101,8 +101,7 @@ export default class DhpEnvironment extends DHBaseActorSheet { const item = event.currentTarget.closest('.inventory-item'); if (item) { - const adversary = game.actors.find(x => x.type === 'adversary' && x.id === item.dataset.itemId); - const adversaryData = { type: 'Actor', uuid: adversary.uuid }; + const adversaryData = { type: 'Actor', uuid: item.dataset.itemUuid }; event.dataTransfer.setData('text/plain', JSON.stringify(adversaryData)); event.dataTransfer.setDragImage(item, 60, 0); } From 263e36500e955170569ce97a899f76ab56a21f34 Mon Sep 17 00:00:00 2001 From: Chris Ryan <73275196+chrisryan10@users.noreply.github.com> Date: Fri, 8 Aug 2025 21:14:28 +1000 Subject: [PATCH 22/24] Fix for #695 (#718) Co-authored-by: Chris Ryan --- src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json index 25f0d1b2..4078ca03 100644 --- a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json +++ b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json @@ -45,7 +45,7 @@ }, "effects": [ { - "name": "Base", + "name": "Tusks", "type": "base", "_id": "klEyAxQa5YHXVnrl", "img": "icons/creatures/abilities/fang-tooth-blood-red.webp", From 1f5c3531be2040f44a6a7363f3970f1259130173 Mon Sep 17 00:00:00 2001 From: CPTN_Cosmo Date: Fri, 8 Aug 2025 18:37:28 +0200 Subject: [PATCH 23/24] added more credits (#723) --- .../journal_Welcome___Information_g7NhKvwltwafmMyR.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/packs/journals/journal_Welcome___Information_g7NhKvwltwafmMyR.json b/src/packs/journals/journal_Welcome___Information_g7NhKvwltwafmMyR.json index b08e4a1d..6620d62c 100644 --- a/src/packs/journals/journal_Welcome___Information_g7NhKvwltwafmMyR.json +++ b/src/packs/journals/journal_Welcome___Information_g7NhKvwltwafmMyR.json @@ -132,7 +132,7 @@ "image": {}, "text": { "format": 1, - "content": "

This product includes materials from the Daggerheart System Reference Document 1.0, © Critical Role, LLC. under the terms of the Darrington Press Community Gaming (DPCGL) License. More information can be found at https://www.daggerheart.com. There are no previous modifications by others.

The Foundryborne Team

The Foundryborne Team consists of:

  • @harryfuralle

  • @cptn_cosmo

  • @molilo

  • @joaquinp98

  • @dapoulp

  • @ikraik

  • @irktheimp

  • @jacobwojo

  • @vyrth

  • @.ontaro

  • @saatsin

  • @david.xyz

With Art from:

  • UsernameIsInUse

We would also like to thank the FoundryVTT team for their support in publishing this system.

And, of course, special thanks to the teams at Critical Role and Darrington Press for making such a wonderful game and updating the license to allow a FoundryVTT version of the system.

The Foundryborne Community

Without our amazing community this project would not have been possible.

You kept us going with both direct contributions and just endless support!

We thank you with all our hearts.

Come join us!

" + "content": "

This product includes materials from the Daggerheart System Reference Document 1.0, © Critical Role, LLC. under the terms of the Darrington Press Community Gaming (DPCGL) License. More information can be found at https://www.daggerheart.com. There are no previous modifications by others.

The Foundryborne Team

The Foundryborne Team consists of:

  • @harryfuralle

  • @cptn_cosmo

  • @molilo

  • @joaquinp98

  • @dapoulp

  • @ikraik

  • @irktheimp

  • @jacobwojo

  • @vyrth

  • @.ontaro

  • @saatsin

  • @david.xyz

  • @lazjen

With Art from:

  • UsernameIsInUse

And special thanks to our hard working community testers:

  • @lazjen

We would also like to thank the FoundryVTT team for their support in publishing this system.

And, of course, special thanks to the teams at Critical Role and Darrington Press for making such a wonderful game and updating the license to allow a FoundryVTT version of the system.

The Foundryborne Community

Without our amazing community this project would not have been possible.

You kept us going with both direct contributions and just endless support!

We thank you with all our hearts.

Come join us!

" }, "video": { "controls": true, @@ -153,8 +153,8 @@ "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754225939902, - "modifiedTime": 1754226994508, - "lastModifiedBy": "l5jB3XmcVXOTQpRZ" + "modifiedTime": 1754668980876, + "lastModifiedBy": "Cf0YKwnZ1OHBZWl8" }, "_key": "!journal.pages!g7NhKvwltwafmMyR.dP6xSKEld4TSqHhK" } From 5d0a4382cc43cd4cdcfce0e5ecb64d66ff94eb66 Mon Sep 17 00:00:00 2001 From: Nikhil Nagarajan Date: Fri, 8 Aug 2025 13:05:20 -0400 Subject: [PATCH 24/24] Fixed default images (#725) --- .../domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json | 8 ++++---- .../domainCard_Healing_Hands_WTlhnQMajc1r8i50.json | 8 ++++---- .../domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json | 8 ++++---- .../domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json | 8 ++++---- .../subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json | 7 ++++--- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json b/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json index c274b9ac..a9e66110 100644 --- a/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json +++ b/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json @@ -64,7 +64,7 @@ "effects": [ { "name": "Gifted Tracker", - "img": "icons/svg/item-bag.svg", + "img": "systems/daggerheart/assets/icons/domains/domain-card/sage.png", "origin": "Compendium.daggerheart.domains.Item.VZ2b4zfRzV73XTuT", "transfer": false, "_id": "47Oh2weCdmuvKHM9", @@ -104,12 +104,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754114056078, - "modifiedTime": 1754114073478, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754670410126, + "lastModifiedBy": "49DaecTcBSc5d0DA" }, "_key": "!items.effects!VZ2b4zfRzV73XTuT.47Oh2weCdmuvKHM9" } diff --git a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json index 622e2266..a7aeb6b2 100644 --- a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json +++ b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json @@ -389,7 +389,7 @@ "effects": [ { "name": "Healed by Healing Hands", - "img": "icons/svg/item-bag.svg", + "img": "systems/daggerheart/assets/icons/domains/domain-card/splendor.png", "origin": "Compendium.daggerheart.domains.Item.WTlhnQMajc1r8i50", "transfer": false, "_id": "sd5liP4ZcVeTMAoW", @@ -422,12 +422,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754263407455, - "modifiedTime": 1754263727114, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754670504951, + "lastModifiedBy": "49DaecTcBSc5d0DA" }, "_key": "!items.effects!WTlhnQMajc1r8i50.sd5liP4ZcVeTMAoW" } diff --git a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json index efdec150..78b2ec5e 100644 --- a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json +++ b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json @@ -66,7 +66,7 @@ "effects": [ { "name": "Life Ward", - "img": "icons/svg/item-bag.svg", + "img": "systems/daggerheart/assets/icons/domains/domain-card/splendor.png", "origin": "Compendium.daggerheart.domains.Item.OszbCj0jTqq2ADx9", "transfer": false, "_id": "E7Ou4OMEy3TeK1Gf", @@ -99,12 +99,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754264687962, - "modifiedTime": 1754264717646, - "lastModifiedBy": "Q9NoTaEarn3VMS6Z" + "modifiedTime": 1754670535710, + "lastModifiedBy": "49DaecTcBSc5d0DA" }, "_key": "!items.effects!OszbCj0jTqq2ADx9.E7Ou4OMEy3TeK1Gf" } diff --git a/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json b/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json index a7276bba..b6f6548f 100644 --- a/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json +++ b/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json @@ -37,7 +37,7 @@ } }, "_id": "UJTsJlnhi5Zi0XQ2", - "img": "icons/magic/life/heart-cross-blue.webp", + "img": "systems/daggerheart/assets/icons/domains/domain-card/bone.png", "changes": [ { "key": "system.rules.damageReduction.thresholdImmunities.minor", @@ -67,12 +67,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754303484332, - "modifiedTime": 1754303570504, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "modifiedTime": 1754670012467, + "lastModifiedBy": "49DaecTcBSc5d0DA" }, "_key": "!items.effects!zbxPl81kbWEegKQN.UJTsJlnhi5Zi0XQ2" } diff --git a/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json b/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json index 3429f585..f80c05e3 100644 --- a/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json +++ b/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json @@ -23,7 +23,7 @@ } }, "_id": "RSmscgGyuHJucF6C", - "img": "icons/magic/life/heart-cross-blue.webp", + "img": "icons/sundries/documents/document-letter-blue.webp", "changes": [ { "key": "system.bonuses.rally", @@ -53,10 +53,11 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "49DaecTcBSc5d0DA", + "modifiedTime": 1754669077252 }, "_key": "!items.effects!eCoEWkWuZPMZ9C6a.RSmscgGyuHJucF6C" }