diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index aef0ddd1..5e2f9ac7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -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 diff --git a/README.md b/README.md index 0c2dabc3..f59143fd 100644 --- a/README.md +++ b/README.md @@ -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: diff --git a/daggerheart.mjs b/daggerheart.mjs index abe12524..84ce2779 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -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 diff --git a/lang/en.json b/lang/en.json index feeb65b2..1437196c 100755 --- a/lang/en.json +++ b/lang/en.json @@ -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": { @@ -307,6 +306,9 @@ } }, "newAdversary": "New Adversary" + }, + "Party": { + "triggerRestContent": "This will trigger a dialog to players make their downtime moves. Are you sure?" } }, "APPLICATIONS": { @@ -440,6 +442,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 +659,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 +696,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 +715,11 @@ } }, "CONFIG": { + "ActionAutomationChoices": { + "never": "Never", + "showDialog": "Show Dialog Only", + "always": "Always" + }, "AdversaryTrait": { "relentless": { "name": "Relentless", @@ -1215,6 +1238,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 +1922,10 @@ "hint": "Multiply any damage dealt to you by this number" } }, + "Battlepoints": { + "full": "Battlepoints", + "short": "BP" + }, "Bonuses": { "rest": { "downtimeAction": "Downtime Action", @@ -2305,8 +2337,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 +2363,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 +2518,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 +2957,9 @@ "resourceRoll": { "playerMessage": "{user} rerolled their {name}" }, + "saveRoll": { + "reactionRollAllTargets": "Reaction Roll All Targets" + }, "tagTeam": { "title": "Tag Team", "membersTitle": "Members" @@ -2941,9 +2986,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 +3024,7 @@ "weapons": "Weapons", "armors": "Armors", "consumables": "Consumables", - "loots": "Loots" + "loots": "Loot" } }, "Notifications": { @@ -3070,6 +3115,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": { diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index aa764c56..467366fc 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -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); } diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index 4c01c2a9..09d901f4 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -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 }); } diff --git a/module/applications/settings/appearanceSettings.mjs b/module/applications/settings/appearanceSettings.mjs index 151648e1..7adf065d 100644 --- a/module/applications/settings/appearanceSettings.mjs +++ b/module/applications/settings/appearanceSettings.mjs @@ -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; } diff --git a/module/applications/sheets-configs/setting-feature-config.mjs b/module/applications/sheets-configs/setting-feature-config.mjs index 28e686ea..89421b65 100644 --- a/module/applications/sheets-configs/setting-feature-config.mjs +++ b/module/applications/sheets-configs/setting-feature-config.mjs @@ -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; diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index d8a3df29..04be3efb 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -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' }, diff --git a/module/applications/sheets/actors/party.mjs b/module/applications/sheets/actors/party.mjs index 1b1722db..53316c8b 100644 --- a/module/applications/sheets/actors/party.mjs +++ b/module/applications/sheets/actors/party.mjs @@ -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'] }); diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index b18176ec..baa4d173 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -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' } ] diff --git a/module/applications/sidebar/tabs/actorDirectory.mjs b/module/applications/sidebar/tabs/actorDirectory.mjs index 9d8f16e1..e9484553 100644 --- a/module/applications/sidebar/tabs/actorDirectory.mjs +++ b/module/applications/sidebar/tabs/actorDirectory.mjs @@ -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) } }); diff --git a/module/applications/ui/fearTracker.mjs b/module/applications/ui/fearTracker.mjs index 82dda215..4e5e1132 100644 --- a/module/applications/ui/fearTracker.mjs +++ b/module/applications/ui/fearTracker.mjs @@ -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 diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs index 2d2e8cdc..67a16f6a 100644 --- a/module/applications/ui/itemBrowser.mjs +++ b/module/applications/ui/itemBrowser.mjs @@ -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() { diff --git a/module/applications/ux/filter-menu.mjs b/module/applications/ux/filter-menu.mjs index 065d08f9..791c0e1f 100644 --- a/module/applications/ux/filter-menu.mjs +++ b/module/applications/ux/filter-menu.mjs @@ -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', diff --git a/module/canvas/placeables/measuredTemplate.mjs b/module/canvas/placeables/measuredTemplate.mjs index e1ea79f5..e439dadc 100644 --- a/module/canvas/placeables/measuredTemplate.mjs +++ b/module/canvas/placeables/measuredTemplate.mjs @@ -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; diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index f1c21d26..2557e562 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -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' } }; diff --git a/module/config/itemBrowserConfig.mjs b/module/config/itemBrowserConfig.mjs index 3b10409c..638c1504 100644 --- a/module/config/itemBrowserConfig.mjs +++ b/module/config/itemBrowserConfig.mjs @@ -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: [ diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index 77328987..11330aee 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -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); diff --git a/module/config/resourceConfig.mjs b/module/config/resourceConfig.mjs index 56ef6cd5..1306d327 100644 --- a/module/config/resourceConfig.mjs +++ b/module/config/resourceConfig.mjs @@ -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 = { diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index c19e6e26..8036d789 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -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' } }; diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index 2053ac99..dd41f290 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -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() { diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index cde7d280..bea3a3ec 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -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() { diff --git a/module/data/actor/companion.mjs b/module/data/actor/companion.mjs index 7a8f0e64..c6768e95 100644 --- a/module/data/actor/companion.mjs +++ b/module/data/actor/companion.mjs @@ -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) { diff --git a/module/data/actor/creature.mjs b/module/data/actor/creature.mjs index 88646301..601068ad 100644 --- a/module/data/actor/creature.mjs +++ b/module/data/actor/creature.mjs @@ -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); - } } diff --git a/module/data/fields/action/beastformField.mjs b/module/data/fields/action/beastformField.mjs index e19807c7..5e9c75f0 100644 --- a/module/data/fields/action/beastformField.mjs +++ b/module/data/fields/action/beastformField.mjs @@ -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' }) }) }; diff --git a/module/data/fields/action/damageField.mjs b/module/data/fields/action/damageField.mjs index 6439344b..6c091f8b 100644 --- a/module/data/fields/action/damageField.mjs +++ b/module/data/fields/action/damageField.mjs @@ -295,7 +295,7 @@ export class DHDamageData extends DHResourceData { required: true }), { - label: 'Type' + label: game.i18n.localize('DAGGERHEART.GENERAL.type') } ) }; diff --git a/module/data/fields/actorField.mjs b/module/data/fields/actorField.mjs index a3c17281..ac7dd5ef 100644 --- a/module/data/fields/actorField.mjs +++ b/module/data/fields/actorField.mjs @@ -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; } diff --git a/module/data/item/weapon.mjs b/module/data/item/weapon.mjs index bb7fde0a..04d1db7a 100644 --- a/module/data/item/weapon.mjs +++ b/module/data/item/weapon.mjs @@ -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, diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index 53921329..acc14439 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -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: `

