From 8ab795b6ba9438459fb6b2eb8147e301781214ad Mon Sep 17 00:00:00 2001 From: WBHarry Date: Sun, 11 Jan 2026 11:54:59 +0100 Subject: [PATCH] Added DomainTouched support --- lang/en.json | 5 +++- .../applications/sheets/items/domainCard.mjs | 3 ++ module/data/item/domainCard.mjs | 28 +++++++++++++++++++ module/documents/activeEffect.mjs | 5 +++- module/documents/item.mjs | 4 ++- ...nCard_Arcana_Touched_5PvMQKCjrgSxzstn.json | 3 +- ...inCard_Blade_Touched_Gb5bqpFSBiuBxUix.json | 3 +- ...ainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json | 3 +- ...inCard_Codex_Touched_7Pu83ABdMukTxu3e.json | 3 +- ...inCard_Grace_Touched_KAuNb51AwhD8KEXk.json | 3 +- ...ard_Midnight_Touched_uSyGKVxOJcnp28po.json | 3 +- ...ainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json | 3 +- ...ard_Splendor_Touched_JT5dM3gVL6chDBYU.json | 3 +- ...inCard_Valor_Touched_k1AtYd3lSchIymBr.json | 3 +- .../sheets/items/domainCard/settings.hbs | 2 ++ 15 files changed, 62 insertions(+), 12 deletions(-) diff --git a/lang/en.json b/lang/en.json index 27943860..8942650a 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2296,6 +2296,8 @@ "recallCost": "Recall Cost", "vaultActive": "Active In Vault", "loadoutIgnore": "Doesn't Count For Loadout", + "domainTouched": "Domain Touched", + "domainTouchedPlaceholder": "loadout {domain} requirement", "foundationTitle": "Foundation", "specializationTitle": "Specialization", "masteryTitle": "Mastery" @@ -2785,7 +2787,8 @@ "noActorOwnership": "You do not have permissions for this character", "documentIsMissing": "The {documentType} is missing from the world.", "tokenActorMissing": "{name} is missing an Actor", - "tokenActorsMissing": "[{names}] missing Actors" + "tokenActorsMissing": "[{names}] missing Actors", + "domainTouchRequirement": "This domain card requires {nr} {domain} cards in the loadout to be used" }, "Sidebar": { "actorDirectory": { diff --git a/module/applications/sheets/items/domainCard.mjs b/module/applications/sheets/items/domainCard.mjs index ce2d305c..1cc8d41b 100644 --- a/module/applications/sheets/items/domainCard.mjs +++ b/module/applications/sheets/items/domainCard.mjs @@ -39,6 +39,9 @@ export default class DomainCardSheet extends DHBaseItemSheet { const context = await super._prepareContext(options); context.domain = CONFIG.DH.DOMAIN.allDomains()[this.document.system.domain]; context.domainChoices = CONFIG.DH.DOMAIN.orderedDomains(); + context.domainTouchedPlaceholder = game.i18n.format('DAGGERHEART.ITEMS.DomainCard.domainTouchedPlaceholder', { + domain: game.i18n.localize(context.domain.label) + }); return context; } diff --git a/module/data/item/domainCard.mjs b/module/data/item/domainCard.mjs index a818a78f..129b0864 100644 --- a/module/data/item/domainCard.mjs +++ b/module/data/item/domainCard.mjs @@ -39,6 +39,10 @@ export default class DHDomainCard extends BaseDataItem { required: true, nullable: false, initial: false + }), + domainTouched: new fields.NumberField({ + nullable: true, + initial: null }) }; } @@ -48,6 +52,30 @@ export default class DHDomainCard extends BaseDataItem { return game.i18n.localize(allDomainData[this.domain].label); } + get vaultSupressed() { + return this.inVault && !this.vaultActive; + } + + get domainTouchedSuppressed() { + if (!this.parent.system.domainTouched || this.parent.parent?.type !== 'character') return false; + + const matchingDomainCards = this.parent.parent.items.filter( + item => !item.system.inVault && item.system.domain === this.parent.system.domain + ).length; + return matchingDomainCards < this.parent.system.domainTouched; + } + + get cannotUse() { + if (this.domainTouchedSuppressed) { + return ui.notifications.warn( + game.i18n.format('DAGGERHEART.UI.Notifications.domainTouchRequirement', { + nr: this.domainTouched, + domain: game.i18n.localize(CONFIG.DH.DOMAIN.allDomains()[this.domain].label) + }) + ); + } + } + /* -------------------------------------------- */ /**@override */ diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 2bc81ae8..ad5a5d83 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -20,7 +20,10 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { } if (this.parent?.type === 'domainCard') { - return this.parent.system.inVault && !this.parent.system.vaultActive; + const vaultSupressed = this.parent.system.vaultSupressed; + const domainTouchedSupressed = this.parent.system.domainTouchedSuppressed; + + return vaultSupressed || domainTouchedSupressed; } return super.isSuppressed; diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 2c6d68b5..8fbe2929 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -31,7 +31,7 @@ export default class DHItem extends foundry.documents.Item { static async createDocuments(sources, operation) { // Ensure that items being created are valid to the actor its being added to const actor = operation.parent; - sources = actor?.system?.isItemValid ? sources.filter((s) => actor.system.isItemValid(s)) : sources; + sources = actor?.system?.isItemValid ? sources.filter(s => actor.system.isItemValid(s)) : sources; return super.createDocuments(sources, operation); } @@ -146,6 +146,8 @@ export default class DHItem extends foundry.documents.Item { /* -------------------------------------------- */ async use(event) { + if (this.system.cannotUse) return; + const actions = new Set(this.system.actionsList); if (actions?.size) { let action = actions.first(); diff --git a/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json b/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json index 80d9797f..556d5074 100644 --- a/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json +++ b/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json @@ -54,7 +54,8 @@ "source": "Daggerheart SRD", "page": 120, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "5PvMQKCjrgSxzstn", diff --git a/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json b/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json index d2d5dafc..ebb95570 100644 --- a/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json +++ b/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json @@ -13,7 +13,8 @@ "source": "Daggerheart SRD", "page": 121, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "Gb5bqpFSBiuBxUix", diff --git a/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json b/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json index 770ddd63..8880bb07 100644 --- a/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json +++ b/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json @@ -46,7 +46,8 @@ "source": "Daggerheart SRD", "page": 123, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "ON5bvnoQBy0SYc9Y", diff --git a/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json b/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json index 1e2d5de3..6443ed6a 100644 --- a/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json +++ b/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json @@ -71,7 +71,8 @@ "source": "Daggerheart SRD", "page": 125, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "7Pu83ABdMukTxu3e", diff --git a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json index b87ea24d..346a81f2 100644 --- a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json +++ b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json @@ -96,7 +96,8 @@ "source": "Daggerheart SRD", "page": 127, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "KAuNb51AwhD8KEXk", diff --git a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json index 3370c30e..10c42418 100644 --- a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json +++ b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 129, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "uSyGKVxOJcnp28po", diff --git a/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json b/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json index dc9ac3d3..432ff638 100644 --- a/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json +++ b/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json @@ -94,7 +94,8 @@ "source": "Daggerheart SRD", "page": 131, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "VOSFaQHZbmhMyXwi", diff --git a/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json b/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json index 45d0dc96..6b530289 100644 --- a/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json +++ b/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json @@ -13,7 +13,8 @@ "source": "Daggerheart SRD", "page": 133, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "JT5dM3gVL6chDBYU", diff --git a/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json b/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json index 99546d6f..20fe18ea 100644 --- a/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json +++ b/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json @@ -82,7 +82,8 @@ "source": "Daggerheart SRD", "page": 134, "artist": "" - } + }, + "domainTouched": 4 }, "flags": {}, "_id": "k1AtYd3lSchIymBr", diff --git a/templates/sheets/items/domainCard/settings.hbs b/templates/sheets/items/domainCard/settings.hbs index 4071708e..321b9d62 100644 --- a/templates/sheets/items/domainCard/settings.hbs +++ b/templates/sheets/items/domainCard/settings.hbs @@ -18,6 +18,8 @@ {{formField systemFields.vaultActive value=source.system.vaultActive}} {{localize "DAGGERHEART.ITEMS.DomainCard.loadoutIgnore"}} {{formField systemFields.loadoutIgnore value=source.system.loadoutIgnore}} + {{localize "DAGGERHEART.ITEMS.DomainCard.domainTouched"}} + {{formField systemFields.domainTouched value=source.system.domainTouched placeholder=domainTouchedPlaceholder }} {{> "systems/daggerheart/templates/sheets/global/partials/resource-section/resource-section.hbs" }}