Merged with main

This commit is contained in:
WBHarry 2025-09-07 01:01:53 +02:00
commit 2c6aabb97a
31 changed files with 175 additions and 122 deletions

View file

@ -501,18 +501,21 @@
}, },
"takeLevelUp": "Finish Level Up", "takeLevelUp": "Finish Level Up",
"tier2": { "tier2": {
"name": "Tier 2",
"label": "Levels 2-4", "label": "Levels 2-4",
"infoLabel": "At Level 2, gain an additional Experience at +2 and gain a +1 bonus to your Proficiency.", "infoLabel": "At Level 2, gain an additional Experience at +2 and gain a +1 bonus to your Proficiency.",
"pretext": "Choose two options from the list below", "pretext": "Choose two options from the list below",
"posttext": "Take an additional domain card of your level or lower from a domain you have access to." "posttext": "Take an additional domain card of your level or lower from a domain you have access to."
}, },
"tier3": { "tier3": {
"name": "Tier 3",
"label": "Levels 5-7", "label": "Levels 5-7",
"infoLabel": "At Level 5, take an additional Experience and clear all marks on Character Traits.", "infoLabel": "At Level 5, take an additional Experience and clear all marks on Character Traits.",
"pretext": "When you level up, record it on your character sheet, then choose two from the list below or any unmarked from the previous tier.", "pretext": "When you level up, record it on your character sheet, then choose two from the list below or any unmarked from the previous tier.",
"posttext": "Take an additional domain card of your level or lower from a domain you have access to." "posttext": "Take an additional domain card of your level or lower from a domain you have access to."
}, },
"tier4": { "tier4": {
"name": "Tier 4",
"label": "Levels 8-10", "label": "Levels 8-10",
"infoLabel": "At Level 8, take an additional Experience and clear all marks on Character Traits.", "infoLabel": "At Level 8, take an additional Experience and clear all marks on Character Traits.",
"pretext": "When you level up, record it on your character sheet, then choose two from the list below or any unmarked from the previous tier.", "pretext": "When you level up, record it on your character sheet, then choose two from the list below or any unmarked from the previous tier.",
@ -1026,6 +1029,12 @@
"selectType": "Select Action Type", "selectType": "Select Action Type",
"selectAction": "Action Selection" "selectAction": "Action Selection"
}, },
"TargetTypes": {
"any": "Any",
"friendly": "Friendly",
"hostile": "Hostile",
"self": "Self"
},
"TemplateTypes": { "TemplateTypes": {
"circle": "Circle", "circle": "Circle",
"cone": "Cone", "cone": "Cone",
@ -1918,7 +1927,9 @@
"rules": "Rules", "rules": "Rules",
"types": "Types", "types": "Types",
"itemFeatures": "Item Features", "itemFeatures": "Item Features",
"questions": "Questions" "questions": "Questions",
"configuration": "Configuration",
"base": "Base"
}, },
"Tiers": { "Tiers": {
"singular": "Tier", "singular": "Tier",
@ -2028,6 +2039,8 @@
"save": "Save", "save": "Save",
"scalable": "Scalable", "scalable": "Scalable",
"situationalBonus": "Situational Bonus", "situationalBonus": "Situational Bonus",
"spent": "Spent",
"step": "Step",
"stress": "Stress", "stress": "Stress",
"subclasses": "Subclasses", "subclasses": "Subclasses",
"success": "Success", "success": "Success",

View file

@ -66,7 +66,7 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) {
group: 'primary', group: 'primary',
id: 'base', id: 'base',
icon: null, icon: null,
label: 'Base' label: 'DAGGERHEART.GENERAL.Tabs.base'
}, },
config: { config: {
active: false, active: false,
@ -74,7 +74,7 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) {
group: 'primary', group: 'primary',
id: 'config', id: 'config',
icon: null, icon: null,
label: 'Configuration' label: 'DAGGERHEART.GENERAL.Tabs.configuration'
}, },
effect: { effect: {
active: false, active: false,
@ -82,7 +82,7 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) {
group: 'primary', group: 'primary',
id: 'effect', id: 'effect',
icon: null, icon: null,
label: 'Effect' label: 'DAGGERHEART.GENERAL.Tabs.effects'
} }
}; };

View file

@ -232,7 +232,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
* @protected * @protected
*/ */
async _prepareLoadoutContext(context, _options) { async _prepareLoadoutContext(context, _options) {
context.cardView = !game.user.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.displayDomainCardsAsList); context.cardView = game.user.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.displayDomainCardsAsCard);
} }
/** /**
@ -722,8 +722,8 @@ export default class CharacterSheet extends DHBaseActorSheet {
* @type {ApplicationClickAction} * @type {ApplicationClickAction}
*/ */
static async #toggleLoadoutView(_, button) { static async #toggleLoadoutView(_, button) {
const newAbilityView = button.dataset.value !== 'true'; const newAbilityView = button.dataset.value === 'true';
await game.user.setFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.displayDomainCardsAsList, newAbilityView); await game.user.setFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.displayDomainCardsAsCard, newAbilityView);
this.render(); this.render();
} }

