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/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/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/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/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 |}}