Compare commits

...

8 commits

17 changed files with 180 additions and 174 deletions

View file

@ -1,78 +1,9 @@
# Contributing to Foundryborne # Contributing to Daggerheart
Welcome! This is a community-driven project to bring [Daggerheart](https://www.daggerheart.com/) to [FoundryVTT](https://foundryvtt.com/) as a full system. We're excited to have you here and appreciate your interest in contributing. Thank you for your interest in contributing to the Foundryborne project!
--- To ensure that all contributions align with our project goals and architectural standards, we ask that you **do not submit outside contributions without first receiving feedback from the development team.**
## 🤝 How to Contribute If you have an idea or a fix you'd like to contribute, please start a discussion or open an issue first. We'd love to hear from you and collaborate on the best way to move forward!
We welcome contributions of all kinds: Thank you for your understanding and support.
- Bug reports
- Feature suggestions
- Code contributions
- UI/UX mockups
- Documentation improvements
- Questions and discussions
Please be respectful and collaborative — were all here to build something great together.
### Community Translations
Please note that we are not accepting community translations in the main project. Instead, community translations should be published as a module.
---
## 🧭 General Guidelines
- **Use GitHub Issues** to report bugs or propose features
- **Start a Discussion** for larger ideas or questions
- **Open a Pull Request** once you've confirmed your work aligns with project direction
- **Keep things modular and maintainable** — if you're not sure how to structure something, ask!
- **Orient your code on existing examples**, and feel free to suggest a standard if it makes things clearer
---
## 🗂️ Project Structure
Please try to follow the general logic of the existing code when submitting PRs.
We encourage contributors to leave comments or open Discussions when proposing structural or organizational changes.
---
## 🧾 Issue & PR Best Practices
**For Issues:**
- Use clear, descriptive titles
- Provide a concise explanation of the problem or idea
- Include reproduction steps or example scenarios if it's a bug
- Add screenshots or logs if helpful
**For Pull Requests:**
- Use a clear title summarizing the change
- Provide a brief description of what your code does and why
- Link to any related Issues
- Keep PRs focused — smaller is better
---
## 🔖 Labels and Boards
We use GitHub labels to help organize contributions. If your issue or PR relates to a specific category, feel free to tag it. There is also a GitHub Project Board to help track active work and priorities.
---
## 📣 Communication
Discussions are currently happening on GitHub — in Issues, PRs, and [GitHub Discussions](https://github.com/Foundryborne/daggerheart/discussions). You're welcome to use any of these, though we may consolidate to one in the future.
---
## 🤗 Thank You!
Whether you're fixing a typo or designing entire mechanics — every contribution matters. Thank you for helping bring _Daggerheart_ to life in FoundryVTT through **Foundryborne**!
🐸🛠️

View file

@ -355,6 +355,8 @@ Hooks.on(CONFIG.DH.HOOKS.hooksConfig.groupRollStart, async data => {
}); });
const updateActorsRangeDependentEffects = async token => { const updateActorsRangeDependentEffects = async token => {
if (!token) return;
const rangeMeasurement = game.settings.get( const rangeMeasurement = game.settings.get(
CONFIG.DH.id, CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.variantRules CONFIG.DH.SETTINGS.gameSettings.variantRules

View file

@ -74,9 +74,7 @@
"name": "Summon", "name": "Summon",
"tooltip": "Create tokens in the scene.", "tooltip": "Create tokens in the scene.",
"error": "You do not have permission to summon tokens or there is no active scene.", "error": "You do not have permission to summon tokens or there is no active scene.",
"invalidDrop": "You can only drop Actor entities to summon.", "invalidDrop": "You can only drop Actor entities to summon."
"chatMessageTitle": "Test2",
"chatMessageHeaderTitle": "Summoning"
}, },
"transform": { "transform": {
"name": "Transform", "name": "Transform",
@ -2016,6 +2014,10 @@
"hint": "Multiply any damage dealt to you by this number" "hint": "Multiply any damage dealt to you by this number"
} }
}, },
"Battlepoints": {
"full": "Battlepoints",
"short": "BP"
},
"Bonuses": { "Bonuses": {
"rest": { "rest": {
"downtimeAction": "Downtime Action", "downtimeAction": "Downtime Action",
@ -2431,6 +2433,7 @@
"next": "Next", "next": "Next",
"none": "None", "none": "None",
"noTarget": "No current target", "noTarget": "No current target",
"optionalThing": "Optional {thing}",
"partner": "Partner", "partner": "Partner",
"player": { "player": {
"single": "Player", "single": "Player",
@ -2457,6 +2460,7 @@
"rollDamage": "Roll Damage", "rollDamage": "Roll Damage",
"rollWith": "{roll} Roll", "rollWith": "{roll} Roll",
"save": "Save", "save": "Save",
"saveSettings": "Save Settings",
"scalable": "Scalable", "scalable": "Scalable",
"scars": "Scars", "scars": "Scars",
"situationalBonus": "Situational Bonus", "situationalBonus": "Situational Bonus",
@ -2611,8 +2615,14 @@
}, },
"Weapon": { "Weapon": {
"weaponType": "Weapon Type", "weaponType": "Weapon Type",
"primaryWeapon": "Primary Weapon", "primaryWeapon": {
"secondaryWeapon": "Secondary Weapon" "full": "Primary Weapon",
"short": "Primary"
},
"secondaryWeapon": {
"full": "Secondary Weapon",
"short": "Secondary"
}
} }
}, },
"MACROS": { "MACROS": {
@ -3067,6 +3077,7 @@
}, },
"ItemBrowser": { "ItemBrowser": {
"title": "Daggerheart Compendium Browser", "title": "Daggerheart Compendium Browser",
"windowTitle": "Compendium Browser",
"hint": "Select a Folder in sidebar to start browsing through the compendium", "hint": "Select a Folder in sidebar to start browsing through the compendium",
"browserSettings": "Browser Settings", "browserSettings": "Browser Settings",
"columnName": "Name", "columnName": "Name",

View file

@ -11,7 +11,10 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
this.character = character; this.character = character;
this.setup = { this.setup = {
traits: this.character.system.traits, traits: Object.keys(this.character.system.traits).reduce((acc, key) => {
acc[key] = { value: null };
return acc;
}, {}),
ancestryName: { ancestryName: {
primary: '', primary: '',
secondary: '' secondary: ''
@ -377,8 +380,10 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
]; ];
return Object.values(this.setup.traits).reduce((acc, x) => { return Object.values(this.setup.traits).reduce((acc, x) => {
const index = traitCompareArray.indexOf(x.value); const index = traitCompareArray.indexOf(x.value);
if (index === -1) return acc;
traitCompareArray.splice(index, 1); traitCompareArray.splice(index, 1);
acc += index !== -1; acc += 1;
return acc; return acc;
}, 0); }, 0);
} }

View file

@ -37,7 +37,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
tag: 'div', tag: 'div',
window: { window: {
frame: true, frame: true,
title: 'Compendium Browser', title: 'DAGGERHEART.UI.ItemBrowser.windowTitle',
icon: 'fa-solid fa-book-atlas', icon: 'fa-solid fa-book-atlas',
positioned: true, positioned: true,
resizable: true resizable: true
@ -583,7 +583,9 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
const { itemUuid } = event.target.closest('[data-item-uuid]').dataset, const { itemUuid } = event.target.closest('[data-item-uuid]').dataset,
item = await foundry.utils.fromUuid(itemUuid), item = await foundry.utils.fromUuid(itemUuid),
dragData = item.toDragData(); dragData = item.toDragData();
event.dataTransfer.setData('text/plain', JSON.stringify(dragData)); event.dataTransfer.setData('text/plain', JSON.stringify(dragData));
event.dataTransfer.setDragImage(event.target.querySelector('img'), 0, 0);
} }
_canDragStart() { _canDragStart() {

View file

@ -74,12 +74,13 @@ export const typeConfig = {
columns: [ columns: [
{ {
key: 'type', key: 'type',
label: 'DAGGERHEART.GENERAL.type' label: 'DAGGERHEART.GENERAL.type',
format: type => type ? `TYPES.Item.${type}` : '-'
}, },
{ {
key: 'system.secondary', key: 'system.secondary',
label: 'DAGGERHEART.UI.ItemBrowser.subtype', label: 'DAGGERHEART.UI.ItemBrowser.subtype',
format: isSecondary => (isSecondary ? 'secondary' : isSecondary === false ? 'primary' : '-') format: isSecondary => (isSecondary ? 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon.short' : isSecondary === false ? 'DAGGERHEART.ITEMS.Weapon.primaryWeapon.short' : '-')
}, },
{ {
key: 'system.tier', key: 'system.tier',
@ -99,8 +100,8 @@ export const typeConfig = {
key: 'system.secondary', key: 'system.secondary',
label: 'DAGGERHEART.UI.ItemBrowser.subtype', label: 'DAGGERHEART.UI.ItemBrowser.subtype',
choices: [ choices: [
{ value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon' }, { value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon.full' },
{ value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon' } { value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full' }
] ]
}, },
{ {
@ -258,11 +259,13 @@ export const typeConfig = {
columns: [ columns: [
{ {
key: 'system.type', key: 'system.type',
label: 'DAGGERHEART.GENERAL.type' label: 'DAGGERHEART.GENERAL.type',
format: type => type ? `DAGGERHEART.CONFIG.DomainCardTypes.${type}` : '-'
}, },
{ {
key: 'system.domain', key: 'system.domain',
label: 'DAGGERHEART.GENERAL.Domain.single' label: 'DAGGERHEART.GENERAL.Domain.single',
format: domain => domain ? CONFIG.DH.DOMAIN.allDomains()[domain].label : '-'
}, },
{ {
key: 'system.level', key: 'system.level',
@ -374,7 +377,7 @@ export const typeConfig = {
columns: [ columns: [
{ {
key: 'system.linkedClass', key: 'system.linkedClass',
label: 'Class', label: 'TYPES.Item.class',
format: linkedClass => linkedClass?.name ?? 'DAGGERHEART.UI.ItemBrowser.missing' format: linkedClass => linkedClass?.name ?? 'DAGGERHEART.UI.ItemBrowser.missing'
}, },
{ {
@ -386,7 +389,7 @@ export const typeConfig = {
filters: [ filters: [
{ {
key: 'system.linkedClass.uuid', key: 'system.linkedClass.uuid',
label: 'Class', label: 'TYPES.Item.class',
choices: items => { choices: items => {
const list = items const list = items
.filter(item => item.system.linkedClass) .filter(item => item.system.linkedClass)
@ -410,7 +413,8 @@ export const typeConfig = {
}, },
{ {
key: 'system.mainTrait', key: 'system.mainTrait',
label: 'DAGGERHEART.GENERAL.Trait.single' label: 'DAGGERHEART.GENERAL.Trait.single',
format: trait => (trait ? `DAGGERHEART.CONFIG.Traits.${trait}.name` : '-')
} }
], ],
filters: [ filters: [

View file

@ -68,31 +68,33 @@
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "range": "melee"
}
}, },
"changes": [ "changes": [
{ {
"key": "system.resistance.physical.resistance", "key": "system.resistance.physical.resistance",
"mode": 5, "type": "override",
"value": "1", "value": 1,
"priority": null "priority": null,
"phase": "initial"
}, },
{ {
"key": "system.disadvantageSources", "key": "system.disadvantageSources",
"mode": 2, "type": "add",
"value": "Retract", "value": "Action rolls",
"priority": null "priority": null,
"phase": "initial"
} }
], ],
"duration": {
"type": ""
}
},
"disabled": true, "disabled": true,
"duration": { "duration": {
"startTime": null, "value": null,
"combat": null, "units": "seconds",
"seconds": null, "expiry": null,
"rounds": null, "expired": false
"turns": null,
"startRound": null,
"startTurn": null
}, },
"description": "<p>While in your shell, you have resistance to physical damage, you have disadvantage on action rolls, and you cant move.</p>", "description": "<p>While in your shell, you have resistance to physical damage, you have disadvantage on action rolls, and you cant move.</p>",
"tint": "#ffffff", "tint": "#ffffff",
@ -102,6 +104,16 @@
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"start": {
"time": 0,
"combat": null,
"combatant": null,
"initiative": null,
"round": null,
"turn": null
},
"showIcon": 1,
"folder": null,
"_key": "!items.effects!UFR67BUOhNGLFyg9.3V4FPoyjJUnFP9WS" "_key": "!items.effects!UFR67BUOhNGLFyg9.3V4FPoyjJUnFP9WS"
} }
], ],

View file

@ -29,39 +29,28 @@
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "range": "melee"
}
}, },
"changes": [ "changes": [
{ {
"key": "system.advantageSources", "key": "system.advantageSources",
"mode": 2, "type": "add",
"value": "In an area with low light or heavy shadow: hide, investigate, or perceive", "value": "Rolls to hide, investigate, or perceive details in low light",
"priority": null "priority": null,
}, "phase": "initial"
{
"key": "system.advantageSources",
"mode": 2,
"value": "",
"priority": null
},
{
"key": "",
"mode": 2,
"value": "",
"priority": null
} }
], ],
"duration": {
"type": ""
}
},
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "value": null,
"combat": null, "units": "seconds",
"seconds": null, "expiry": null,
"rounds": null, "expired": false
"turns": null,
"startRound": null,
"startTurn": null
}, },
"description": "", "description": "<p>When youre in an area with low light or heavy shadow, you have advantage on rolls to hide, investigate, or perceive details within that area.</p>",
"origin": null, "origin": null,
"tint": "#ffffff", "tint": "#ffffff",
"transfer": true, "transfer": true,
@ -71,6 +60,16 @@
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"start": {
"time": 0,
"combat": null,
"combatant": null,
"initiative": null,
"round": null,
"turn": null
},
"showIcon": 1,
"folder": null,
"_key": "!items.effects!aMla3xQuCHEwORGD.pCp32u7UwqxCI4WW" "_key": "!items.effects!aMla3xQuCHEwORGD.pCp32u7UwqxCI4WW"
} }
], ],

View file

@ -132,27 +132,29 @@
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "range": "melee"
}
}, },
"changes": [ "changes": [
{ {
"key": "system.advantageSources", "key": "system.advantageSources",
"mode": 2, "type": "add",
"value": "1", "value": "On Attacks",
"priority": null "priority": null,
"phase": "initial"
} }
], ],
"duration": {
"type": "temporary",
"description": "<p>Until you or an ally rolls a failure with Fear.</p>"
}
},
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "value": null,
"combat": null, "units": "seconds",
"seconds": null, "expiry": null,
"rounds": null, "expired": false
"turns": null,
"startRound": null,
"startTurn": null
}, },
"description": "", "description": "<p>You gain advantage on attack rolls until you or an ally rolls a failure with Fear.</p>",
"tint": "#ffffff", "tint": "#ffffff",
"statuses": [], "statuses": [],
"sort": 0, "sort": 0,
@ -160,6 +162,16 @@
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"start": {
"time": 0,
"combat": null,
"combatant": null,
"initiative": null,
"round": null,
"turn": null
},
"showIcon": 1,
"folder": null,
"_key": "!items.effects!Ef1JsUG50LIoKx2F.s7ma4TNgAvt0ZgEW" "_key": "!items.effects!Ef1JsUG50LIoKx2F.s7ma4TNgAvt0ZgEW"
} }
], ],

View file

@ -175,6 +175,11 @@
opacity: 0.2; opacity: 0.2;
} }
&.no-horizontal-padding {
padding-left: 0;
padding-right: 0;
}
legend { legend {
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
@ -250,6 +255,11 @@
height: 65px; height: 65px;
background: url(../assets/svg/trait-shield.svg) no-repeat; background: url(../assets/svg/trait-shield.svg) no-repeat;
background-size: 100%; background-size: 100%;
padding-top: 3px;
display: flex;
flex-direction: column;
align-items: center;
row-gap: 3px;
div { div {
filter: drop-shadow(0 0 3px black); filter: drop-shadow(0 0 3px black);
@ -278,6 +288,15 @@
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
&.separated {
border-bottom: 2px solid;
padding-bottom: 8px;
}
.form-group {
padding: 0 0.75rem;
}
.experience-inner-container { .experience-inner-container {
position: relative; position: relative;
display: flex; display: flex;

View file

@ -27,10 +27,11 @@
height: 65px; height: 65px;
background: url(../assets/svg/trait-shield.svg) no-repeat; background: url(../assets/svg/trait-shield.svg) no-repeat;
background-size: 100%; background-size: 100%;
padding-top: 4px; padding-top: 3px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
row-gap: 3px;
span { span {
font-size: var(--font-size-10); font-size: var(--font-size-10);

View file

@ -4,18 +4,26 @@
data-group='{{tabs.experience.group}}' data-group='{{tabs.experience.group}}'
> >
<div class="main-selections-container"> <div class="main-selections-container">
<fieldset class="section-container"> <fieldset class="section-container no-horizontal-padding">
<legend>{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.initialExperiences"}} {{experience.nrSelected}}/{{experience.nrTotal}}</legend> <legend>{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.initialExperiences"}} {{experience.nrSelected}}/{{experience.nrTotal}}</legend>
<div class="experiences-inner-container"> <div class="experiences-inner-container">
{{#each experience.values as |experience id|}} {{#each experience.values as |experience id|}}
<div class="experience-container"> <div class="experience-container {{#unless @last}}separated{{/unless}}">
<div class="form-group">
<label>{{localize "DAGGERHEART.GENERAL.label"}}</label>
<div class="experience-inner-container"> <div class="experience-inner-container">
<input class="experience-description" type="text" name="{{concat "experiences." id ".name" }}" value="{{experience.name}}" placeholder="{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.newExperience"}}" /> <input class="experience-description" type="text" name="{{concat "experiences." id ".name" }}" value="{{experience.name}}" placeholder="{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.newExperience"}}" />
<span class="experience-value">{{numberFormat this.value sign=true}}</span> <span class="experience-value">{{numberFormat this.value sign=true}}</span>
</div> </div>
</div>
<div class="form-group">
<label>{{localize "DAGGERHEART.GENERAL.optionalThing" thing=(localize "DAGGERHEART.GENERAL.description")}}</label>
<div class="form-fields">
<textarea name="{{concat "experiences." id ".description"}}">{{experience.description}}</textarea> <textarea name="{{concat "experiences." id ".description"}}">{{experience.description}}</textarea>
</div> </div>
</div>
</div>
{{/each}} {{/each}}
</div> </div>
</fieldset> </fieldset>

View file

@ -1,3 +1,3 @@
<footer> <footer>
<button data-action="finish">{{localize "Save Settings"}}</button> <button data-action="finish">{{localize "DAGGERHEART.GENERAL.saveSettings"}}</button>
</footer> </footer>

View file

@ -26,7 +26,7 @@
{{formGroup systemFields.duration.fields.type value=source.system.duration.type localize=true }} {{formGroup systemFields.duration.fields.type value=source.system.duration.type localize=true }}
<div class="form-group slim duration-description"> <div class="form-group slim duration-description {{#if (eq source.system.duration.type 'temporary')}}visible{{/if}}">
<div class="form-fields"> <div class="form-fields">
{{formInput systemFields.duration.fields.description value=source.system.duration.description localize=true }} {{formInput systemFields.duration.fields.description value=source.system.duration.description localize=true }}
</div> </div>

View file

@ -5,9 +5,9 @@
<h1 class='item-name'><input type='text' name='name' value='{{source.name}}' /></h1> <h1 class='item-name'><input type='text' name='name' value='{{source.name}}' /></h1>
<div class='item-description'> <div class='item-description'>
{{#if source.system.secondary}} {{#if source.system.secondary}}
<h3>{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}</h3> <h3>{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full"}}</h3>
{{else}} {{else}}
<h3>{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon"}}</h3> <h3>{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon.full"}}</h3>
{{/if}} {{/if}}
<h3> <h3>
{{localize (concat 'DAGGERHEART.CONFIG.Traits.' source.system.attack.roll.trait '.short')}} {{localize (concat 'DAGGERHEART.CONFIG.Traits.' source.system.attack.roll.trait '.short')}}

View file

@ -7,9 +7,9 @@
{{#each category as |grouping index|}} {{#each category as |grouping index|}}
<div class="battlepoint-grouping-container"> <div class="battlepoint-grouping-container">
{{#if grouping.nr}} {{#if grouping.nr}}
<label>{{key}} BP: {{concat (localize grouping.description) ' ' '('grouping.nr 'x)'}}</label> <label>{{key}} {{localize "DAGGERHEART.GENERAL.Battlepoints.short"}} - {{concat (localize grouping.description) ' ' '('grouping.nr 'x)'}}</label>
{{else}} {{else}}
<label class="unselected-grouping">{{key}} BP - {{localize grouping.description}}</label> <label class="unselected-grouping">{{key}} {{localize "DAGGERHEART.GENERAL.Battlepoints.short"}} - {{localize grouping.description}}</label>
{{/if}} {{/if}}
</div> </div>
{{/each}} {{/each}}
@ -26,7 +26,7 @@
{{else}} {{else}}
<input type="checkbox" data-combat-id="{{@root.combatId}}" data-category="{{toggle.categoryKey}}" data-grouping="{{toggle.toggleKey}}" {{checked toggle.checked}} /> <input type="checkbox" data-combat-id="{{@root.combatId}}" data-category="{{toggle.categoryKey}}" data-grouping="{{toggle.toggleKey}}" {{checked toggle.checked}} />
{{/if}} {{/if}}
<label class="unselected-grouping">{{toggle.categoryKey}} BP: {{localize toggle.description}}</label> <label class="unselected-grouping">{{toggle.categoryKey}} {{localize "DAGGERHEART.GENERAL.Battlepoints.short"}}: {{localize toggle.description}}</label>
</div> </div>
{{/each}} {{/each}}
</div> </div>

View file

@ -3,7 +3,7 @@
<h2 class="tooltip-title">{{item.name}}</h2> <h2 class="tooltip-title">{{item.name}}</h2>
<div class="tags"> <div class="tags">
<div class="tag"> <div class="tag">
<span>{{#if item.system.secondary}}{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon"}}{{/if}}</span> <span>{{#if item.system.secondary}}{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon.full"}}{{/if}}</span>
</div> </div>
<div class="tag"> <div class="tag">
{{#with (lookup config.GENERAL.burden item.system.burden) as | burden |}} {{#with (lookup config.GENERAL.burden item.system.burden) as | burden |}}