View file

@ -455,7 +455,7 @@ export default function DHApplicationMixin(Base) {
options.push({ options.push({
name: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat', name: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat',
icon: 'fa-solid fa-message', icon: 'fa-solid fa-message',
callback: async target => (await getDocFromElement(target)).toChat(this.document.id) callback: async target => (await getDocFromElement(target)).toChat(this.document.uuid)
}); });
if (deletable) if (deletable)

View file

@ -1,4 +1,4 @@
export const displayDomainCardsAsList = 'displayDomainCardsAsList'; export const displayDomainCardsAsCard = 'displayDomainCardsAsCard';
export const narrativeCountdown = { export const narrativeCountdown = {
simple: 'countdown-narrative-simple', simple: 'countdown-narrative-simple',
position: 'countdown-narrative-position' position: 'countdown-narrative-position'

View file

@ -90,22 +90,22 @@ export const rangeInclusion = {
export const otherTargetTypes = { export const otherTargetTypes = {
friendly: { friendly: {
id: 'friendly', id: 'friendly',
label: 'Friendly' label: 'DAGGERHEART.CONFIG.TargetTypes.friendly'
}, },
hostile: { hostile: {
id: 'hostile', id: 'hostile',
label: 'Hostile' label: 'DAGGERHEART.CONFIG.TargetTypes.hostile'
}, },
any: { any: {
id: 'any', id: 'any',
label: 'Any' label: 'DAGGERHEART.CONFIG.TargetTypes.any'
} }
}; };
export const targetTypes = { export const targetTypes = {
self: { self: {
id: 'self', id: 'self',
label: 'Self' label: 'DAGGERHEART.CONFIG.TargetTypes.self'
}, },
...otherTargetTypes ...otherTargetTypes
}; };
@ -587,17 +587,17 @@ export const abilityCosts = {
}, },
hope: { hope: {
id: 'hope', id: 'hope',
label: 'Hope', label: 'DAGGERHEART.CONFIG.HealingType.hope.name',
group: 'TYPES.Actor.character' group: 'TYPES.Actor.character'
}, },
armor: { armor: {
id: 'armor', id: 'armor',
label: 'Armor Slot', label: 'DAGGERHEART.CONFIG.HealingType.armor.name',
group: 'TYPES.Actor.character' group: 'TYPES.Actor.character'
}, },
fear: { fear: {
id: 'fear', id: 'fear',
label: 'Fear', label: 'DAGGERHEART.CONFIG.HealingType.fear.name',
group: 'TYPES.Actor.adversary' group: 'TYPES.Actor.adversary'
}, },
resource: itemAbilityCosts.resource resource: itemAbilityCosts.resource

View file

@ -28,7 +28,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
actionType: new fields.StringField({ actionType: new fields.StringField({
choices: CONFIG.DH.ITEM.actionTypes, choices: CONFIG.DH.ITEM.actionTypes,
initial: 'action', initial: 'action',
nullable: true nullable: false,
required: true
}) })
}; };

View file

@ -218,7 +218,8 @@ export default class CostField extends fields.ArrayField {
* @returns * @returns
*/ */
static getRealCosts(costs) { static getRealCosts(costs) {
const realCosts = costs?.length ? costs.filter(c => c.enabled) : []; const cloneCosts = foundry.utils.deepClone(costs),
realCosts = cloneCosts?.length ? cloneCosts.filter(c => c.enabled) : [];
let mergedCosts = []; let mergedCosts = [];
realCosts.forEach(c => { realCosts.forEach(c => {
const getCost = Object.values(mergedCosts).find(gc => gc.key === c.key); const getCost = Object.values(mergedCosts).find(gc => gc.key === c.key);

View file

@ -176,7 +176,9 @@ export class DHActionDiceData extends foundry.abstract.DataModel {
multiplier: new fields.StringField({ multiplier: new fields.StringField({
choices: CONFIG.DH.GENERAL.multiplierTypes, choices: CONFIG.DH.GENERAL.multiplierTypes,
initial: 'prof', initial: 'prof',
label: 'DAGGERHEART.ACTIONS.Config.damage.multiplier' label: 'DAGGERHEART.ACTIONS.Config.damage.multiplier',
nullable: false,
required: true
}), }),
flatMultiplier: new fields.NumberField({ flatMultiplier: new fields.NumberField({
nullable: true, nullable: true,
@ -186,7 +188,9 @@ export class DHActionDiceData extends foundry.abstract.DataModel {
dice: new fields.StringField({ dice: new fields.StringField({
choices: CONFIG.DH.GENERAL.diceTypes, choices: CONFIG.DH.GENERAL.diceTypes,
initial: 'd6', initial: 'd6',
label: 'DAGGERHEART.GENERAL.Dice.single' label: 'DAGGERHEART.GENERAL.Dice.single',
nullable: false,
required: true
}), }),
bonus: new fields.NumberField({ nullable: true, initial: null, label: 'DAGGERHEART.GENERAL.bonus' }), bonus: new fields.NumberField({ nullable: true, initial: null, label: 'DAGGERHEART.GENERAL.bonus' }),
custom: new fields.SchemaField({ custom: new fields.SchemaField({

View file

@ -15,13 +15,17 @@ export class DHActionRollData extends foundry.abstract.DataModel {
bonus: new fields.NumberField({ nullable: true, initial: null, integer: true }), bonus: new fields.NumberField({ nullable: true, initial: null, integer: true }),
advState: new fields.StringField({ advState: new fields.StringField({
choices: CONFIG.DH.ACTIONS.advantageState, choices: CONFIG.DH.ACTIONS.advantageState,
initial: 'neutral' initial: 'neutral',
nullable: false,
required: true
}), }),
diceRolling: new fields.SchemaField({ diceRolling: new fields.SchemaField({
multiplier: new fields.StringField({ multiplier: new fields.StringField({
choices: CONFIG.DH.GENERAL.diceSetNumbers, choices: CONFIG.DH.GENERAL.diceSetNumbers,
initial: 'prof', initial: 'prof',
label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.multiplier' label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.multiplier',
nullable: false,
required: true
}), }),
flatMultiplier: new fields.NumberField({ flatMultiplier: new fields.NumberField({
nullable: true, nullable: true,
@ -31,7 +35,9 @@ export class DHActionRollData extends foundry.abstract.DataModel {
dice: new fields.StringField({ dice: new fields.StringField({
choices: CONFIG.DH.GENERAL.diceTypes, choices: CONFIG.DH.GENERAL.diceTypes,
initial: CONFIG.DH.GENERAL.diceTypes.d6, initial: CONFIG.DH.GENERAL.diceTypes.d6,
label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.dice' label: 'DAGGERHEART.ACTIONS.RollField.diceRolling.dice',
nullable: false,
required: true
}), }),
compare: new fields.StringField({ compare: new fields.StringField({
choices: CONFIG.DH.ACTIONS.diceCompare, choices: CONFIG.DH.ACTIONS.diceCompare,

View file

@ -19,7 +19,9 @@ export default class SaveField extends fields.SchemaField {
difficulty: new fields.NumberField({ nullable: true, initial: null, integer: true, min: 0 }), difficulty: new fields.NumberField({ nullable: true, initial: null, integer: true, min: 0 }),
damageMod: new fields.StringField({ damageMod: new fields.StringField({
initial: CONFIG.DH.ACTIONS.damageOnSave.none.id, initial: CONFIG.DH.ACTIONS.damageOnSave.none.id,
choices: CONFIG.DH.ACTIONS.damageOnSave choices: CONFIG.DH.ACTIONS.damageOnSave,
nullable: false,
required: true
}) })
}; };
super(saveFields, options, context); super(saveFields, options, context);

View file

@ -7,7 +7,8 @@ export default class TargetField extends fields.SchemaField {
type: new fields.StringField({ type: new fields.StringField({
choices: CONFIG.DH.GENERAL.targetTypes, choices: CONFIG.DH.GENERAL.targetTypes,
initial: CONFIG.DH.GENERAL.targetTypes.any.id, initial: CONFIG.DH.GENERAL.targetTypes.any.id,
nullable: true nullable: true,
blank: true
}), }),
amount: new fields.NumberField({ nullable: true, initial: null, integer: true, min: 0 }) amount: new fields.NumberField({ nullable: true, initial: null, integer: true, min: 0 })
}; };

View file

@ -169,7 +169,7 @@ export const defaultLevelTiers = {
tiers: { tiers: {
2: { 2: {
tier: 2, tier: 2,
name: 'Tier 2', name: 'DAGGERHEART.APPLICATIONS.Levelup.tier2.name',
levels: { levels: {
start: 2, start: 2,
end: 4 end: 4
@ -232,7 +232,7 @@ export const defaultLevelTiers = {
}, },
3: { 3: {
tier: 3, tier: 3,
name: 'Tier 3', name: 'DAGGERHEART.APPLICATIONS.Levelup.tier3.name',
levels: { levels: {
start: 5, start: 5,
end: 7 end: 7
@ -313,7 +313,7 @@ export const defaultLevelTiers = {
}, },
4: { 4: {
tier: 4, tier: 4,
name: 'Tier 4', name: 'DAGGERHEART.APPLICATIONS.Levelup.tier4.name',
levels: { levels: {
start: 8, start: 8,
end: 10 end: 10

View file

@ -234,7 +234,7 @@ export class DhLevelup extends foundry.abstract.DataModel {
const subclassInTier = subclasses.some(x => x.tier === Number(tierKey)); const subclassInTier = subclasses.some(x => x.tier === Number(tierKey));
return { return {
name: tier.name, name: game.i18n.localize(tier.name),
active: this.currentLevel >= Math.min(...tier.belongingLevels), active: this.currentLevel >= Math.min(...tier.belongingLevels),
groups: Object.keys(tier.options).map(optionKey => { groups: Object.keys(tier.options).map(optionKey => {
const option = tier.options[optionKey]; const option = tier.options[optionKey];

View file

@ -9,12 +9,12 @@ export default function DhDualityRollEnricher(match, _options) {
} }
function getDualityMessage(roll, flavor) { function getDualityMessage(roll, flavor) {
const trait = roll.trait && abilities[roll.trait] ? game.i18n.localize(abilities[roll.trait].label) : null; const trait = roll?.trait && abilities[roll.trait] ? game.i18n.localize(abilities[roll.trait].label) : null;
const label = const label =
flavor ?? flavor ??
(roll.trait (roll?.trait
? game.i18n.format('DAGGERHEART.GENERAL.rollWith', { roll: trait }) ? game.i18n.format('DAGGERHEART.GENERAL.rollWith', { roll: trait })
: roll.reaction : roll?.reaction
? game.i18n.localize('DAGGERHEART.GENERAL.reactionRoll') ? game.i18n.localize('DAGGERHEART.GENERAL.reactionRoll')
: game.i18n.localize('DAGGERHEART.GENERAL.duality')); : game.i18n.localize('DAGGERHEART.GENERAL.duality'));
@ -22,9 +22,9 @@ function getDualityMessage(roll, flavor) {
? game.i18n.localize(abilities[roll.trait].label) ? game.i18n.localize(abilities[roll.trait].label)
: game.i18n.localize('DAGGERHEART.GENERAL.duality'); : game.i18n.localize('DAGGERHEART.GENERAL.duality');
const advantage = roll.advantage const advantage = roll?.advantage
? CONFIG.DH.ACTIONS.advantageState.advantage.value ? CONFIG.DH.ACTIONS.advantageState.advantage.value
: roll.disadvantage : roll?.disadvantage
? CONFIG.DH.ACTIONS.advantageState.disadvantage.value ? CONFIG.DH.ACTIONS.advantageState.disadvantage.value
: undefined; : undefined;
const advantageLabel = const advantageLabel =
@ -36,21 +36,21 @@ function getDualityMessage(roll, flavor) {
const dualityElement = document.createElement('span'); const dualityElement = document.createElement('span');
dualityElement.innerHTML = ` dualityElement.innerHTML = `
<button type="button" class="duality-roll-button${roll.inline ? ' inline' : ''}" <button type="button" class="duality-roll-button${roll?.inline ? ' inline' : ''}"
data-title="${label}" data-title="${label}"
data-label="${dataLabel}" data-label="${dataLabel}"
data-reaction="${roll.reaction ? 'true' : 'false'}" data-reaction="${roll?.reaction ? 'true' : 'false'}"
data-hope="${roll.hope ?? 'd12'}" data-hope="${roll?.hope ?? 'd12'}"
data-fear="${roll.fear ?? 'd12'}" data-fear="${roll?.fear ?? 'd12'}"
${advantage ? `data-advantage="${advantage}"` : ''} ${advantage ? `data-advantage="${advantage}"` : ''}
${roll.difficulty !== undefined ? `data-difficulty="${roll.difficulty}"` : ''} ${roll?.difficulty !== undefined ? `data-difficulty="${roll.difficulty}"` : ''}
${roll.trait && abilities[roll.trait] ? `data-trait="${roll.trait}"` : ''} ${roll?.trait && abilities[roll.trait] ? `data-trait="${roll.trait}"` : ''}
${roll.advantage ? 'data-advantage="true"' : ''} ${roll?.advantage ? 'data-advantage="true"' : ''}
${roll.disadvantage ? 'data-disadvantage="true"' : ''} ${roll?.disadvantage ? 'data-disadvantage="true"' : ''}
> >
${roll.reaction ? '<i class="fa-solid fa-reply"></i>' : '<i class="fa-solid fa-circle-half-stroke"></i>'} ${roll?.reaction ? '<i class="fa-solid fa-reply"></i>' : '<i class="fa-solid fa-circle-half-stroke"></i>'}
${label} ${label}
${!flavor && (roll.difficulty || advantageLabel) ? `(${[roll.difficulty, advantageLabel ? game.i18n.localize(`DAGGERHEART.GENERAL.${advantageLabel}.short`) : null].filter(x => x).join(' ')})` : ''} ${!flavor && (roll?.difficulty || advantageLabel) ? `(${[roll.difficulty, advantageLabel ? game.i18n.localize(`DAGGERHEART.GENERAL.${advantageLabel}.short`) : null].filter(x => x).join(' ')})` : ''}
</button> </button>
`; `;

View file

@ -557,11 +557,11 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "1.1.2",
"lastModifiedBy": "MQSznptE5yLT7kj8", "lastModifiedBy": "mdk78Q6pOyHh6aBg",
"modifiedTime": 1754143653876 "modifiedTime": 1756510879809
}, },
"_key": "!actors.items!89yAh30vaNQOALlz.UpFsnlbZkyvM2Ftv" "_key": "!actors.items!89yAh30vaNQOALlz.UpFsnlbZkyvM2Ftv"
}, },

View file

@ -342,12 +342,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "1.1.2",
"createdTime": 1754127683751, "createdTime": 1754127683751,
"modifiedTime": 1754127795809, "modifiedTime": 1756511006257,
"lastModifiedBy": "MQSznptE5yLT7kj8" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_key": "!actors.items!dsfB3YhoL5SudvS2.NnCkXIuATO0s3tSR" "_key": "!actors.items!dsfB3YhoL5SudvS2.NnCkXIuATO0s3tSR"
}, },

View file

@ -348,12 +348,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "1.1.2",
"createdTime": 1754129153649, "createdTime": 1754129153649,
"modifiedTime": 1754129204931, "modifiedTime": 1756510982337,
"lastModifiedBy": "MQSznptE5yLT7kj8" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_key": "!actors.items!6hbqmxDXFOzZJDk4.BQsVuuwFYByKwesR" "_key": "!actors.items!6hbqmxDXFOzZJDk4.BQsVuuwFYByKwesR"
}, },

View file

@ -110,19 +110,20 @@
"source": "Daggerheart SRD", "source": "Daggerheart SRD",
"page": 95, "page": 95,
"artist": "" "artist": ""
} },
"motivesAndTactics": "Hide in plain sight, preserve the forest, root down, swing branches"
}, },
"flags": {}, "flags": {},
"_stats": { "_stats": {
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.347", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "1.0.5", "systemVersion": "1.1.2",
"createdTime": 1753922784314, "createdTime": 1753922784314,
"modifiedTime": 1755385515496, "modifiedTime": 1757057641714,
"lastModifiedBy": "VZIeX2YDvX338Zvr" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_id": "XK78QUfY8c8Go8Uv", "_id": "XK78QUfY8c8Go8Uv",
"sort": 3400000, "sort": 3400000,

View file

@ -431,7 +431,7 @@
"_key": "!actors.items!3aAS2Qm3R6cgaYfE.tQgxiSS48TJ3X1Dl" "_key": "!actors.items!3aAS2Qm3R6cgaYfE.tQgxiSS48TJ3X1Dl"
}, },
{ {
"name": "Avalance Roar", "name": "Avalanche Roar",
"type": "feature", "type": "feature",
"system": { "system": {
"description": "<p><strong>Spend a Fear</strong> to roar while within a cave and cause a cave-in. All targets within Close range must succeed on an Agility Reaction Roll (14) or take <strong>2d10</strong> physical damage. The rubble can be cleared with a Progress Countdown (8).</p><p>@Template[type:emanation|range:c]</p>", "description": "<p><strong>Spend a Fear</strong> to roar while within a cave and cause a cave-in. All targets within Close range must succeed on an Agility Reaction Roll (14) or take <strong>2d10</strong> physical damage. The rubble can be cleared with a Progress Countdown (8).</p><p>@Template[type:emanation|range:c]</p>",
@ -535,12 +535,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.347",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "0.0.1",
"createdTime": 1754085059319, "createdTime": 1754085059319,
"modifiedTime": 1754143365810, "modifiedTime": 1756256613353,
"lastModifiedBy": "MQSznptE5yLT7kj8" "lastModifiedBy": "CEZZA7TXd7uT8O2c"
}, },
"_key": "!actors.items!3aAS2Qm3R6cgaYfE.9Z0i0uURfBMVIapJ" "_key": "!actors.items!3aAS2Qm3R6cgaYfE.9Z0i0uURfBMVIapJ"
}, },

View file

@ -301,12 +301,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "1.1.2",
"createdTime": 1754055148507, "createdTime": 1754055148507,
"modifiedTime": 1754145130460, "modifiedTime": 1756510967769,
"lastModifiedBy": "MQSznptE5yLT7kj8" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_key": "!actors.items!aLkLFuVoKz2NLoBK.WpOh5kHHx7lcTvEY" "_key": "!actors.items!aLkLFuVoKz2NLoBK.WpOh5kHHx7lcTvEY"
} }

View file

@ -552,7 +552,7 @@
"_key": "!actors.items!UGPiPLJsPvMTSKEF.QV2ytK4b1VWF71OS" "_key": "!actors.items!UGPiPLJsPvMTSKEF.QV2ytK4b1VWF71OS"
}, },
{ {
"name": "Avalance", "name": "Avalanche",
"type": "feature", "type": "feature",
"system": { "system": {
"description": "<p><strong>Spend a Fear</strong> to have the Dragon unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming <em>Vulnerable</em> until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.</p><p>@Template[type:emanation|range:f]</p>", "description": "<p><strong>Spend a Fear</strong> to have the Dragon unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming <em>Vulnerable</em> until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.</p><p>@Template[type:emanation|range:f]</p>",
@ -681,12 +681,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.347",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "0.0.1",
"createdTime": 1754131703390, "createdTime": 1754131703390,
"modifiedTime": 1754131790034, "modifiedTime": 1756256581072,
"lastModifiedBy": "MQSznptE5yLT7kj8" "lastModifiedBy": "CEZZA7TXd7uT8O2c"
}, },
"_key": "!actors.items!UGPiPLJsPvMTSKEF.CcRTxCDCJskiu3fI" "_key": "!actors.items!UGPiPLJsPvMTSKEF.CcRTxCDCJskiu3fI"
}, },

View file

@ -182,7 +182,7 @@
"_key": "!actors.items!acMu9wJrMZZzLSTJ.cIAMenvMXHPTpOFn" "_key": "!actors.items!acMu9wJrMZZzLSTJ.cIAMenvMXHPTpOFn"
}, },
{ {
"name": "Avalance", "name": "Avalanche",
"type": "feature", "type": "feature",
"system": { "system": {
"description": "<p>Spend a Fear to carve the mountain with an icy torrent, causing an avalanche. All PCs in its path must succeed on an Agility or Strength Reaction Roll or be bowled over and carried down the mountain. A PC using rope, pitons, or other climbing gear gains advantage on this roll. Targets who fail are knocked down the mountain to Far range, take <strong>2d20</strong> physical damage, and must mark a Stress. Targets who succeed must mark a Stress. </p><section id=\"secret-3gM8fEJj1vD9W88k\" class=\"secret\"><p><em>How do the PCs try to weather the avalanche? What approach do the characters take to fi nd one another when their companions go hurtling down the mountainside?</em></p></section>", "description": "<p>Spend a Fear to carve the mountain with an icy torrent, causing an avalanche. All PCs in its path must succeed on an Agility or Strength Reaction Roll or be bowled over and carried down the mountain. A PC using rope, pitons, or other climbing gear gains advantage on this roll. Targets who fail are knocked down the mountain to Far range, take <strong>2d20</strong> physical damage, and must mark a Stress. Targets who succeed must mark a Stress. </p><section id=\"secret-3gM8fEJj1vD9W88k\" class=\"secret\"><p><em>How do the PCs try to weather the avalanche? What approach do the characters take to fi nd one another when their companions go hurtling down the mountainside?</em></p></section>",
@ -257,12 +257,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.347",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "0.0.1",
"createdTime": 1754217019442, "createdTime": 1754217019442,
"modifiedTime": 1754217102897, "modifiedTime": 1756256534443,
"lastModifiedBy": "MQSznptE5yLT7kj8" "lastModifiedBy": "CEZZA7TXd7uT8O2c"
}, },
"_key": "!actors.items!acMu9wJrMZZzLSTJ.jkm03DXYYajsRk2j" "_key": "!actors.items!acMu9wJrMZZzLSTJ.jkm03DXYYajsRk2j"
}, },

View file

@ -110,13 +110,14 @@
"effects": [ "effects": [
{ {
"name": "Protective", "name": "Protective",
"description": "Add your character's Tier to your Armor Score", "description": "<p>Add the item's Tier to your Armor Score</p>",
"img": "icons/skills/melee/shield-block-gray-orange.webp", "img": "icons/skills/melee/shield-block-gray-orange.webp",
"changes": [ "changes": [
{ {
"key": "system.armorScore", "key": "system.armorScore",
"mode": 2, "mode": 2,
"value": "ITEM.@system.tier" "value": "ITEM.@system.tier",
"priority": null
} }
], ],
"_id": "i5HfkF5aKQuUCTEG", "_id": "i5HfkF5aKQuUCTEG",
@ -125,7 +126,12 @@
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
"combat": null "combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"origin": null, "origin": null,
"tint": "#ffffff", "tint": "#ffffff",
@ -137,12 +143,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "0.0.1",
"createdTime": 1753794875150, "createdTime": 1753794875150,
"modifiedTime": 1753794875150, "modifiedTime": 1756682958806,
"lastModifiedBy": "FecEtPuoQh6MpjQ0" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_key": "!items.effects!hiEOGF2reabGLUoi.i5HfkF5aKQuUCTEG" "_key": "!items.effects!hiEOGF2reabGLUoi.i5HfkF5aKQuUCTEG"
} }

View file

@ -110,13 +110,14 @@
"effects": [ "effects": [
{ {
"name": "Protective", "name": "Protective",
"description": "Add your character's Tier to your Armor Score", "description": "<p>Add the item's Tier to your Armor Score</p>",
"img": "icons/skills/melee/shield-block-gray-orange.webp", "img": "icons/skills/melee/shield-block-gray-orange.webp",
"changes": [ "changes": [
{ {
"key": "system.armorScore", "key": "system.armorScore",
"mode": 2, "mode": 2,
"value": "ITEM.@system.tier" "value": "ITEM.@system.tier",
"priority": null
} }
], ],
"_id": "cXWSV50apzaNQkdA", "_id": "cXWSV50apzaNQkdA",
@ -125,7 +126,12 @@
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
"combat": null "combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"origin": null, "origin": null,
"tint": "#ffffff", "tint": "#ffffff",
@ -137,12 +143,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "0.0.1",
"createdTime": 1753794098464, "createdTime": 1753794098464,
"modifiedTime": 1753794098464, "modifiedTime": 1756682973559,
"lastModifiedBy": "FecEtPuoQh6MpjQ0" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_key": "!items.effects!DlinEBGZfIlvreO3.cXWSV50apzaNQkdA" "_key": "!items.effects!DlinEBGZfIlvreO3.cXWSV50apzaNQkdA"
} }

View file

@ -110,13 +110,14 @@
"effects": [ "effects": [
{ {
"name": "Protective", "name": "Protective",
"description": "Add your character's Tier to your Armor Score", "description": "<p>Add the item's Tier to your Armor Score</p>",
"img": "icons/skills/melee/shield-block-gray-orange.webp", "img": "icons/skills/melee/shield-block-gray-orange.webp",
"changes": [ "changes": [
{ {
"key": "system.armorScore", "key": "system.armorScore",
"mode": 2, "mode": 2,
"value": "ITEM.@system.tier" "value": "ITEM.@system.tier",
"priority": null
} }
], ],
"_id": "Z2p00q5h6x6seXys", "_id": "Z2p00q5h6x6seXys",
@ -125,7 +126,12 @@
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
"combat": null "combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"origin": null, "origin": null,
"tint": "#ffffff", "tint": "#ffffff",
@ -137,12 +143,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "0.0.1",
"createdTime": 1753796983285, "createdTime": 1753796983285,
"modifiedTime": 1753796983285, "modifiedTime": 1756682777682,
"lastModifiedBy": "FecEtPuoQh6MpjQ0" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_key": "!items.effects!A28WL9E2lJ3iLZHW.Z2p00q5h6x6seXys" "_key": "!items.effects!A28WL9E2lJ3iLZHW.Z2p00q5h6x6seXys"
} }

View file

@ -110,13 +110,14 @@
"effects": [ "effects": [
{ {
"name": "Protective", "name": "Protective",
"description": "Add your character's Tier to your Armor Score", "description": "<p>Add the item's Tier to your Armor Score.</p>",
"img": "icons/skills/melee/shield-block-gray-orange.webp", "img": "icons/skills/melee/shield-block-gray-orange.webp",
"changes": [ "changes": [
{ {
"key": "system.armorScore", "key": "system.armorScore",
"mode": 2, "mode": 2,
"value": "ITEM.@system.tier" "value": "ITEM.@system.tier",
"priority": null
} }
], ],
"_id": "M70a81e0Mg66jHRL", "_id": "M70a81e0Mg66jHRL",
@ -125,7 +126,12 @@
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
"combat": null "combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"origin": null, "origin": null,
"tint": "#ffffff", "tint": "#ffffff",
@ -137,12 +143,12 @@
"compendiumSource": null, "compendiumSource": null,
"duplicateSource": null, "duplicateSource": null,
"exportSource": null, "exportSource": null,
"coreVersion": "13.346", "coreVersion": "13.348",
"systemId": "daggerheart", "systemId": "daggerheart",
"systemVersion": "0.0.1", "systemVersion": "0.0.1",
"createdTime": 1753794114980, "createdTime": 1753794114980,
"modifiedTime": 1753794114980, "modifiedTime": 1756682994216,
"lastModifiedBy": "FecEtPuoQh6MpjQ0" "lastModifiedBy": "mdk78Q6pOyHh6aBg"
}, },
"_key": "!items.effects!mxwWKDujgsRcZWPT.M70a81e0Mg66jHRL" "_key": "!items.effects!mxwWKDujgsRcZWPT.M70a81e0Mg66jHRL"
} }

View file

@ -1,6 +1,6 @@
<fieldset class="one-column" data-key="cost"> <fieldset class="one-column" data-key="cost">
<legend> <legend>
Cost {{localize "DAGGERHEART.GENERAL.Cost.single"}}
<a><i class="fa-solid fa-plus icon-button" data-action="addElement"></i></a> <a><i class="fa-solid fa-plus icon-button" data-action="addElement"></i></a>
</legend> </legend>
{{#each source as |cost index|}} {{#each source as |cost index|}}
@ -8,10 +8,10 @@
{{formField ../fields.consumeOnSuccess value=cost.consumeOnSuccess name=(concat "cost." index ".consumeOnSuccess") classes="checkbox" rootId=partId localize=true}} {{formField ../fields.consumeOnSuccess value=cost.consumeOnSuccess name=(concat "cost." index ".consumeOnSuccess") classes="checkbox" rootId=partId localize=true}}
{{/if}} {{/if}}
<div class="nest-inputs"> <div class="nest-inputs">
{{formField ../fields.scalable label="Scalable" value=cost.scalable name=(concat "cost." index ".scalable") classes="checkbox"}} {{formField ../fields.scalable label="DAGGERHEART.GENERAL.scalable" value=cost.scalable name=(concat "cost." index ".scalable") classes="checkbox" localize=true}}
{{formField ../fields.key choices=(@root.disableOption index @root.costOptions ../source) label="Resource" value=cost.key name=(concat "cost." index ".key") localize=true blank=false}} {{formField ../fields.key choices=(@root.disableOption index @root.costOptions ../source) label="DAGGERHEART.GENERAL.resource" value=cost.key name=(concat "cost." index ".key") localize=true blank=false}}
{{formField ../fields.value label="Amount" value=cost.value name=(concat "cost." index ".value")}} {{formField ../fields.value label="DAGGERHEART.GENERAL.amount" value=cost.value name=(concat "cost." index ".value") localize=true}}
{{formField ../fields.step label="Step" value=cost.step name=(concat "cost." index ".step") disabled=(not cost.scalable)}} {{formField ../fields.step label="DAGGERHEART.GENERAL.step" value=cost.step name=(concat "cost." index ".step") disabled=(not cost.scalable) localize=true}}
<a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a> <a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a>
</div> </div>
{{/each}} {{/each}}

View file

@ -1,12 +1,12 @@
<fieldset class="one-column"> <fieldset class="one-column">
<legend>{{localize "DAGGERHEART.GENERAL.range"}}{{#if fields.target}} & {{localize "DAGGERHEART.GENERAL.Target.single"}}{{/if}}</legend> <legend>{{localize "DAGGERHEART.GENERAL.range"}}{{#if fields.target}} & {{localize "DAGGERHEART.GENERAL.Target.single"}}{{/if}}</legend>
{{formField fields.range value=source.range label="Range" name=(concat path "range") localize=true}} {{formField fields.range value=source.range label="DAGGERHEART.GENERAL.range" name=(concat path "range") localize=true}}
{{#if fields.target}} {{#if fields.target}}
<div class="nest-inputs"> <div class="nest-inputs">
{{#if (and source.target.type (not (eq source.target.type 'self')))}} {{#if (and source.target.type (not (eq source.target.type 'self')))}}
{{ formField fields.target.amount value=source.target.amount label="Amount" name=(concat path "target.amount") }} {{ formField fields.target.amount value=source.target.amount label="DAGGERHEART.GENERAL.amount" name=(concat path "target.amount") localize=true}}
{{/if}} {{/if}}
{{ formField fields.target.type value=source.target.type label="Target" name=(concat path "target.type") localize=true }} {{ formField fields.target.type value=source.target.type label="DAGGERHEART.GENERAL.Target.single" name=(concat path "target.type") localize=true }}
</div> </div>
{{/if}} {{/if}}
</fieldset> </fieldset>

View file

@ -4,8 +4,8 @@
{{formField fields.consumeOnSuccess value=source.consumeOnSuccess name="uses.consumeOnSuccess" classes="checkbox" rootId=partId localize=true}} {{formField fields.consumeOnSuccess value=source.consumeOnSuccess name="uses.consumeOnSuccess" classes="checkbox" rootId=partId localize=true}}
{{/if}} {{/if}}
<div class="nest-inputs"> <div class="nest-inputs">
{{formField fields.value label="Spent" value=source.value name="uses.value" rootId=partId}} {{formField fields.value label="DAGGERHEART.GENERAL.spent" value=source.value name="uses.value" rootId=partId localize=true}}
{{formField fields.max label="Max" value=source.max name="uses.max" rootId=partId}} {{formField fields.max label="DAGGERHEART.GENERAL.max" value=source.max name="uses.max" rootId=partId localize=true}}
</div> </div>
{{formField fields.recovery label="Recovery" value=source.recovery name="uses.recovery" rootId=partId localize=true}} {{formField fields.recovery label="DAGGERHEART.GENERAL.recovery" value=source.recovery name="uses.recovery" rootId=partId localize=true}}
</fieldset> </fieldset>

View file

@ -146,7 +146,7 @@
<select class="roll-mode-select" name="selectedRollMode"> <select class="roll-mode-select" name="selectedRollMode">
{{selectOptions rollModes selected=selectedRollMode valueAttr="action" labelAttr="label" localize=true}} {{selectOptions rollModes selected=selectedRollMode valueAttr="action" labelAttr="label" localize=true}}
</select> </select>
<button class="sunmit-btn" data-action="submitRoll"{{#unless canRoll}} disabled{{/unless}}> <button class="submit-btn" data-action="submitRoll"{{#unless canRoll}} disabled{{/unless}}>
<i class="fa-solid fa-dice"></i> <i class="fa-solid fa-dice"></i>
<span class="label"> <span class="label">
{{#if @root.rollConfig.roll.difficulty}} {{#if @root.rollConfig.roll.difficulty}}
@ -162,7 +162,7 @@
{{> 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs'}} {{> 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs'}}
{{/if}} {{/if}}
<div class="roll-dialog-controls"> <div class="roll-dialog-controls">
<button class="sunmit-btn" data-action="submitRoll"{{#unless canRoll}} disabled{{/unless}}> <button class="submit-btn" data-action="submitRoll"{{#unless canRoll}} disabled{{/unless}}>
<span class="label">{{localize "DAGGERHEART.GENERAL.continue"}}</span> <span class="label">{{localize "DAGGERHEART.GENERAL.continue"}}</span>
</button> </button>
</div> </div>