Some Tokens still need to roll their Reaction Roll.

Are you sure you want to continue ?

Undone reaction rolls will be considered as failed

` + window: { title: game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.title') }, + content: `

${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.unfinishedRolls')}

${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.confirmation')}

${game.i18n.localize('DAGGERHEART.APPLICATIONS.PendingReactionsDialog.warning')}

` }); if (!confirm) return; } diff --git a/module/documents/tokenManager.mjs b/module/documents/tokenManager.mjs index be5467da..f766a677 100644 --- a/module/documents/tokenManager.mjs +++ b/module/documents/tokenManager.mjs @@ -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; diff --git a/module/enrichers/TemplateEnricher.mjs b/module/enrichers/TemplateEnricher.mjs index 4bc8fdeb..74462e00 100644 --- a/module/enrichers/TemplateEnricher.mjs +++ b/module/enrichers/TemplateEnricher.mjs @@ -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; +}; diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index 16ec7643..acfdb257 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -40,7 +40,8 @@ "experiences": { "ti3Z1mq2M92KK4GJ": { "name": "Bloodthirsty", - "description": "" + "description": "", + "value": 3 } }, "bonuses": { diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index a20d80e6..48926d06 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -251,7 +251,7 @@ "name": "Crushing Blows", "type": "feature", "system": { - "description": "

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 can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

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 can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "0sXciTiPc30v8czv": { diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index 3bb8ae96..e04b4422 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -257,7 +257,7 @@ "name": "Acidic Form", "type": "feature", "system": { - "description": "

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 can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

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 can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "gtT2oHSyZg9OHHJD": { diff --git a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json index b17cd7da..9a1c434b 100644 --- a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json +++ b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json @@ -80,7 +80,7 @@ { "key": "system.disadvantageSources", "mode": 2, - "value": "Retract", + "value": "Action Rolls", "priority": null } ], diff --git a/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json b/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json index f1ed3ace..f40baa40 100644 --- a/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json +++ b/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json @@ -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": "

When you’re in an area with low light or heavy shadow, you have advantage on rolls to hide, investigate, or perceive details within that area.

", "origin": null, "tint": "#ffffff", "transfer": true, diff --git a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json index 432f9992..6ca03c41 100644 --- a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json +++ b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json @@ -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": "

You gain advantage on attack rolls until you or an ally rolls a failure with Fear.

", "tint": "#ffffff", "statuses": [], "sort": 0, diff --git a/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json b/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json index 839dc2c2..7a5ccb1b 100644 --- a/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json +++ b/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json @@ -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": "

If a target you hit is Vulnerable, they take an extra 1d8 damage.

", - "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": { diff --git a/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json b/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json index 214d08a9..59963b03 100644 --- a/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json +++ b/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json @@ -45,7 +45,7 @@ { "value": { "dice": "d10", - "bonus": 1, + "bonus": 2, "multiplier": "prof", "flatMultiplier": 1, "custom": { diff --git a/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json b/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json index 4958bbe5..3c11528e 100644 --- a/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json +++ b/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json @@ -5,22 +5,14 @@ "_id": "ijWppQzSOqVCb3rE", "img": "icons/weapons/axes/axe-battle-jagged.webp", "system": { - "description": "", + "description": "Protective: +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", diff --git a/styles/less/dialog/character-creation/selections-container.less b/styles/less/dialog/character-creation/selections-container.less index 1de3d870..f774eb72 100644 --- a/styles/less/dialog/character-creation/selections-container.less +++ b/styles/less/dialog/character-creation/selections-container.less @@ -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; diff --git a/styles/less/global/prose-mirror.less b/styles/less/global/prose-mirror.less index 506fb8b7..fd699b66 100644 --- a/styles/less/global/prose-mirror.less +++ b/styles/less/global/prose-mirror.less @@ -24,7 +24,7 @@ } h4 { font-size: var(--font-size-16); - color: @beige; + color: light-dark(@dark, @beige); font-weight: 600; } diff --git a/styles/less/ui/combat-sidebar/encounter-controls.less b/styles/less/ui/combat-sidebar/encounter-controls.less index 16a8e11a..66f265e0 100644 --- a/styles/less/ui/combat-sidebar/encounter-controls.less +++ b/styles/less/ui/combat-sidebar/encounter-controls.less @@ -10,6 +10,7 @@ .encounter-battlepoints { display: flex; cursor: help; + color: light-dark(@dark, @beige); } .inner-controls { diff --git a/system.json b/system.json index 9242a24a..5a50e499 100644 --- a/system.json +++ b/system.json @@ -2,12 +2,15 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "1.9.6", + "version": "1.9.14", "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.14/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" } diff --git a/templates/actionTypes/beastform.hbs b/templates/actionTypes/beastform.hbs index b9bea445..3dcdb006 100644 --- a/templates/actionTypes/beastform.hbs +++ b/templates/actionTypes/beastform.hbs @@ -1,4 +1,4 @@
- {{localize "DAGGERHEART.ACTIONS.Config.beastform.label"}} + {{localize "DAGGERHEART.ACTIONS.TYPES.beastform.name"}} {{formGroup fields.tierAccess.fields.exact value=source.tierAccess.exact name="beastform.tierAccess.exact" labelAttr="label" valueAttr="key" localize=true blank=""}}
\ No newline at end of file diff --git a/templates/characterCreation/footer.hbs b/templates/characterCreation/footer.hbs index 95b86cfb..369af2d3 100644 --- a/templates/characterCreation/footer.hbs +++ b/templates/characterCreation/footer.hbs @@ -3,6 +3,6 @@ {{#if isLastTab}} {{else}} - + {{/if}} \ No newline at end of file diff --git a/templates/characterCreation/tabs/experience.hbs b/templates/characterCreation/tabs/experience.hbs index 3eb92834..66363084 100644 --- a/templates/characterCreation/tabs/experience.hbs +++ b/templates/characterCreation/tabs/experience.hbs @@ -4,17 +4,25 @@ data-group='{{tabs.experience.group}}' >
-
+
{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.initialExperiences"}} {{experience.nrSelected}}/{{experience.nrTotal}}
{{#each experience.values as |experience id|}} -
-
- - {{numberFormat this.value sign=true}} +
+
+ +
+ + {{numberFormat this.value sign=true}} +
- +
+ +
+ +
+
{{/each}}
diff --git a/templates/dialogs/compendiumBrowserSettingsDialog/footer.hbs b/templates/dialogs/compendiumBrowserSettingsDialog/footer.hbs index 9dc61cbe..d9bb378e 100644 --- a/templates/dialogs/compendiumBrowserSettingsDialog/footer.hbs +++ b/templates/dialogs/compendiumBrowserSettingsDialog/footer.hbs @@ -1,3 +1,3 @@
- +
\ No newline at end of file diff --git a/templates/dialogs/dice-roll/damageSelection.hbs b/templates/dialogs/dice-roll/damageSelection.hbs index c0dbae62..29a5d6bf 100644 --- a/templates/dialogs/dice-roll/damageSelection.hbs +++ b/templates/dialogs/dice-roll/damageSelection.hbs @@ -35,7 +35,7 @@
- +
{{/each}} {{#unless (empty @root.modifiers)}} diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index 5139c58a..569f5e16 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -175,7 +175,7 @@ {{/if}} {{#if (eq @root.rollType 'DualityRoll')}}{{localize "DAGGERHEART.GENERAL.situationalBonus"}}{{/if}} - +
{{/if}} {{/unless}} diff --git a/templates/settings/automation-settings/footer.hbs b/templates/settings/automation-settings/footer.hbs index 54939c17..d30c23b7 100644 --- a/templates/settings/automation-settings/footer.hbs +++ b/templates/settings/automation-settings/footer.hbs @@ -5,6 +5,6 @@ \ No newline at end of file diff --git a/templates/settings/homebrew-settings/footer.hbs b/templates/settings/homebrew-settings/footer.hbs index 954572de..92c0ef15 100644 --- a/templates/settings/homebrew-settings/footer.hbs +++ b/templates/settings/homebrew-settings/footer.hbs @@ -5,6 +5,6 @@ \ No newline at end of file diff --git a/templates/settings/metagaming-settings/footer.hbs b/templates/settings/metagaming-settings/footer.hbs index 54939c17..d30c23b7 100644 --- a/templates/settings/metagaming-settings/footer.hbs +++ b/templates/settings/metagaming-settings/footer.hbs @@ -5,6 +5,6 @@ \ No newline at end of file diff --git a/templates/settings/variant-rules.hbs b/templates/settings/variant-rules.hbs index df7accb3..c3d23bc2 100644 --- a/templates/settings/variant-rules.hbs +++ b/templates/settings/variant-rules.hbs @@ -36,7 +36,7 @@
diff --git a/templates/sheets/actors/character/inventory.hbs b/templates/sheets/actors/character/inventory.hbs index a05fed35..711d0c9f 100644 --- a/templates/sheets/actors/character/inventory.hbs +++ b/templates/sheets/actors/character/inventory.hbs @@ -5,7 +5,7 @@
- + diff --git a/templates/sheets/actors/character/loadout.hbs b/templates/sheets/actors/character/loadout.hbs index 0319d56f..5e4c9f54 100644 --- a/templates/sheets/actors/character/loadout.hbs +++ b/templates/sheets/actors/character/loadout.hbs @@ -5,7 +5,7 @@
- +
diff --git a/templates/sheets/actors/party/inventory.hbs b/templates/sheets/actors/party/inventory.hbs index 92371b8d..186e2e99 100644 --- a/templates/sheets/actors/party/inventory.hbs +++ b/templates/sheets/actors/party/inventory.hbs @@ -5,7 +5,7 @@
- +
diff --git a/templates/sheets/actors/party/party-members.hbs b/templates/sheets/actors/party/party-members.hbs index b5903cfc..acbbc716 100644 --- a/templates/sheets/actors/party/party-members.hbs +++ b/templates/sheets/actors/party/party-members.hbs @@ -7,17 +7,12 @@
- {{!-- NOT YET IMPLEMENTED --}} - {{!-- --}}
diff --git a/templates/sheets/items/armor/description.hbs b/templates/sheets/items/armor/description.hbs index af2698ef..086879d6 100644 --- a/templates/sheets/items/armor/description.hbs +++ b/templates/sheets/items/armor/description.hbs @@ -1,9 +1,9 @@ -
- {{#if features.length}} +{{#if features.length}} +
{{#each features as | feature |}}
{{localize feature.label}}: {{{localize feature.description}}}
{{/each}}
- {{/if}} -
\ No newline at end of file +
+{{/if}} \ No newline at end of file diff --git a/templates/sheets/items/weapon/description.hbs b/templates/sheets/items/weapon/description.hbs index af2698ef..74e4e234 100644 --- a/templates/sheets/items/weapon/description.hbs +++ b/templates/sheets/items/weapon/description.hbs @@ -1,9 +1,9 @@ -
- {{#if features.length}} +{{#if features.length}} +
{{#each features as | feature |}}
{{localize feature.label}}: {{{localize feature.description}}}
{{/each}}
- {{/if}} -
\ No newline at end of file +
+{{/if}} \ No newline at end of file diff --git a/templates/sheets/items/weapon/header.hbs b/templates/sheets/items/weapon/header.hbs index 349a9516..2f51d6d3 100644 --- a/templates/sheets/items/weapon/header.hbs +++ b/templates/sheets/items/weapon/header.hbs @@ -5,9 +5,9 @@

{{#if source.system.secondary}} -

{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}

+

{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full"}}

{{else}} -

{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon"}}

+

{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon.full"}}

{{/if}}

{{localize (concat 'DAGGERHEART.CONFIG.Traits.' source.system.attack.roll.trait '.short')}} diff --git a/templates/sheets/items/weapon/settings.hbs b/templates/sheets/items/weapon/settings.hbs index f9499221..7ff8becf 100644 --- a/templates/sheets/items/weapon/settings.hbs +++ b/templates/sheets/items/weapon/settings.hbs @@ -7,7 +7,7 @@ {{localize tabs.settings.label}} {{localize "DAGGERHEART.GENERAL.Tiers.singular"}} {{formInput systemFields.tier value=source.system.tier}} - {{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}} + {{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full"}} {{formInput systemFields.secondary value=source.system.secondary}} {{localize "DAGGERHEART.GENERAL.Trait.single"}} {{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}} diff --git a/templates/ui/chat/parts/target-part.hbs b/templates/ui/chat/parts/target-part.hbs index 9a545926..88d337ac 100644 --- a/templates/ui/chat/parts/target-part.hbs +++ b/templates/ui/chat/parts/target-part.hbs @@ -24,7 +24,7 @@

{{/if}} - {{#if (and hasSave currentTargets.length)}}
Reaction Roll All Targets
{{/if}} + {{#if (and hasSave currentTargets.length)}}
{{localize "DAGGERHEART.UI.Chat.saveRoll.reactionRollAllTargets"}}
{{/if}} {{#each currentTargets}}
diff --git a/templates/ui/combatTracker/combatTrackerHeader.hbs b/templates/ui/combatTracker/combatTrackerHeader.hbs index 8ac960c6..803286ab 100644 --- a/templates/ui/combatTracker/combatTrackerHeader.hbs +++ b/templates/ui/combatTracker/combatTrackerHeader.hbs @@ -66,7 +66,7 @@ {{#if (and combats.length user.isGM)}}
- {{battlepoints.current}}/{{battlepoints.max}} BP{{#if battlepoints.hasModifierBP}}*{{/if}} + {{battlepoints.current}}/{{battlepoints.max}} {{localize "DAGGERHEART.GENERAL.Battlepoints.short"}}{{#if battlepoints.hasModifierBP}}*{{/if}}
{{/if}} diff --git a/templates/ui/itemBrowser/itemBrowser.hbs b/templates/ui/itemBrowser/itemBrowser.hbs index 137693fc..d4946c1f 100644 --- a/templates/ui/itemBrowser/itemBrowser.hbs +++ b/templates/ui/itemBrowser/itemBrowser.hbs @@ -1,14 +1,14 @@
{{#if menu.path.length }}
@@ -17,7 +17,7 @@
- +
diff --git a/templates/ui/tooltip/action.hbs b/templates/ui/tooltip/action.hbs index 29d44dde..959188f3 100644 --- a/templates/ui/tooltip/action.hbs +++ b/templates/ui/tooltip/action.hbs @@ -16,7 +16,7 @@ {{#if (gt item.cost.length 0)}} {{#each item.cost as | cost |}}
- {{localize "Type"}} {{#with (lookup @root.config.GENERAL.abilityCosts cost.type) as | type |}}{{localize type.label}}{{/with}} + {{localize "DAGGERHEART.GENERAL.type"}} {{#with (lookup @root.config.GENERAL.abilityCosts cost.type) as | type |}}{{localize type.label}}{{/with}}
{{localize "DAGGERHEART.GENERAL.value"}} {{cost.value}} diff --git a/templates/ui/tooltip/adversary.hbs b/templates/ui/tooltip/adversary.hbs index bba7e696..f96fe2a0 100644 --- a/templates/ui/tooltip/adversary.hbs +++ b/templates/ui/tooltip/adversary.hbs @@ -11,7 +11,7 @@ {{/with}}
- + {{#with (lookup adversaryTypes item.system.type) as | type |}}
{{localize type.label}}
{{/with}} diff --git a/templates/ui/tooltip/battlepoints.hbs b/templates/ui/tooltip/battlepoints.hbs index d793fe8c..f2f42f53 100644 --- a/templates/ui/tooltip/battlepoints.hbs +++ b/templates/ui/tooltip/battlepoints.hbs @@ -1,15 +1,15 @@
-

{{localize "Adversaries"}} ({{currentBP}}/{{maxBP}})

+

{{localize "DAGGERHEART.GENERAL.Adversary.plural"}} ({{currentBP}}/{{maxBP}})

{{#each categories as |category key|}} {{#each category as |grouping index|}}
{{#if grouping.nr}} - + {{else}} - + {{/if}}
{{/each}} @@ -17,7 +17,7 @@
-

{{localize "Modifiers"}}

+

{{localize "DAGGERHEART.GENERAL.Modifier.plural"}}

{{#each toggles as |toggle|}}
@@ -26,7 +26,7 @@ {{else}} {{/if}} - +
{{/each}}
diff --git a/templates/ui/tooltip/weapon.hbs b/templates/ui/tooltip/weapon.hbs index a672c883..4adb9c46 100644 --- a/templates/ui/tooltip/weapon.hbs +++ b/templates/ui/tooltip/weapon.hbs @@ -3,7 +3,7 @@

{{item.name}}

- {{#if item.system.secondary}}{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon"}}{{/if}} + {{#if item.system.secondary}}{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon.full"}}{{/if}}
{{#with (lookup config.GENERAL.burden item.system.burden) as | burden |}}