Compare commits

...

79 commits
main ... 1.9.13

Author SHA1 Message Date
WBHarry
3d98f16ac6 Raised version 2026-05-02 22:58:11 +02:00
WBHarry
98c8e1f498
Fixed so that reseting Uses upon finishing downtime uses the actor's rollData and not just the actor data (#1859) 2026-05-02 15:59:36 -04:00
WBHarry
2e524878b3 Raised version 2026-05-01 23:06:40 +02:00
WBHarry
161c8222dc Corrected a typo in Greater Earth Elemental and Huge Green Ooze 2026-05-01 20:58:56 +02:00
WBHarry
00a1d9766c Fixed SRD DireBat experience value 2026-05-01 17:47:47 +02:00
WBHarry
f7b82b7d7e Corrected contributing link in readme 2026-04-29 22:04:37 +02:00
WBHarry
3d7199e7e5 Corrected Glowing Rings damage 2026-04-27 16:07:55 +02:00
WBHarry
b3ab7ee3a7 Raised version 2026-04-26 11:27:32 +02:00
WBHarry
3157fd450f
[Fix] V13 - Companion Fixes (#1840)
* Fixed companion initial max stress. Cleaned up prepareData flow

* Clamped adversary resources
2026-04-26 11:20:20 +02:00
WBHarry
cfd9950aae Translation fixes 2026-04-25 20:33:12 +02:00
WBHarry
702c9e0b6a Fixed translations. Fixed actions without Effects causing errors in Homebrew ItemFeatures 2026-04-25 18:35:22 +02:00
WBHarry
607ee3b580 Raised version 2026-04-23 17:11:30 +02:00
WBHarry
931b84d16d Fixed so that resource reset on downtime can handle math expressions 2026-04-20 00:07:49 +02:00
WBHarry
2a79468ce1 Corrected use of Foundry's Reset translation 2026-04-15 19:00:21 +02:00
WBHarry
c4d314171b
Corrected SRD (#1797) 2026-04-13 20:46:53 +02:00
WBHarry
24073e4a16 Fixed trait counting in CharacterCreation. Fixed description layout and labels in CharacterCreation. Fixed drag/drop images from Compendium Browser 2026-04-12 13:59:59 +02:00
WBHarry
cc5bfbe27d
Fixed more missing translations (#1793) 2026-04-12 11:38:37 +02:00
WBHarry
f66088971d Improved beastform translation structure 2026-04-12 11:33:49 +02:00
WBHarry
882143c1bb Corrected updateActorsRangeDependentEffects when token is null 2026-04-12 11:22:25 +02:00
WBHarry
baa72ff461 Added saefety to updateActorsRangeDepenedentEffects 2026-04-12 11:06:44 +02:00
WBHarry
cf28e011f2 Raised version 2026-04-12 00:29:04 +02:00
WBHarry
623f62e4b9 Merge branch 'V13' of https://github.com/Foundryborne/daggerheart into V13 2026-04-11 23:13:54 +02:00
WBHarry
40109dbbe4 Fixed system.json 2026-04-11 23:13:21 +02:00
WBHarry
d12220c64f
Fixes (#1790)
* Fixes

* .
2026-04-11 22:55:41 +02:00
WBHarry
f4282429cd Fixed H4 elements in editors being hard to see in light mode 2026-04-11 22:51:46 +02:00
WBHarry
1f02795b5d Fixed Battlepoints menu being hard to see in light-mode 2026-04-11 22:46:56 +02:00
WBHarry
d7b37f8178 Fixed faulty deploy script 2026-04-03 20:17:20 +02:00
WBHarry
f8df53ed83 Updated github deploy manifest to be the latest on the V13 branch 2026-04-03 00:10:32 +02:00
WBHarry
8ee5db2832 Fixed our templates taking custom scene distance into account 2026-04-02 23:38:18 +02:00
WBHarry
bbc521ece0 Labrys axe, rain of blades fixes. Enriched Description improvement on armor and weapon 2026-04-02 22:30:49 +02:00
WBHarry
be8d7f6469 Fixed so that tokens with vision range set to Infinity doesn't make summon actions error out 2026-04-02 17:07:52 +02:00
WBHarry
3a4b66f487 Merge branch 'main' into release 2026-03-27 08:27:10 +01:00
WBHarry
cdf159b4a7 Merge branch 'main' into release 2026-03-23 01:13:44 +01:00
WBHarry
413a37483c Merge branch 'main' into release 2026-03-17 22:45:41 +01:00
WBHarry
c5e21d9d92 Merge branch 'main' into release 2026-03-16 01:32:48 +01:00
WBHarry
10c0b6b51e Merge branch 'main' into release 2026-03-15 11:44:45 +01:00
WBHarry
652a554c9a Merge branch 'main' into release 2026-03-13 01:29:02 +01:00
WBHarry
c0ed5fe697 Merge branch 'main' into release 2026-03-13 00:19:34 +01:00
WBHarry
ff65abe09b Merge branch 'main' into release 2026-03-07 01:33:55 +01:00
WBHarry
ec7a7b378d Merge branch 'main' into release 2026-02-26 12:47:44 +01:00
WBHarry
8e34356905 Merge branch 'main' into release 2026-02-12 22:30:17 +01:00
WBHarry
35bceac520 Merge branch 'main' into release 2026-02-09 12:43:51 +01:00
WBHarry
436acb0617 Merge branch 'main' into release 2026-02-04 00:24:56 +01:00
WBHarry
1d114633f5 Merge branch 'main' into release 2026-02-02 02:07:29 +01:00
WBHarry
1c70b46639 Merge branch 'main' into release 2026-02-01 01:20:57 +01:00
WBHarry
ae38245877 Merge branch 'main' into release 2026-01-28 12:57:18 +01:00
WBHarry
af5d3d4568 Merge branch 'main' into release 2026-01-25 17:07:47 +01:00
WBHarry
6b5c1ff965 Merge branch 'main' into release 2026-01-25 16:22:39 +01:00
WBHarry
42a22a49f0 Merge branch 'main' into release 2026-01-23 11:52:22 +01:00
WBHarry
da77c2a190 Merge branch 'main' into release 2026-01-17 01:42:52 +01:00
WBHarry
68decf0b57 Merge branch 'main' into release 2026-01-16 21:48:15 +01:00
WBHarry
4f0670cc35 Merge branch 'main' into release 2026-01-16 10:16:12 +01:00
WBHarry
b346ce6766 Merge branch 'main' into release 2026-01-16 10:06:17 +01:00
WBHarry
dddd0581f7 Merge branch 'main' into release 2026-01-15 10:16:38 +01:00
WBHarry
83329fac46 Merge branch 'main' into release 2026-01-10 00:23:09 +01:00
WBHarry
ee0b7b2792 Merge branch 'main' into release 2026-01-09 17:49:14 +01:00
WBHarry
4d062a6892 Merge branch 'main' into release 2025-12-31 04:52:34 +01:00
WBHarry
487c1fd9a2 Merge branch 'main' into release 2025-12-29 14:02:53 +01:00
WBHarry
3aa5cd806a Merge branch 'main' into release 2025-12-27 18:17:36 +01:00
WBHarry
2e93b79633 Merge branch 'main' into release 2025-12-24 03:06:02 +01:00
WBHarry
244dbd4902 Merge branch 'main' into release 2025-12-24 01:18:51 +01:00
WBHarry
c7aed6825a Merge branch 'main' into release 2025-12-13 23:06:23 +01:00
WBHarry
9cb5112b62 Merge branch 'main' into release 2025-12-08 02:35:06 +01:00
WBHarry
81b6f7fc51 Merge branch 'main' into release 2025-12-07 00:54:06 +01:00
WBHarry
828fffd552 Merge branch 'main' into release 2025-11-26 09:47:07 +01:00
WBHarry
fc5626ac47 Merge branch 'main' into release 2025-11-25 00:52:11 +01:00
WBHarry
2e62545aa7 Merge branch 'main' into release 2025-11-23 15:41:24 +01:00
WBHarry
b09c712dd5 Merging main 2025-11-20 11:48:58 +01:00
WBHarry
ca4336bd39 Merge branch 'main' into release 2025-11-17 16:55:14 +01:00
WBHarry
77ac11c522 Merge branch 'main' into release 2025-11-17 10:17:50 +01:00
WBHarry
50311679a5 Merge branch 'main' into release 2025-11-11 22:15:30 +01:00
WBHarry
3a7bcd1b0a Merge branch 'main' into release 2025-11-11 18:04:23 +01:00
WBHarry
511e4bd644 Merge branch 'main' into release 2025-11-11 16:23:35 +01:00
WBHarry
395820513b Merge branch 'main' into release 2025-11-11 16:06:03 +01:00
WBHarry
3566ea3fd3 Merge branch 'main' into release 2025-08-26 20:32:04 +02:00
WBHarry
29d502fb97 Merge branch 'main' into release 2025-08-24 21:11:38 +02:00
WBHarry
685a25d25a Merge branch 'main' into release 2025-08-22 01:47:03 +02:00
WBHarry
dd045b3df7 Merge branch 'main' into release 2025-08-19 20:58:05 +02:00
WBHarry
0aabcec340 Raised version 2025-08-19 18:56:30 +02:00
70 changed files with 295 additions and 233 deletions

View file

@ -35,7 +35,7 @@ jobs:
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://github.com/${{github.repository}}
manifest: https://github.com/${{github.repository}}/releases/latest/download/system.json
manifest: https://raw.githubusercontent.com/${{github.repository}}/V13/system.json
download: https://github.com/${{github.repository}}/releases/download/${{github.event.release.tag_name}}/system.zip
# Create a zip file with all files required by the module to add to the release

View file

@ -64,7 +64,7 @@ You can find the documentation here: https://github.com/Foundryborne/daggerheart
## Contributing
Looking to contribute to the project? Look no further, check out our [contributing guide](contributing.md), and keep the [Code of Conduct](coc.md) in mind when working on things.
Looking to contribute to the project? Look no further, check out our [contributing guide](CONTRIBUTING.md), and keep the [Code of Conduct](coc.md) in mind when working on things.
## Disclaimer:

View file

@ -405,6 +405,8 @@ Hooks.on('chatMessage', (_, message) => {
});
const updateActorsRangeDependentEffects = async token => {
if (!token) return;
const rangeMeasurement = game.settings.get(
CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.variantRules

View file

@ -71,9 +71,7 @@
"name": "Summon",
"tooltip": "Create tokens in the 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.",
"chatMessageTitle": "Test2",
"chatMessageHeaderTitle": "Summoning"
"invalidDrop": "You can only drop Actor entities to summon."
},
"transform": {
"name": "Transform",
@ -87,9 +85,7 @@
},
"Config": {
"beastform": {
"exact": "Beastform Max Tier",
"exactHint": "The Character's Tier is used if empty",
"label": "Beastform"
"exact": { "label": "Beastform Max Tier", "hint": "The Character's Tier is used if empty" }
},
"countdown": {
"defaultOwnership": "Default Ownership",
@ -198,7 +194,10 @@
"type": { "label": "Type" }
},
"hordeDamage": "Horde Damage",
"horderHp": "Horde/HP"
"horderHp": "Horde/HP",
"adversaryReactionRoll": {
"headerTitle": "Adversary Reaction Roll"
}
},
"Character": {
"advantageSources": {
@ -440,6 +439,10 @@
"defaultOwnershipTooltip": "The default player ownership of countdowns",
"hideNewCountdowns": "Hide New Countdowns"
},
"CreateItemDialog": {
"createItem": "Create Item",
"browseCompendium": "Browse Compendium"
},
"DaggerheartMenu": {
"title": "GM Tools",
"refreshFeatures": "Refresh Features"
@ -653,6 +656,12 @@
"noPlayers": "No players to assign ownership to",
"default": "Default Ownership"
},
"PendingReactionsDialog": {
"title": "Pending Reaction Rolls Found",
"unfinishedRolls": "Some Tokens still need to roll their Reaction Roll.",
"confirmation": "Are you sure you want to continue ?",
"warning": "Undone reaction rolls will be considered as failed"
},
"ReactionRoll": {
"title": "Reaction Roll: {trait}"
},
@ -684,7 +693,13 @@
"damageNotRolled": "Damage not rolled in chat message yet",
"insufficientHope": "The initiating character doesn't have enough hope",
"createTagTeam": "Create TagTeam Roll",
"chatMessageRollTitle": "Roll"
"chatMessageRollTitle": "Roll",
"cancelConfirmTitle": "Cancel Tag Team Roll",
"cancelConfirmText": "Are you sure you want to cancel the Tag Team Roll? This will close it for all other players too.",
"hints": {
"completeRolls": "Set up and complete the rolls for the characters",
"selectRoll": "Select which roll value to be used for the Tag Team"
}
},
"TokenConfig": {
"actorSizeUsed": "Actor size is set, determining the dimensions"
@ -697,6 +712,11 @@
}
},
"CONFIG": {
"ActionAutomationChoices": {
"never": "Never",
"showDialog": "Show Dialog Only",
"always": "Always"
},
"AdversaryTrait": {
"relentless": {
"name": "Relentless",
@ -1215,6 +1235,11 @@
"on": "On",
"onWithToggle": "On With Toggle"
},
"SceneRangeMeasurementTypes": {
"disable": "Disable Daggerheart Range Measurement",
"default": "Default",
"custom": "Custom"
},
"SelectAction": {
"selectType": "Select Action Type",
"selectAction": "Action Selection"
@ -1894,6 +1919,10 @@
"hint": "Multiply any damage dealt to you by this number"
}
},
"Battlepoints": {
"full": "Battlepoints",
"short": "BP"
},
"Bonuses": {
"rest": {
"downtimeAction": "Downtime Action",
@ -2305,8 +2334,10 @@
"multiclass": "Multiclass",
"newCategory": "New Category",
"newThing": "New {thing}",
"next": "Next",
"none": "None",
"noTarget": "No current target",
"optionalThing": "Optional {thing}",
"partner": "Partner",
"player": {
"single": "Player",
@ -2329,9 +2360,11 @@
"rollDamage": "Roll Damage",
"rollWith": "{roll} Roll",
"save": "Save",
"saveSettings": "Save Settings",
"scalable": "Scalable",
"scars": "Scars",
"situationalBonus": "Situational Bonus",
"searchPlaceholder": "Search...",
"spent": "Spent",
"step": "Step",
"stress": "Stress",
@ -2482,8 +2515,14 @@
},
"Weapon": {
"weaponType": "Weapon Type",
"primaryWeapon": "Primary Weapon",
"secondaryWeapon": "Secondary Weapon"
"primaryWeapon": {
"full": "Primary Weapon",
"short": "Primary"
},
"secondaryWeapon": {
"full": "Secondary Weapon",
"short": "Secondary"
}
}
},
"MACROS": {
@ -2915,6 +2954,9 @@
"resourceRoll": {
"playerMessage": "{user} rerolled their {name}"
},
"saveRoll": {
"reactionRollAllTargets": "Reaction Roll All Targets"
},
"tagTeam": {
"title": "Tag Team",
"membersTitle": "Members"
@ -2941,9 +2983,9 @@
},
"ItemBrowser": {
"title": "Daggerheart Compendium Browser",
"windowTitle": "Compendium Browser",
"hint": "Select a Folder in sidebar to start browsing through the compendium",
"browserSettings": "Browser Settings",
"searchPlaceholder": "Search...",
"columnName": "Name",
"tooltipFilters": "Filters",
"tooltipErase": "Erase",
@ -2979,7 +3021,7 @@
"weapons": "Weapons",
"armors": "Armors",
"consumables": "Consumables",
"loots": "Loots"
"loots": "Loot"
}
},
"Notifications": {
@ -3070,6 +3112,7 @@
"companion": "Level {level} - {partner}",
"companionNoPartner": "No Partner",
"duplicateToNewTier": "Duplicate to New Tier",
"createAdversary": "Create Adversary",
"pickTierTitle": "Pick a new tier for this adversary"
},
"daggerheartMenu": {

View file

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

View file

@ -259,8 +259,9 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
const resetValue = increasing
? 0
: feature.system.resource.max
? Roll.replaceFormulaData(feature.system.resource.max, this.actor)
? new Roll(Roll.replaceFormulaData(feature.system.resource.max, this.actor.getRollData())).evaluateSync().total
: 0;
await feature.update({ 'system.resource.value': resetValue });
}

View file

@ -118,8 +118,13 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App
break;
case 'footer':
partContext.buttons = [
{ type: 'button', action: 'reset', icon: 'fa-solid fa-arrow-rotate-left', label: 'Reset' },
{ type: 'submit', icon: 'fa-solid fa-floppy-disk', label: 'Save Changes' }
{
type: 'button',
action: 'reset',
icon: 'fa-solid fa-arrow-rotate-left',
label: game.i18n.localize('Reset')
},
{ type: 'submit', icon: 'fa-solid fa-floppy-disk', label: game.i18n.localize('EDITOR.Save') }
];
break;
}

View file

@ -188,8 +188,9 @@ export default class SettingFeatureConfig extends HandlebarsApplicationMixin(App
if (type === 'effect') {
const move = foundry.utils.getProperty(this.settings, this.movePath);
for (const action of move.actions) {
const remainingEffects = action.effects.filter(x => x._id !== id);
if (action.effects.length !== remainingEffects.length) {
const actionEffects = action.effects ?? [];
const remainingEffects = actionEffects.filter(x => x._id !== id);
if (actionEffects.length !== remainingEffects.length) {
await action.update({
effects: remainingEffects.map(x => {
const { _id, ...rest } = x;

View file

@ -217,8 +217,8 @@ export default class AdversarySheet extends DHBaseActorSheet {
static #reactionRoll(event) {
const config = {
event,
title: `Reaction Roll: ${this.actor.name}`,
headerTitle: 'Adversary Reaction Roll',
title: game.i18n.localize('DAGGERHEART.GENERAL.reactionRoll'),
headerTitle: game.i18n.localize('DAGGERHEART.ACTORS.Adversary.adversaryReactionRoll.headerTitle'),
roll: {
type: 'trait'
},

View file

@ -229,7 +229,7 @@ export default class Party extends DHBaseActorSheet {
title: game.i18n.localize(`DAGGERHEART.APPLICATIONS.Downtime.${button.dataset.type}.title`),
icon: button.dataset.type === 'shortRest' ? 'fa-solid fa-utensils' : 'fa-solid fa-bed'
},
content: 'This will trigger a dialog to players make their downtime moves, are you sure?',
content: game.i18n.localize('DAGGERHEART.ACTORS.Party.triggerRestContent'),
classes: ['daggerheart', 'dialog', 'dh-style']
});

View file

@ -652,12 +652,12 @@ export default function DHApplicationMixin(Base) {
buttons: [
{
action: 'create',
label: 'Create Item',
label: game.i18n.localize('DAGGERHEART.APPLICATIONS.CreateItemDialog.createItem'),
icon: 'fa-solid fa-plus'
},
{
action: 'browse',
label: 'Browse Compendium',
label: game.i18n.localize('DAGGERHEART.APPLICATIONS.CreateItemDialog.browseCompendium'),
icon: 'fa-solid fa-book'
}
]

View file

@ -76,7 +76,7 @@ export default class DhActorDirectory extends foundry.applications.sidebar.tabs.
window: { title: 'DAGGERHEART.UI.Sidebar.actorDirectory.pickTierTitle' },
content,
ok: {
label: 'Create Adversary',
label: 'DAGGERHEART.UI.Sidebar.actorDirectory.createAdversary',
callback: (event, button, dialog) => Number(button.form.elements.tier.value)
}
});

View file

@ -22,7 +22,7 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV
tag: 'div',
window: {
frame: true,
title: 'Fear',
title: 'DAGGERHEART.GENERAL.fear',
positioned: true,
resizable: true,
minimizable: false

View file

@ -37,7 +37,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
tag: 'div',
window: {
frame: true,
title: 'Compendium Browser',
title: 'DAGGERHEART.UI.ItemBrowser.windowTitle',
icon: 'fa-solid fa-book-atlas',
positioned: true,
resizable: true
@ -207,8 +207,23 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
label: game.i18n.localize(col.label)
}));
const splitPath = folderId?.split('.') ?? [];
const { pathLabels } = splitPath.reduce(
(acc, curr) => {
acc.currentPath = !acc.currentPath ? curr : [acc.currentPath, curr].join('.');
if (curr === 'folder') return acc;
const label = foundry.utils.getProperty(this.config, acc.currentPath)?.label;
if (label) acc.pathLabels.push(game.i18n.localize(label));
return acc;
},
{ pathLabels: [], currentPath: '' }
);
this.selectedMenu = {
path: folderId?.split('.') ?? [],
path: splitPath,
pathLabels: pathLabels,
data: {
...folderData,
columns: columns
@ -568,7 +583,9 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
const { itemUuid } = event.target.closest('[data-item-uuid]').dataset,
item = await foundry.utils.fromUuid(itemUuid),
dragData = item.toDragData();
event.dataTransfer.setData('text/plain', JSON.stringify(dragData));
event.dataTransfer.setDragImage(event.target.querySelector('img'), 0, 0);
}
_canDragStart() {

View file

@ -188,7 +188,7 @@ export default class FilterMenu extends foundry.applications.ux.ContextMenu {
}));
const damageTypeFilter = Object.values(CONFIG.DH.GENERAL.damageTypes).map(({ id, abbreviation }) => ({
group: 'Damage Type', //TODO localize
group: game.i18n.localize('DAGGERHEART.GENERAL.damageType'),
name: game.i18n.localize(abbreviation),
filter: {
field: 'system.damage.type',

View file

@ -18,7 +18,7 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur
static getRangeLabels(distanceValue, settings) {
let result = { distance: distanceValue, units: '' };
if (!settings.enabled) return result;
if (!settings.enabled || !canvas.scene) return result;
const sceneRangeMeasurement = canvas.scene.flags.daggerheart?.rangeMeasurement;
const { disable, custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting;

View file

@ -943,14 +943,14 @@ export const countdownAppMode = {
export const sceneRangeMeasurementSetting = {
disable: {
id: 'disable',
label: 'Disable Daggerheart Range Measurement'
label: 'DAGGERHEART.CONFIG.SceneRangeMeasurementTypes.disable'
},
default: {
id: 'default',
label: 'Default'
label: 'DAGGERHEART.CONFIG.SceneRangeMeasurementTypes.default'
},
custom: {
id: 'custom',
label: 'Custom'
label: 'DAGGERHEART.CONFIG.SceneRangeMeasurementTypes.custom'
}
};

View file

@ -7,7 +7,12 @@ export const typeConfig = {
},
{
key: 'system.type',
label: 'DAGGERHEART.GENERAL.type'
label: 'DAGGERHEART.GENERAL.type',
format: type => {
if (!type) return '-';
return CONFIG.DH.ACTOR.allAdversaryTypes()[type].label;
}
}
],
filters: [
@ -69,12 +74,13 @@ export const typeConfig = {
columns: [
{
key: 'type',
label: 'DAGGERHEART.GENERAL.type'
label: 'DAGGERHEART.GENERAL.type',
format: type => type ? `TYPES.Item.${type}` : '-'
},
{
key: 'system.secondary',
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',
@ -94,8 +100,8 @@ export const typeConfig = {
key: 'system.secondary',
label: 'DAGGERHEART.UI.ItemBrowser.subtype',
choices: [
{ value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon' },
{ value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon' }
{ value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon.full' },
{ value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full' }
]
},
{
@ -166,8 +172,8 @@ export const typeConfig = {
key: 'system.secondary',
label: 'DAGGERHEART.UI.ItemBrowser.subtype',
choices: [
{ value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon' },
{ value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon' }
{ value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon.short' },
{ value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon.short' }
]
},
{
@ -253,11 +259,13 @@ export const typeConfig = {
columns: [
{
key: 'system.type',
label: 'DAGGERHEART.GENERAL.type'
label: 'DAGGERHEART.GENERAL.type',
format: type => type ? `DAGGERHEART.CONFIG.DomainCardTypes.${type}` : '-'
},
{
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',
@ -318,7 +326,14 @@ export const typeConfig = {
},
{
key: 'system.domains',
label: 'DAGGERHEART.GENERAL.Domain.plural'
label: 'DAGGERHEART.GENERAL.Domain.plural',
format: domains => {
const config = CONFIG.DH.DOMAIN.allDomains();
return domains
.map(x => (x ? game.i18n.localize(config[x].label) : null))
.filter(x => x)
.join(', ');
}
}
],
filters: [
@ -362,18 +377,19 @@ export const typeConfig = {
columns: [
{
key: 'system.linkedClass',
label: 'Class',
label: 'TYPES.Item.class',
format: linkedClass => linkedClass?.name ?? 'DAGGERHEART.UI.ItemBrowser.missing'
},
{
key: 'system.spellcastingTrait',
label: 'DAGGERHEART.ITEMS.Subclass.spellcastingTrait'
label: 'DAGGERHEART.ITEMS.Subclass.spellcastingTrait',
format: trait => (trait ? `DAGGERHEART.CONFIG.Traits.${trait}.name` : '-')
}
],
filters: [
{
key: 'system.linkedClass.uuid',
label: 'Class',
label: 'TYPES.Item.class',
choices: items => {
const list = items
.filter(item => item.system.linkedClass)
@ -397,7 +413,8 @@ export const typeConfig = {
},
{
key: 'system.mainTrait',
label: 'DAGGERHEART.GENERAL.Trait.single'
label: 'DAGGERHEART.GENERAL.Trait.single',
format: trait => (trait ? `DAGGERHEART.CONFIG.Traits.${trait}.name` : '-')
}
],
filters: [

View file

@ -453,7 +453,7 @@ export const allArmorFeatures = () => {
const feature = homebrewFeatures[key];
const actions = feature.actions.map(action => ({
...action,
effects: action.effects.map(effect => feature.effects.find(x => x.id === effect._id)),
effects: action.effects?.map(effect => feature.effects.find(x => x.id === effect._id))??[],
type: action.type
}));
const actionEffects = actions.flatMap(a => a.effects);
@ -1389,7 +1389,7 @@ export const allWeaponFeatures = () => {
const actions = feature.actions.map(action => ({
...action,
effects: action.effects.map(effect => feature.effects.find(x => x.id === effect._id)),
effects: action.effects?.map(effect => feature.effects.find(x => x.id === effect._id))??[],
type: action.type
}));
const actionEffects = actions.flatMap(a => a.effects);

View file

@ -57,16 +57,10 @@ const companionBaseResources = Object.freeze({
stress: {
id: 'stress',
initial: 0,
max: 0,
max: 3,
reverse: true,
label: 'DAGGERHEART.GENERAL.stress'
},
hope: {
id: 'hope',
initial: 0,
reverse: false,
label: 'DAGGERHEART.GENERAL.hope'
}
});
export const character = {

View file

@ -46,18 +46,14 @@ export const gameSettings = {
export const actionAutomationChoices = {
never: {
id: 'never',
label: 'Never'
label: 'DAGGERHEART.CONFIG.ActionAutomationChoices.never'
},
showDialog: {
id: 'showDialog',
label: 'Show Dialog only'
label: 'DAGGERHEART.CONFIG.ActionAutomationChoices.showDialog'
},
// npcOnly: {
// id: "npcOnly",
// label: "Always for non-characters"
// },
always: {
id: 'always',
label: 'Always'
label: 'DAGGERHEART.CONFIG.ActionAutomationChoices.always'
}
};

View file

@ -189,6 +189,9 @@ export default class DhpAdversary extends DhCreature {
prepareDerivedData() {
super.prepareDerivedData();
this.attack.roll.isStandardAttack = true;
// Clamp resources (must be done last to ensure all updates occur)
this.resources.clamp();
}
_getTags() {

View file

@ -660,6 +660,8 @@ export default class DhCharacter extends DhCreature {
prepareDerivedData() {
super.prepareDerivedData();
this.resources.hope.max -= this.scars;
if (this.companion) {
for (let levelKey in this.companion.system.levelData.levelups) {
const level = this.companion.system.levelData.levelups[levelKey];
@ -673,7 +675,6 @@ export default class DhCharacter extends DhCreature {
}
}
this.resources.hope.max -= this.scars;
this.attack.roll.trait = this.rules.attack.roll.trait ?? this.attack.roll.trait;
this.resources.armor = {
@ -684,6 +685,9 @@ export default class DhCharacter extends DhCreature {
};
this.attack.damage.parts[0].value.custom.formula = `@prof${this.basicAttackDamageDice}${this.rules.attack.damage.bonus ? ` + ${this.rules.attack.damage.bonus}` : ''}`;
// Clamp resources (must be done last to ensure all updates occur)
this.resources.clamp();
}
getRollData() {

View file

@ -130,9 +130,6 @@ export default class DhCompanion extends DhCreature {
const level = this.levelData.levelups[levelKey];
for (let selection of level.selections) {
switch (selection.type) {
case 'hope':
this.resources.hope += selection.value;
break;
case 'vicious':
if (selection.data[0] === 'damage') {
this.attack.damage.parts[0].value.dice = adjustDice(this.attack.damage.parts[0].value.dice);
@ -167,6 +164,9 @@ export default class DhCompanion extends DhCreature {
return acc;
}, this.partner.system.companionData.levelupChoices);
}
// Clamp resources (must be done last to ensure all updates occur)
this.resources.clamp();
}
async _preUpdate(changes, options, userId) {

View file

@ -60,14 +60,4 @@ export default class DhCreature extends BaseDataActor {
}
}
}
prepareDerivedData() {
const minLimitResource = resource => {
if (resource) resource.value = Math.min(resource.value, resource.max);
};
minLimitResource(this.resources.stress);
minLimitResource(this.resources.hitPoints);
minLimitResource(this.resources.hope);
}
}

View file

@ -28,7 +28,8 @@ export default class BeastformField extends fields.SchemaField {
{ 1: game.i18n.localize('DAGGERHEART.GENERAL.Tiers.1') }
);
},
hint: 'DAGGERHEART.ACTIONS.Config.beastform.exactHint'
label: 'DAGGERHEART.ACTIONS.Config.beastform.exact.label',
hint: 'DAGGERHEART.ACTIONS.Config.beastform.exact.hint'
})
})
};

View file

@ -295,7 +295,7 @@ export class DHDamageData extends DHResourceData {
required: true
}),
{
label: 'Type'
label: game.i18n.localize('DAGGERHEART.GENERAL.type')
}
)
};

View file

@ -80,6 +80,18 @@ class ResourcesField extends fields.TypedObjectField {
value.isReversed = resources[key].reverse;
value.max = typeof resource.max === 'number' ? (value.max ?? resource.max) : null;
}
Object.defineProperty(data, 'clamp', {
value: function () {
for (const key of Object.keys(this)) {
const resource = this[key];
if (typeof resource?.max === 'number') {
resource.value = Math.clamp(resource.value, 0, resource.max);
}
}
},
enumerable: false
});
return data;
}

View file

@ -28,7 +28,7 @@ export default class DHWeapon extends AttachableItem {
equipped: new fields.BooleanField({ initial: false }),
//SETTINGS
secondary: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon' }),
secondary: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full' }),
burden: new fields.StringField({
required: true,
choices: CONFIG.DH.GENERAL.burden,

View file

@ -197,8 +197,8 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
const pendingingSaves = targets.filter(t => t.saved.success === null);
if (pendingingSaves.length) {
const confirm = await foundry.applications.api.DialogV2.confirm({
window: { title: 'Pending Reaction Rolls found' },
content: `<p>Some Tokens still need to roll their Reaction Roll.</p><p>Are you sure you want to continue ?</p><p><i>Undone reaction rolls will be considered as failed</i></p>`
window: { title: game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.title') },
content: `<p>${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.unfinishedRolls')}</p><p>${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.confirmation')}</p><p><i>${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.warning')}</i></p>`
});
if (!confirm) return;
}

View file

@ -95,7 +95,7 @@ export default class DhTokenManager {
: this.#actor;
const tokenData = await actor.getTokenDocument();
const result = await canvas.scene.createEmbeddedDocuments('Token', [
{ ...tokenData, x: this.#activePreview.document.x, y: this.#activePreview.document.y }
{ ...tokenData.toObject(), x: this.#activePreview.document.x, y: this.#activePreview.document.y }
]);
this.#activePreview = undefined;

View file

@ -65,13 +65,7 @@ export const renderMeasuredTemplate = async event => {
? '180'
: undefined;
let baseDistance = range;
if (Number.isNaN(Number(range))) {
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 distance = getTemplateDistance(range, type);
const { width, height } = game.canvas.scene.dimensions;
const data = {
@ -86,3 +80,23 @@ export const renderMeasuredTemplate = async event => {
CONFIG.ux.TemplateManager.createPreview(data);
};
const getTemplateDistance = (range, type) => {
const rangeNumber = Number(range);
if (!Number.isNaN(rangeNumber)) return rangeNumber;
const { custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting;
const sceneMeasurements = canvas.scene?.flags.daggerheart?.rangeMeasurement;
const globalMeasurements = game.settings.get(
CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.variantRules
).rangeMeasurement;
const settings = sceneMeasurements?.setting === custom.id ? sceneMeasurements : globalMeasurements;
const baseDistance = settings[range];
if (type !== CONFIG.DH.GENERAL.templateTypes.EMANATION) return baseDistance;
const emanationAddDistance = settings.melee / 2;
return baseDistance + emanationAddDistance;
};

View file

@ -40,7 +40,8 @@
"experiences": {
"ti3Z1mq2M92KK4GJ": {
"name": "Bloodthirsty",
"description": ""
"description": "",
"value": 3
}
},
"bonuses": {

View file

@ -251,7 +251,7 @@
"name": "Crushing Blows",
"type": "feature",
"system": {
"description": "<p>When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they cant mark an Armor Slot, they must mark an additional HP.</p>",
"description": "<p>When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they cant mark an Armor Slot, they must mark an additional HP.</p>",
"resource": null,
"actions": {
"0sXciTiPc30v8czv": {

View file

@ -257,7 +257,7 @@
"name": "Acidic Form",
"type": "feature",
"system": {
"description": "<p>When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they cant mark an Armor Slot, they must mark an additional HP.</p>",
"description": "<p>When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they cant mark an Armor Slot, they must mark an additional HP.</p>",
"resource": null,
"actions": {
"gtT2oHSyZg9OHHJD": {

View file

@ -80,7 +80,7 @@
{
"key": "system.disadvantageSources",
"mode": 2,
"value": "Retract",
"value": "Action Rolls",
"priority": null
}
],

View file

@ -35,19 +35,7 @@
{
"key": "system.advantageSources",
"mode": 2,
"value": "In an area with low light or heavy shadow: hide, investigate, or perceive",
"priority": null
},
{
"key": "system.advantageSources",
"mode": 2,
"value": "",
"priority": null
},
{
"key": "",
"mode": 2,
"value": "",
"value": "Rolls to hide, investigate, or perceive details in low light",
"priority": null
}
],
@ -61,7 +49,7 @@
"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,
"tint": "#ffffff",
"transfer": true,

View file

@ -138,7 +138,7 @@
{
"key": "system.advantageSources",
"mode": 2,
"value": "1",
"value": "Attack Rolls",
"priority": null
}
],
@ -152,7 +152,7 @@
"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",
"statuses": [],
"sort": 0,

View file

@ -36,7 +36,8 @@
"resultBased": false,
"value": {
"custom": {
"enabled": false
"enabled": false,
"formula": ""
},
"multiplier": "prof",
"dice": "d8",
@ -44,7 +45,9 @@
"flatMultiplier": 1
},
"applyTo": "hitPoints",
"type": [],
"type": [
"magical"
],
"base": false,
"valueAlt": {
"multiplier": "prof",
@ -52,7 +55,8 @@
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false
"enabled": false,
"formula": ""
}
}
}
@ -87,57 +91,6 @@
"name": "Cast",
"img": "icons/skills/melee/spear-tips-three-green.webp",
"range": "veryClose"
},
"CUKoYyDxQhNc0pLs": {
"type": "damage",
"_id": "CUKoYyDxQhNc0pLs",
"systemPath": "actions",
"description": "<p>If a target you hit is <em>Vulnerable</em>, they take an extra <strong>1d8</strong> damage.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"damage": {
"parts": [
{
"value": {
"custom": {
"enabled": false
},
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d8",
"bonus": null
},
"applyTo": "hitPoints",
"type": [],
"base": false,
"resultBased": false,
"valueAlt": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false
}
}
}
],
"includeBase": false
},
"target": {
"type": "any",
"amount": null
},
"effects": [],
"name": "Damage Against Vulnerable",
"img": "icons/skills/melee/spear-tips-three-purple.webp",
"range": ""
}
},
"attribution": {

View file

@ -45,7 +45,7 @@
{
"value": {
"dice": "d10",
"bonus": 1,
"bonus": 2,
"multiplier": "prof",
"flatMultiplier": 1,
"custom": {

View file

@ -5,22 +5,14 @@
"_id": "ijWppQzSOqVCb3rE",
"img": "icons/weapons/axes/axe-battle-jagged.webp",
"system": {
"description": "",
"description": "<strong>Protective</strong>: +1 to Armor Score",
"actions": {},
"attached": [],
"tier": 3,
"equipped": false,
"secondary": false,
"burden": "twoHanded",
"weaponFeatures": [
{
"value": "protective",
"effectIds": [
"qTxADRsQnKiYfOiQ"
],
"actionIds": []
}
],
"weaponFeatures": [],
"attack": {
"name": "Attack",
"img": "icons/skills/melee/blood-slash-foam-red.webp",
@ -111,13 +103,13 @@
"effects": [
{
"name": "Protective",
"description": "Add your character's Tier to your Armor Score",
"img": "icons/skills/melee/shield-block-gray-orange.webp",
"description": "+1 to Armor Score",
"img": "icons/magic/defensive/shield-barrier-deflect-teal.webp",
"changes": [
{
"key": "system.armorScore",
"mode": 2,
"value": "ITEM.@system.tier"
"value": "1"
}
],
"_id": "qTxADRsQnKiYfOiQ",

View file

@ -175,6 +175,11 @@
opacity: 0.2;
}
&.no-horizontal-padding {
padding-left: 0;
padding-right: 0;
}
legend {
margin-left: auto;
margin-right: auto;
@ -274,6 +279,15 @@
flex-direction: column;
gap: 5px;
&.separated {
border-bottom: 2px solid;
padding-bottom: 8px;
}
.form-group {
padding: 0 0.75rem;
}
.experience-inner-container {
position: relative;
display: flex;

View file

@ -24,7 +24,7 @@
}
h4 {
font-size: var(--font-size-16);
color: @beige;
color: light-dark(@dark, @beige);
font-weight: 600;
}

View file

@ -10,6 +10,7 @@
.encounter-battlepoints {
display: flex;
cursor: help;
color: light-dark(@dark, @beige);
}
.inner-controls {

View file

@ -2,12 +2,15 @@
"id": "daggerheart",
"title": "Daggerheart",
"description": "An unofficial implementation of the Daggerheart system",
"version": "1.9.6",
"version": "1.9.13",
"compatibility": {
"minimum": "13.346",
"verified": "13.351",
"maximum": "13"
},
"url": "https://github.com/Foundryborne/daggerheart",
"manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/V13/system.json",
"download": "https://github.com/Foundryborne/daggerheart/releases/download/1.9.13/system.zip",
"authors": [
{
"name": "WBHarry"
@ -296,8 +299,5 @@
},
"background": "systems/daggerheart/assets/logos/FoundrybornBackgroundLogo.png",
"primaryTokenAttribute": "resources.hitPoints",
"secondaryTokenAttribute": "resources.stress",
"url": "https://your/hosted/system/repo/",
"manifest": "https://your/hosted/system/repo/system.json",
"download": "https://your/packaged/download/archive.zip"
"secondaryTokenAttribute": "resources.stress"
}

View file

@ -1,4 +1,4 @@
<fieldset>
<legend>{{localize "DAGGERHEART.ACTIONS.Config.beastform.label"}}</legend>
<legend>{{localize "DAGGERHEART.ACTIONS.TYPES.beastform.name"}}</legend>
{{formGroup fields.tierAccess.fields.exact value=source.tierAccess.exact name="beastform.tierAccess.exact" labelAttr="label" valueAttr="key" localize=true blank=""}}
</fieldset>

View file

@ -3,6 +3,6 @@
{{#if isLastTab}}
<button data-action="finish">{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.finishCreation"}}</button>
{{else}}
<button data-action="setupGoNext" {{disabled nextDisabled}}>{{localize "Next"}}</button>
<button data-action="setupGoNext" {{disabled nextDisabled}}>{{localize "DAGGERHEART.GENERAL.next"}}</button>
{{/if}}
</section>

View file

@ -4,17 +4,25 @@
data-group='{{tabs.experience.group}}'
>
<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>
<div class="experiences-inner-container">
{{#each experience.values as |experience id|}}
<div class="experience-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"}}" />
<span class="experience-value">{{numberFormat this.value sign=true}}</span>
<div class="experience-container {{#unless @last}}separated{{/unless}}">
<div class="form-group">
<label>{{localize "DAGGERHEART.GENERAL.label"}}</label>
<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"}}" />
<span class="experience-value">{{numberFormat this.value sign=true}}</span>
</div>
</div>
<textarea name="{{concat "experiences." id ".description"}}">{{experience.description}}</textarea>
<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>
</div>
</div>
</div>
{{/each}}
</div>

View file

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

View file

@ -35,7 +35,7 @@
</span>
</div>
<div class="form-group">
<input type="text" value="{{extraFormula}}" name="roll.{{ @index }}.extraFormula" placeholder="Situational Bonus">
<input type="text" value="{{extraFormula}}" name="roll.{{ @index }}.extraFormula" placeholder="{{localize "DAGGERHEART.GENERAL.situationalBonus"}}">
</div>
{{/each}}
{{#unless (empty @root.modifiers)}}

View file

@ -175,7 +175,7 @@
</select>
{{/if}}
{{#if (eq @root.rollType 'DualityRoll')}}<span class="formula-label">{{localize "DAGGERHEART.GENERAL.situationalBonus"}}</span>{{/if}}
<input type="text" value="{{extraFormula}}" name="extraFormula" placeholder="{{#if (eq @root.rollType 'DualityRoll')}}Ex: 1d6 + 5{{else}}Situational Bonus{{/if}}">
<input type="text" value="{{extraFormula}}" name="extraFormula" placeholder="{{#if (eq @root.rollType 'DualityRoll')}}Ex: 1d6 + 5{{else}}{{localize "DAGGERHEART.GENERAL.situationalBonus"}}{{/if}}">
</fieldset>
{{/if}}
{{/unless}}

View file

@ -5,6 +5,6 @@
</button>
<button data-action="save" >
<i class="fa-solid fa-floppy-disk"></i>
<span>{{localize "Save Changes"}}</span>
<span>{{localize "EDITOR.Save"}}</span>
</button>
</footer>

View file

@ -5,6 +5,6 @@
</button>
<button type="button" data-action="save" >
<i class="fa-solid fa-floppy-disk"></i>
<span>{{localize "Save Changes"}}</span>
<span>{{localize "EDITOR.Save"}}</span>
</button>
</footer>

View file

@ -5,6 +5,6 @@
</button>
<button data-action="save" >
<i class="fa-solid fa-floppy-disk"></i>
<span>{{localize "Save Changes"}}</span>
<span>{{localize "EDITOR.Save"}}</span>
</button>
</footer>

View file

@ -36,7 +36,7 @@
</button>
<button data-action="save" >
<i class="fa-solid fa-floppy-disk"></i>
<span>{{localize "Save Changes"}}</span>
<span>{{localize "EDITOR.Save"}}</span>
</button>
</footer>
</div>

View file

@ -5,7 +5,7 @@
<div class="icon">
<i class="fa-solid fa-magnifying-glass"></i>
</div>
<input type="search" name="search" class="search-inventory" placeholder="Search...">
<input type="search" name="search" class="search-inventory" placeholder="{{localize "DAGGERHEART.GENERAL.searchPlaceholder"}}">
</div>
<a class="filter-button">
<i class="fa-solid fa-filter"></i>

View file

@ -5,7 +5,7 @@
<div class="icon">
<i class="fa-solid fa-magnifying-glass"></i>
</div>
<input type="search" name="search" class="search-loadout" placeholder="Search...">
<input type="search" name="search" class="search-loadout" placeholder="{{localize "DAGGERHEART.GENERAL.searchPlaceholder"}}">
</div>
<a class="filter-button">
<i class="fa-solid fa-filter"></i>

View file

@ -5,7 +5,7 @@
<div class="icon">
<i class="fa-solid fa-magnifying-glass"></i>
</div>
<input type="search" name="search" class="search-inventory" placeholder="Search...">
<input type="search" name="search" class="search-inventory" placeholder="{{localize "DAGGERHEART.GENERAL.searchPlaceholder"}}">
</div>
<a class="filter-button">
<i class="fa-solid fa-filter"></i>

View file

@ -7,11 +7,11 @@
<div class="actions-section">
<button data-action="tagTeamRoll">
<i class="fa-solid fa-user-group"></i>
<span>Tag Team Roll</span>
<span>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.title"}}</span>
</button>
<button data-action="groupRoll">
<i class="fa-solid fa-users"></i>
<span>Group Roll</span>
<span>{{localize "DAGGERHEART.APPLICATIONS.GroupRollSelect.title"}}</span>
</button>
{{!-- NOT YET IMPLEMENTED --}}
{{!-- <button>

View file

@ -1,9 +1,9 @@
<div class="item-description-outer-container">
{{#if features.length}}
{{#if features.length}}
<div class="item-description-outer-container">
<div class="item-description-container">
{{#each features as | feature |}}
<div><strong>{{localize feature.label}}</strong>: {{{localize feature.description}}}</div>
{{/each}}
</div>
{{/if}}
</div>
</div>
{{/if}}

View file

@ -1,9 +1,9 @@
<div class="item-description-outer-container">
{{#if features.length}}
{{#if features.length}}
<div class="item-description-outer-container">
<div class="item-description-container">
{{#each features as | feature |}}
<div><strong>{{localize feature.label}}</strong>: {{{localize feature.description}}}</div>
{{/each}}
</div>
{{/if}}
</div>
</div>
{{/if}}

View file

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

View file

@ -7,7 +7,7 @@
<legend>{{localize tabs.settings.label}}</legend>
<span>{{localize "DAGGERHEART.GENERAL.Tiers.singular"}}</span>
{{formInput systemFields.tier value=source.system.tier}}
<span>{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}</span>
<span>{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full"}}</span>
{{formInput systemFields.secondary value=source.system.secondary}}
<span>{{localize "DAGGERHEART.GENERAL.Trait.single"}}</span>
{{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}}

View file

@ -24,7 +24,7 @@
<div class="roll-part-header"><div></div></div>
</div>
{{/if}}
{{#if (and hasSave currentTargets.length)}}<div class="roll-part-extra roll-all-save-button">Reaction Roll All Targets<i class="fa-solid fa-shield fa-lg"></i></div>{{/if}}
{{#if (and hasSave currentTargets.length)}}<div class="roll-part-extra roll-all-save-button">{{localize "DAGGERHEART.UI.Chat.saveRoll.reactionRollAllTargets"}}<i class="fa-solid fa-shield fa-lg"></i></div>{{/if}}
{{#each currentTargets}}
<div class="roll-target" data-token="{{id}}">
<img class="target-img" src="{{img}}">

View file

@ -66,7 +66,7 @@
{{#if (and combats.length user.isGM)}}
<div class="encounter-battlepoints" data-tooltip="#battlepoints#" data-combat-id="{{combat.id}}">
{{battlepoints.current}}/{{battlepoints.max}} BP{{#if battlepoints.hasModifierBP}}*{{/if}}
{{battlepoints.current}}/{{battlepoints.max}} {{localize "DAGGERHEART.GENERAL.Battlepoints.short"}}{{#if battlepoints.hasModifierBP}}*{{/if}}
</div>
{{/if}}

View file

@ -1,14 +1,14 @@
<div class="compendium-results">
{{#if menu.path.length }}
<div class="menu-path">
{{#each menu.path}}
{{#if (eq this "folders")}}
{{#each menu.pathLabels}}
{{#unless @first}}
<span class="path-link">
/
</span>
{{else}}
<span class="item-path">{{this}}</span>
{{/if}}
{{/unless}}
<span class="item-path">{{this}}</span>
{{/each}}
</div>
<div class="item-filter">
@ -17,7 +17,7 @@
<div class="icon">
<i class="fa-solid fa-magnifying-glass"></i>
</div>
<input type="search" name="search" class="search-input" placeholder="{{localize 'DAGGERHEART.UI.ItemBrowser.searchPlaceholder'}}">
<input type="search" name="search" class="search-input" placeholder="{{localize 'DAGGERHEART.GENERAL.searchPlaceholder'}}">
</div>
<a data-tooltip="{{localize 'DAGGERHEART.UI.ItemBrowser.tooltipFilters'}}" data-action="expandContent" disabled><i class="fa-solid fa-filter"></i></a>
<a data-tooltip="{{localize 'DAGGERHEART.UI.ItemBrowser.tooltipErase'}}" data-action="resetFilters"><i class="fa-solid fa-eraser"></i></a>

View file

@ -16,7 +16,7 @@
{{#if (gt item.cost.length 0)}}
{{#each item.cost as | cost |}}
<div class="tag">
<span>{{localize "Type"}} {{#with (lookup @root.config.GENERAL.abilityCosts cost.type) as | type |}}{{localize type.label}}{{/with}}</span>
<span>{{localize "DAGGERHEART.GENERAL.type"}} {{#with (lookup @root.config.GENERAL.abilityCosts cost.type) as | type |}}{{localize type.label}}{{/with}}</span>
</div>
<div class="tag">
<span>{{localize "DAGGERHEART.GENERAL.value"}} {{cost.value}}</span>

View file

@ -11,7 +11,7 @@
{{/with}}
</div>
<div class="tooltip-information">
<label>{{localize "Type"}}</label>
<label>{{localize "DAGGERHEART.GENERAL.type"}}</label>
{{#with (lookup adversaryTypes item.system.type) as | type |}}
<div>{{localize type.label}}</div>
{{/with}}

View file

@ -1,15 +1,15 @@
<div class="daggerheart dh-style tooltip">
<div class="tooltip-header"><h2>{{localize "Adversaries"}} ({{currentBP}}/{{maxBP}})</h2></div>
<div class="tooltip-header"><h2>{{localize "DAGGERHEART.GENERAL.Adversary.plural"}} ({{currentBP}}/{{maxBP}})</h2></div>
<div class="battlepoint-categories-container">
<div class="battlepoint-categories-inner-container">
{{#each categories as |category key|}}
{{#each category as |grouping index|}}
<div class="battlepoint-grouping-container">
{{#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}}
<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}}
</div>
{{/each}}
@ -17,7 +17,7 @@
</div>
</div>
<div class="tooltip-header"><h2>{{localize "Modifiers"}}</h2></div>
<div class="tooltip-header"><h2>{{localize "DAGGERHEART.GENERAL.Modifier.plural"}}</h2></div>
<div class="battlepoint-toggles-container">
{{#each toggles as |toggle|}}
<div class="battlepoint-toggle-container {{#if (and toggle.disabled (not toggle.checked))}}inactive{{/if}}">
@ -26,7 +26,7 @@
{{else}}
<input type="checkbox" data-combat-id="{{@root.combatId}}" data-category="{{toggle.categoryKey}}" data-grouping="{{toggle.toggleKey}}" {{checked toggle.checked}} />
{{/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>
{{/each}}
</div>

View file

@ -3,7 +3,7 @@
<h2 class="tooltip-title">{{item.name}}</h2>
<div class="tags">
<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 class="tag">
{{#with (lookup config.GENERAL.burden item.system.burden) as | burden |}}