diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 553a1a17..e245c7fa 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://raw.githubusercontent.com/${{github.repository}}/v14/system.json + manifest: https://raw.githubusercontent.com/${{github.repository}}/main/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/CONTRIBUTING.md b/CONTRIBUTING.md index 261c26bd..b9099005 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,78 @@ -# Contributing to Daggerheart +# Contributing to Foundryborne -Thank you for your interest in contributing to the Foundryborne project! +Welcome! This is a community-driven project to bring [Daggerheart](https://www.daggerheart.com/) to [FoundryVTT](https://foundryvtt.com/) as a full system. We're excited to have you here and appreciate your interest in contributing. -To ensure that all contributions align with our project goals and architectural standards, we ask that you **do not submit outside contributions without first receiving feedback from the development team.** +--- -If you have an idea or a fix you'd like to contribute, please start a discussion or open an issue first. We'd love to hear from you and collaborate on the best way to move forward! +## ๐Ÿค How to Contribute -Thank you for your understanding and support. +We welcome contributions of all kinds: + +- Bug reports +- Feature suggestions +- Code contributions +- UI/UX mockups +- Documentation improvements +- Questions and discussions + +Please be respectful and collaborative โ€” weโ€™re all here to build something great together. + +### Community Translations + +Please note that we are not accepting community translations in the main project. Instead, community translations should be published as a module. + +--- + +## ๐Ÿงญ General Guidelines + +- **Use GitHub Issues** to report bugs or propose features +- **Start a Discussion** for larger ideas or questions +- **Open a Pull Request** once you've confirmed your work aligns with project direction +- **Keep things modular and maintainable** โ€” if you're not sure how to structure something, ask! +- **Orient your code on existing examples**, and feel free to suggest a standard if it makes things clearer + +--- + +## ๐Ÿ—‚๏ธ Project Structure + +Please try to follow the general logic of the existing code when submitting PRs. + +We encourage contributors to leave comments or open Discussions when proposing structural or organizational changes. + +--- + +## ๐Ÿงพ Issue & PR Best Practices + +**For Issues:** + +- Use clear, descriptive titles +- Provide a concise explanation of the problem or idea +- Include reproduction steps or example scenarios if it's a bug +- Add screenshots or logs if helpful + +**For Pull Requests:** + +- Use a clear title summarizing the change +- Provide a brief description of what your code does and why +- Link to any related Issues +- Keep PRs focused โ€” smaller is better + +--- + +## ๐Ÿ”– Labels and Boards + +We use GitHub labels to help organize contributions. If your issue or PR relates to a specific category, feel free to tag it. There is also a GitHub Project Board to help track active work and priorities. + +--- + +## ๐Ÿ“ฃ Communication + +Discussions are currently happening on GitHub โ€” in Issues, PRs, and [GitHub Discussions](https://github.com/Foundryborne/daggerheart/discussions). You're welcome to use any of these, though we may consolidate to one in the future. + +--- + +## ๐Ÿค— Thank You! + +Whether you're fixing a typo or designing entire mechanics โ€” every contribution matters. Thank you for helping bring _Daggerheart_ to life in FoundryVTT through **Foundryborne**! + +๐Ÿธ๐Ÿ› ๏ธ diff --git a/daggerheart.mjs b/daggerheart.mjs index 064b1670..43aafce4 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -355,8 +355,6 @@ Hooks.on(CONFIG.DH.HOOKS.hooksConfig.groupRollStart, async data => { }); 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 bc0cf05a..a2c3dc79 100755 --- a/lang/en.json +++ b/lang/en.json @@ -74,7 +74,9 @@ "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." + "invalidDrop": "You can only drop Actor entities to summon.", + "chatMessageTitle": "Test2", + "chatMessageHeaderTitle": "Summoning" }, "transform": { "name": "Transform", @@ -2014,10 +2016,6 @@ "hint": "Multiply any damage dealt to you by this number" } }, - "Battlepoints": { - "full": "Battlepoints", - "short": "BP" - }, "Bonuses": { "rest": { "downtimeAction": "Downtime Action", @@ -2433,7 +2431,6 @@ "next": "Next", "none": "None", "noTarget": "No current target", - "optionalThing": "Optional {thing}", "partner": "Partner", "player": { "single": "Player", @@ -2460,7 +2457,6 @@ "rollDamage": "Roll Damage", "rollWith": "{roll} Roll", "save": "Save", - "saveSettings": "Save Settings", "scalable": "Scalable", "scars": "Scars", "situationalBonus": "Situational Bonus", @@ -2615,14 +2611,8 @@ }, "Weapon": { "weaponType": "Weapon Type", - "primaryWeapon": { - "full": "Primary Weapon", - "short": "Primary" - }, - "secondaryWeapon": { - "full": "Secondary Weapon", - "short": "Secondary" - } + "primaryWeapon": "Primary Weapon", + "secondaryWeapon": "Secondary Weapon" } }, "MACROS": { @@ -3077,7 +3067,6 @@ }, "ItemBrowser": { "title": "Daggerheart Compendium Browser", - "windowTitle": "Compendium Browser", "hint": "Select a Folder in sidebar to start browsing through the compendium", "browserSettings": "Browser Settings", "columnName": "Name", diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index 936bb79d..e6c0f299 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -11,10 +11,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl this.character = character; this.setup = { - traits: Object.keys(this.character.system.traits).reduce((acc, key) => { - acc[key] = { value: null }; - return acc; - }, {}), + traits: this.character.system.traits, ancestryName: { primary: '', secondary: '' @@ -380,10 +377,8 @@ 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 += 1; + acc += index !== -1; return acc; }, 0); } diff --git a/module/applications/hud/tokenHUD.mjs b/module/applications/hud/tokenHUD.mjs index 943f3506..77caaaff 100644 --- a/module/applications/hud/tokenHUD.mjs +++ b/module/applications/hud/tokenHUD.mjs @@ -122,14 +122,15 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { async toggleClowncar(actors) { const animationDuration = 500; - const scene = game.scenes.get(game.user.viewedScene); - /* getDependentTokens returns already removed tokens with id = null. Need to filter that until it's potentially fixed from Foundry */ - const activeTokens = actors.flatMap(member => member.getDependentTokens({ scenes: scene }).filter(x => x._id)); + const activeTokens = actors.flatMap(member => member.getActiveTokens()); const { x: actorX, y: actorY } = this.document; if (activeTokens.length > 0) { for (let token of activeTokens) { - await token.update({ x: actorX, y: actorY, alpha: 0 }, { animation: { duration: animationDuration } }); - setTimeout(() => token.delete(), animationDuration); + await token.document.update( + { x: actorX, y: actorY, alpha: 0 }, + { animation: { duration: animationDuration } } + ); + setTimeout(() => token.document.delete(), animationDuration); } } else { const activeScene = game.scenes.find(x => x.id === game.user.viewedScene); @@ -139,16 +140,11 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { tokenData.push(data.toObject()); } - const viewedLevel = game.scenes.get(game.user.viewedScene).levels.get(game.user.viewedLevel); - const elevation = this.actor.token?.elevation ?? viewedLevel.elevation.bottom; - const newTokens = await activeScene.createEmbeddedDocuments( 'Token', tokenData.map(tokenData => ({ ...tokenData, alpha: 0, - level: viewedLevel, - elevation: elevation, x: actorX, y: actorY })) diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs index 67a16f6a..9ca328a0 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: 'DAGGERHEART.UI.ItemBrowser.windowTitle', + title: 'Compendium Browser', icon: 'fa-solid fa-book-atlas', positioned: true, resizable: true @@ -583,9 +583,7 @@ 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/canvas/tokens.mjs b/module/canvas/tokens.mjs index 9ca140e0..9813cd48 100644 --- a/module/canvas/tokens.mjs +++ b/module/canvas/tokens.mjs @@ -1 +1,16 @@ -export default class DhTokenLayer extends foundry.canvas.layers.TokenLayer {} +export default class DhTokenLayer extends foundry.canvas.layers.TokenLayer { + async _createPreview(createData, options) { + if (options.actor) { + const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; + if (options.actor?.system.metadata.usesSize) { + const tokenSize = tokenSizes[options.actor.system.size]; + if (tokenSize && options.actor.system.size !== CONFIG.DH.ACTOR.tokenSize.custom.id) { + createData.width = tokenSize; + createData.height = tokenSize; + } + } + } + + return super._createPreview(createData, options); + } +} diff --git a/module/config/itemBrowserConfig.mjs b/module/config/itemBrowserConfig.mjs index f20e56d0..0a4154a8 100644 --- a/module/config/itemBrowserConfig.mjs +++ b/module/config/itemBrowserConfig.mjs @@ -74,13 +74,12 @@ export const typeConfig = { columns: [ { key: 'type', - label: 'DAGGERHEART.GENERAL.type', - format: type => type ? `TYPES.Item.${type}` : '-' + label: 'DAGGERHEART.GENERAL.type' }, { key: 'system.secondary', label: 'DAGGERHEART.UI.ItemBrowser.subtype', - format: isSecondary => (isSecondary ? 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon.short' : isSecondary === false ? 'DAGGERHEART.ITEMS.Weapon.primaryWeapon.short' : '-') + format: isSecondary => (isSecondary ? 'secondary' : isSecondary === false ? 'primary' : '-') }, { key: 'system.tier', @@ -100,8 +99,8 @@ export const typeConfig = { key: 'system.secondary', label: 'DAGGERHEART.UI.ItemBrowser.subtype', choices: [ - { value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon.full' }, - { value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon.full' } + { value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon' }, + { value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon' } ] }, { @@ -259,13 +258,11 @@ export const typeConfig = { columns: [ { key: 'system.type', - label: 'DAGGERHEART.GENERAL.type', - format: type => type ? `DAGGERHEART.CONFIG.DomainCardTypes.${type}` : '-' + label: 'DAGGERHEART.GENERAL.type' }, { key: 'system.domain', - label: 'DAGGERHEART.GENERAL.Domain.single', - format: domain => domain ? CONFIG.DH.DOMAIN.allDomains()[domain].label : '-' + label: 'DAGGERHEART.GENERAL.Domain.single' }, { key: 'system.level', @@ -377,7 +374,7 @@ export const typeConfig = { columns: [ { key: 'system.linkedClass', - label: 'TYPES.Item.class', + label: 'Class', format: linkedClass => linkedClass?.name ?? 'DAGGERHEART.UI.ItemBrowser.missing' }, { @@ -389,7 +386,7 @@ export const typeConfig = { filters: [ { key: 'system.linkedClass.uuid', - label: 'TYPES.Item.class', + label: 'Class', choices: items => { const list = items .filter(item => item.system.linkedClass) @@ -413,8 +410,7 @@ export const typeConfig = { }, { key: 'system.mainTrait', - label: 'DAGGERHEART.GENERAL.Trait.single', - format: trait => (trait ? `DAGGERHEART.CONFIG.Traits.${trait}.name` : '-') + label: 'DAGGERHEART.GENERAL.Trait.single' } ], filters: [ diff --git a/module/data/fields/action/summonField.mjs b/module/data/fields/action/summonField.mjs index 36ea1010..dce6414c 100644 --- a/module/data/fields/action/summonField.mjs +++ b/module/data/fields/action/summonField.mjs @@ -44,18 +44,12 @@ export default class DHSummonField extends fields.ArrayField { count = roll.total; } - const actor = await DHSummonField.getWorldActor(await foundry.utils.fromUuid(summon.actorUUID)); + const actor = DHSummonField.getWorldActor(await foundry.utils.fromUuid(summon.actorUUID)); /* Extending summon data in memory so it's available in actionField.toChat. Think it's harmless, but ugly. Could maybe find a better way. */ + summon.rolledCount = count; summon.actor = actor.toObject(); - const countNumber = Number.parseInt(count); - for (let i = 0; i < countNumber; i++) { - const remaining = countNumber - i; - summonData.push({ - actor, - tokenPreviewName: `${actor.prototypeToken.name}${remaining > 1 ? ` (${remaining}x)` : ''}` - }); - } + summonData.push({ actor, count: count }); } if (rolls.length) await Promise.all(rolls.map(roll => game.dice3d.showForRoll(roll, game.user, true))); @@ -64,22 +58,32 @@ export default class DHSummonField extends fields.ArrayField { DHSummonField.handleSummon(summonData, this.actor); } - /* Check for any available instances of the actor present in the world if we're missing artwork in the compendium. If none exists, create one. */ - static async getWorldActor(baseActor) { + /* Check for any available instances of the actor present in the world if we're missing artwork in the compendium */ + static getWorldActor(baseActor) { const dataType = game.system.api.data.actors[`Dh${baseActor.type.capitalize()}`]; if (baseActor.inCompendium && dataType && baseActor.img === dataType.DEFAULT_ICON) { const worldActorCopy = game.actors.find(x => x.name === baseActor.name); - if (worldActorCopy) return worldActorCopy; - - return await game.system.api.documents.DhpActor.create(baseActor.toObject()); + return worldActorCopy ?? baseActor; } return baseActor; } - static async handleSummon(summonData, actionActor) { - await CONFIG.ux.TokenManager.createTokensWithPreview(summonData, { elevation: actionActor.token?.elevation }); + static async handleSummon(summonData, actionActor, summonIndex = 0) { + const summon = summonData[summonIndex]; + const result = await CONFIG.ux.TokenManager.createPreviewAsync(summon.actor, { + name: `${summon.actor.prototypeToken.name}${summon.count > 1 ? ` (${summon.count}x)` : ''}` + }); - return actionActor.sheet?.maximize(); + if (!result) return actionActor.sheet?.maximize(); + summon.actor = result.actor; + + summon.count--; + if (summon.count <= 0) { + summonIndex++; + if (summonIndex === summonData.length) return actionActor.sheet?.maximize(); + } + + DHSummonField.handleSummon(summonData, actionActor, summonIndex); } } diff --git a/module/documents/tokenManager.mjs b/module/documents/tokenManager.mjs index 3ccff4e2..f766a677 100644 --- a/module/documents/tokenManager.mjs +++ b/module/documents/tokenManager.mjs @@ -1,68 +1,104 @@ /** - * A singleton class that handles creating tokens. + * A singleton class that handles preview tokens. */ export default class DhTokenManager { + #activePreview; + #actor; + #resolve; + /** - * Create a token previer - * @param {Actor} actor - * @param {object} tokenData + * Create a template preview, deactivating any existing ones. + * @param {object} data */ async createPreview(actor, tokenData) { - const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; - if (actor?.system.metadata.usesSize) { - const tokenSize = tokenSizes[actor.system.size]; - if (tokenSize && actor.system.size !== CONFIG.DH.ACTOR.tokenSize.custom.id) { - tokenData.width = tokenSize; - tokenData.height = tokenSize; - } - } - - return await canvas.tokens.placeTokens( - [ - { - ...actor.prototypeToken.toObject(), - actorId: actor.id, - displayName: 50, - ...tokenData - } - ], - { create: false } + this.#actor = actor; + const token = await canvas.tokens._createPreview( + { + ...actor.prototypeToken, + displayName: 50, + ...tokenData + }, + { renderSheet: false, actor } ); + + this.#activePreview = { + document: token.document, + object: token, + origin: { x: token.document.x, y: token.document.y } + }; + + this.#activePreview.events = { + contextmenu: this.#cancelTemplate.bind(this), + mousedown: this.#confirmTemplate.bind(this), + mousemove: this.#onDragMouseMove.bind(this) + }; + + canvas.stage.on('mousemove', this.#activePreview.events.mousemove); + canvas.stage.on('mousedown', this.#activePreview.events.mousedown); + canvas.app.view.addEventListener('contextmenu', this.#activePreview.events.contextmenu); + } + + /* Currently intended for using as a preview of where to create a token. (note the flag) */ + async createPreviewAsync(actor, tokenData = {}) { + return new Promise(resolve => { + this.#resolve = resolve; + this.createPreview(actor, { ...tokenData, flags: { daggerheart: { createPlacement: true } } }); + }); } /** - * Creates new tokens on the canvas by placing previews. - * @param {object} tokenData - * @param {object} options + * Handles the movement of the token preview on mousedrag. + * @param {mousemove Event} event */ - async createTokensWithPreview(tokensData, { elevation } = {}) { - const scene = game.scenes.get(game.user.viewedScene); - if (!scene) return; + #onDragMouseMove(event) { + event.stopPropagation(); + const { moveTime, object } = this.#activePreview; + const update = {}; - const level = scene.levels.get(game.user.viewedLevel); - if (!level) return; + const now = Date.now(); + if (now - (moveTime || 0) <= 16) return; + this.#activePreview.moveTime = now; - const createElevation = elevation ?? level.elevation.bottom; - for (const tokenData of tokensData) { - const previewTokens = await this.createPreview(tokenData.actor, { - name: tokenData.tokenPreviewName, - level: game.user.viewedLevel, - elevation: createElevation, - flags: { daggerheart: { createPlacement: true } } - }); - if (!previewTokens?.length) return null; + let cursor = event.getLocalPosition(canvas.templates); - await canvas.scene.createEmbeddedDocuments( - 'Token', - previewTokens.map(x => ({ - ...x.toObject(), - name: tokenData.actor.prototypeToken.name, - displayName: tokenData.actor.prototypeToken.displayName, - flags: tokenData.actor.prototypeToken.flags - })), - { controlObject: true, parent: canvas.scene } - ); - } + Object.assign(update, canvas.grid.getTopLeftPoint(cursor)); + + object.document.updateSource(update); + object.renderFlags.set({ refresh: true }); + } + + /** + * Cancels the preview token on right-click. + * @param {contextmenu Event} event + */ + #cancelTemplate(_event, resolved) { + const { mousemove, mousedown, contextmenu } = this.#activePreview.events; + this.#activePreview.object.destroy(); + + canvas.stage.off('mousemove', mousemove); + canvas.stage.off('mousedown', mousedown); + canvas.app.view.removeEventListener('contextmenu', contextmenu); + if (this.#resolve && !resolved) this.#resolve(false); + } + + /** + * Creates a real Actor and token at the preview location and cancels the preview. + * @param {click Event} event + */ + async #confirmTemplate(event) { + event.stopPropagation(); + this.#cancelTemplate(event, true); + + const actor = this.#actor.inCompendium + ? await game.system.api.documents.DhpActor.create(this.#actor.toObject()) + : this.#actor; + const tokenData = await actor.getTokenDocument(); + const result = await canvas.scene.createEmbeddedDocuments('Token', [ + { ...tokenData.toObject(), x: this.#activePreview.document.x, y: this.#activePreview.document.y } + ]); + + this.#activePreview = undefined; + if (this.#resolve && result.length) this.#resolve(result[0]); } } diff --git a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json index eb9696b2..b17cd7da 100644 --- a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json +++ b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json @@ -68,33 +68,31 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.resistance.physical.resistance", - "type": "override", - "value": 1, - "priority": null, - "phase": "initial" - }, - { - "key": "system.disadvantageSources", - "type": "add", - "value": "Action rolls", - "priority": null, - "phase": "initial" - } - ], - "duration": { - "type": "" } }, + "changes": [ + { + "key": "system.resistance.physical.resistance", + "mode": 5, + "value": "1", + "priority": null + }, + { + "key": "system.disadvantageSources", + "mode": 2, + "value": "Retract", + "priority": null + } + ], "disabled": true, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

