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" }}