While in your shell, you have resistance to physical damage, you have disadvantage on action rolls, and you canโ€™t move.

", "tint": "#ffffff", @@ -104,16 +102,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!UFR67BUOhNGLFyg9.3V4FPoyjJUnFP9WS" } ], diff --git a/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json b/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json index c95d9132..f1ed3ace 100644 --- a/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json +++ b/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json @@ -29,28 +29,39 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.advantageSources", - "type": "add", - "value": "Rolls to hide, investigate, or perceive details in low light", - "priority": null, - "phase": "initial" - } - ], - "duration": { - "type": "" } }, + "changes": [ + { + "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": "", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "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.

", + "description": "", "origin": null, "tint": "#ffffff", "transfer": true, @@ -60,16 +71,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!aMla3xQuCHEwORGD.pCp32u7UwqxCI4WW" } ], diff --git a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json index 1fde286d..c9ae6071 100644 --- a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json +++ b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json @@ -132,29 +132,27 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.advantageSources", - "type": "add", - "value": "On Attacks", - "priority": null, - "phase": "initial" - } - ], - "duration": { - "type": "temporary", - "description": "

Until you or an ally rolls a failure with Fear.

" } }, + "changes": [ + { + "key": "system.advantageSources", + "mode": 2, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

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

", + "description": "", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -162,16 +160,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!Ef1JsUG50LIoKx2F.s7ma4TNgAvt0ZgEW" } ], diff --git a/styles/less/dialog/character-creation/selections-container.less b/styles/less/dialog/character-creation/selections-container.less index 2bbac484..f9569fca 100644 --- a/styles/less/dialog/character-creation/selections-container.less +++ b/styles/less/dialog/character-creation/selections-container.less @@ -175,11 +175,6 @@ opacity: 0.2; } - &.no-horizontal-padding { - padding-left: 0; - padding-right: 0; - } - legend { margin-left: auto; margin-right: auto; @@ -255,11 +250,6 @@ height: 65px; background: url(../assets/svg/trait-shield.svg) no-repeat; background-size: 100%; - padding-top: 3px; - display: flex; - flex-direction: column; - align-items: center; - row-gap: 3px; div { filter: drop-shadow(0 0 3px black); @@ -288,15 +278,6 @@ 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/sheets-settings/character-settings/sheet.less b/styles/less/sheets-settings/character-settings/sheet.less index eab29436..f7f16df4 100644 --- a/styles/less/sheets-settings/character-settings/sheet.less +++ b/styles/less/sheets-settings/character-settings/sheet.less @@ -27,11 +27,10 @@ height: 65px; background: url(../assets/svg/trait-shield.svg) no-repeat; background-size: 100%; - padding-top: 3px; + padding-top: 4px; display: flex; flex-direction: column; align-items: center; - row-gap: 3px; span { font-size: var(--font-size-10); diff --git a/system.json b/system.json index babdde26..614b9cc0 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "2.1.2", + "version": "2.1.1", "compatibility": { "minimum": "14.359", "verified": "14.360", @@ -10,7 +10,7 @@ }, "url": "https://github.com/Foundryborne/daggerheart", "manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/v14/system.json", - "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.1.2/system.zip", + "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.1.1/system.zip", "authors": [ { "name": "WBHarry" diff --git a/templates/characterCreation/tabs/experience.hbs b/templates/characterCreation/tabs/experience.hbs index 66363084..3eb92834 100644 --- a/templates/characterCreation/tabs/experience.hbs +++ b/templates/characterCreation/tabs/experience.hbs @@ -4,25 +4,17 @@ 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 d9bb378e..9dc61cbe 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/sheets/activeEffect/settings.hbs b/templates/sheets/activeEffect/settings.hbs index 09b78856..9307ff65 100644 --- a/templates/sheets/activeEffect/settings.hbs +++ b/templates/sheets/activeEffect/settings.hbs @@ -26,11 +26,11 @@ {{formGroup systemFields.duration.fields.type value=source.system.duration.type localize=true }} -
-
- {{formInput systemFields.duration.fields.description value=source.system.duration.description localize=true }} +
+
+ {{formInput systemFields.duration.fields.description value=source.system.duration.description localize=true }} +
-
{{formGroup fields.start.fields.time value=source.start.time localize=true }} diff --git a/templates/sheets/items/weapon/header.hbs b/templates/sheets/items/weapon/header.hbs index fabbb07f..9bbd9511 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.full"}}

+

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

{{else}} -

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

+

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

{{/if}}

{{localize (concat 'DAGGERHEART.CONFIG.Traits.' source.system.attack.roll.trait '.short')}} diff --git a/templates/ui/tooltip/battlepoints.hbs b/templates/ui/tooltip/battlepoints.hbs index f2f42f53..9672698a 100644 --- a/templates/ui/tooltip/battlepoints.hbs +++ b/templates/ui/tooltip/battlepoints.hbs @@ -7,9 +7,9 @@ {{#each category as |grouping index|}}
{{#if grouping.nr}} - + {{else}} - + {{/if}}
{{/each}} @@ -26,7 +26,7 @@ {{else}} {{/if}} - +

{{/each}}
diff --git a/templates/ui/tooltip/weapon.hbs b/templates/ui/tooltip/weapon.hbs index 4adb9c46..a672c883 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.full"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon.full"}}{{/if}} + {{#if item.system.secondary}}{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon"}}{{/if}}
{{#with (lookup config.GENERAL.burden item.system.burden) as | burden |}}