diff --git a/lang/en.json b/lang/en.json index 0051a806..b63a3aac 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2446,7 +2446,13 @@ "resetConfirmationText": "Are you sure you want to reset the {settings}?" }, "Scene": { - "rangeMeasurementOverride": "Override Global Range Measurement Settings" + "FIELDS": { + "rangeMeasurement": { + "setting": { "label": "Setting" } + } + }, + "disabledText": "Daggerheart Measurements are disabled in System Settings - Variant Rules", + "rangeMeasurement": "Range Measurement" } }, "UI": { diff --git a/module/applications/scene/sceneConfigSettings.mjs b/module/applications/scene/sceneConfigSettings.mjs index 40f66ae2..be8f7b71 100644 --- a/module/applications/scene/sceneConfigSettings.mjs +++ b/module/applications/scene/sceneConfigSettings.mjs @@ -1,11 +1,17 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.SceneConfig { - constructor(options, ...args) { - super(options, ...args); - } + // static DEFAULT_OPTIONS = { + // ...super.DEFAULT_OPTIONS, + // form: { + // handler: this.updateData, + // closeOnSubmit: true + // } + // }; static buildParts() { - const { footer, ...parts } = super.PARTS; + const { footer, tabs, ...parts } = super.PARTS; const tmpParts = { + // tabs, + tabs: { template: 'systems/daggerheart/templates/scene/tabs.hbs' }, ...parts, dh: { template: 'systems/daggerheart/templates/scene/dh-config.hbs' }, footer @@ -16,9 +22,42 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S static PARTS = DhSceneConfigSettings.buildParts(); static buildTabs() { - super.TABS.sheet.tabs.push({ id: 'dh', icon: 'fa-solid' }); + super.TABS.sheet.tabs.push({ id: 'dh', src: 'systems/daggerheart/assets/logos/FoundryBorneLogoWhite.svg' }); return super.TABS; } static TABS = DhSceneConfigSettings.buildTabs(); + + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + switch (partId) { + case 'dh': + htmlElement.querySelector('#rangeMeasurementSetting')?.addEventListener('change', async event => { + const flagData = foundry.utils.mergeObject(this.document.flags.daggerheart, { + rangeMeasurement: { setting: event.target.value } + }); + this.document.flags.daggerheart = flagData; + this.render(); + }); + break; + } + } + + /** @inheritDoc */ + async _preparePartContext(partId, context, options) { + context = await super._preparePartContext(partId, context, options); + switch (partId) { + case 'dh': + context.data = new game.system.api.data.scenes.DHScene(canvas.scene.flags.daggerheart); + context.variantRules = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules); + break; + } + + return context; + } + + // static async updateData(event, _, formData) { + // const data = foundry.utils.expandObject(formData.object); + // this.close(data); + // } } diff --git a/module/canvas/placeables/measuredTemplate.mjs b/module/canvas/placeables/measuredTemplate.mjs index f3691bb8..fa91fa9f 100644 --- a/module/canvas/placeables/measuredTemplate.mjs +++ b/module/canvas/placeables/measuredTemplate.mjs @@ -18,30 +18,37 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur static getRangeLabels(distanceValue, settings) { let result = { distance: distanceValue, units: '' }; - const rangeMeasurementOverride = canvas.scene.flags.daggerheart?.rangeMeasurementOverride; + const sceneRangeMeasurement = canvas.scene.flags.daggerheart?.rangeMeasurement; - if (rangeMeasurementOverride === true) { + const { disable, custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting; + if (sceneRangeMeasurement.setting === disable.id) { result.distance = distanceValue; result.units = canvas.scene?.grid?.units; return result; } - if (distanceValue <= settings.melee) { + + const melee = sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.melee : settings.melee; + const veryClose = + sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.veryClose : settings.veryClose; + const close = sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.close : settings.close; + const far = sceneRangeMeasurement.setting === custom.id ? sceneRangeMeasurement.far : settings.far; + if (distanceValue <= melee) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.melee.name'); return result; } - if (distanceValue <= settings.veryClose) { + if (distanceValue <= veryClose) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryClose.name'); return result; } - if (distanceValue <= settings.close) { + if (distanceValue <= close) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.close.name'); return result; } - if (distanceValue <= settings.far) { + if (distanceValue <= far) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name'); return result; } - if (distanceValue > settings.far) { + if (distanceValue > far) { result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name'); } diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index bcd6ad4d..6ecc76e6 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -685,3 +685,18 @@ export const countdownAppMode = { textIcon: 'text-icon', iconOnly: 'icon-only' }; + +export const sceneRangeMeasurementSetting = { + disable: { + id: 'disable', + label: 'Disable Daggerheart Range Measurement' + }, + default: { + id: 'default', + label: 'Default' + }, + custom: { + id: 'custom', + label: 'Custom' + } +}; diff --git a/module/data/_module.mjs b/module/data/_module.mjs index eacade96..2749bfce 100644 --- a/module/data/_module.mjs +++ b/module/data/_module.mjs @@ -8,3 +8,4 @@ export * as actors from './actor/_module.mjs'; export * as chatMessages from './chat-message/_modules.mjs'; export * as fields from './fields/_module.mjs'; export * as items from './item/_module.mjs'; +export * as scenes from './scene/_module.mjs'; diff --git a/module/data/scene/_module.mjs b/module/data/scene/_module.mjs new file mode 100644 index 00000000..9994901b --- /dev/null +++ b/module/data/scene/_module.mjs @@ -0,0 +1 @@ +export { default as DHScene } from './scene.mjs'; diff --git a/module/data/scene/scene.mjs b/module/data/scene/scene.mjs new file mode 100644 index 00000000..7cf74ade --- /dev/null +++ b/module/data/scene/scene.mjs @@ -0,0 +1,19 @@ +export default class DHScene extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + + return { + rangeMeasurement: new fields.SchemaField({ + setting: new fields.StringField({ + choices: CONFIG.DH.GENERAL.sceneRangeMeasurementSetting, + initial: CONFIG.DH.GENERAL.sceneRangeMeasurementSetting.default.id, + label: 'DAGGERHEART.SETTINGS.Scene.FIELDS.rangeMeasurement.setting.label' + }), + melee: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.melee.name' }), + veryClose: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.veryClose.name' }), + close: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.close.name' }), + far: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.far.name' }) + }) + }; + } +} diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index 582c9c29..2bf820c1 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -7,6 +7,7 @@ export const preloadHandlebarsTemplates = async function () { 'daggerheart.inventory-item': 'systems/daggerheart/templates/sheets/global/partials/inventory-item-V2.hbs' }); return foundry.applications.handlebars.loadTemplates([ + 'templates/generic/tab-navigation.hbs', 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs', 'systems/daggerheart/templates/sheets/global/partials/action-item.hbs', 'systems/daggerheart/templates/sheets/global/partials/domain-card-item.hbs', diff --git a/styles/less/dialog/character-creation/selections-container.less b/styles/less/dialog/character-creation/selections-container.less index 3b93313a..1de3d870 100644 --- a/styles/less/dialog/character-creation/selections-container.less +++ b/styles/less/dialog/character-creation/selections-container.less @@ -448,7 +448,7 @@ white-space: nowrap; border: 1px solid light-dark(@dark-blue, @golden); border-radius: 6px; - color: light-dark(@beige, @dark); + color: @dark; background-image: url('../assets/parchments/dh-parchment-light.png'); padding: 0 2px; } diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index 5d6e97d1..79deb99d 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -801,7 +801,7 @@ padding: 10px 0; text-align: center; font-size: var(--font-size-16); - color: light-dark(@beige, @dark); + color: @dark; background-image: url(../assets/parchments/dh-parchment-light.png); border-radius: 0 0 4px 4px; } @@ -834,7 +834,7 @@ font-variant: small-caps; text-align: center; font-style: italic; - color: light-dark(@dark-blue-60, @beige-80); + color: light-dark(@dark-blue, @beige-80); } } } diff --git a/styles/less/ui/index.less b/styles/less/ui/index.less index 1713ae3e..743d16ae 100644 --- a/styles/less/ui/index.less +++ b/styles/less/ui/index.less @@ -29,3 +29,5 @@ @import './sidebar/tabs.less'; @import './sidebar/daggerheartMenu.less'; + +@import './scene-config/scene-config.less'; diff --git a/styles/less/ui/scene-config/scene-config.less b/styles/less/ui/scene-config/scene-config.less new file mode 100644 index 00000000..fb36dd33 --- /dev/null +++ b/styles/less/ui/scene-config/scene-config.less @@ -0,0 +1,40 @@ +.theme-light .application.sheet.scene-config { + .sheet-tabs.tabs a[data-tab='dh'] { + &.active img, + &:hover img { + filter: @grey-filter drop-shadow(0 0 4px var(--color-shadow-primary)); + } + + img { + filter: @grey-filter; + } + } +} + +.application.sheet.scene-config { + .sheet-tabs.tabs { + a[data-tab='dh'] { + display: flex; + align-items: center; + gap: 4px; + + &.active, + &:hover { + img { + filter: @beige-filter drop-shadow(0 0 4px var(--color-shadow-primary)); + } + } + + img { + width: 18px; + position: relative; + top: -3px; + filter: @beige-filter; + } + } + } + + .helper-text { + font-style: italic; + } +} diff --git a/styles/less/ui/sidebar/tabs.less b/styles/less/ui/sidebar/tabs.less index 073d3ef3..91bf0d23 100644 --- a/styles/less/ui/sidebar/tabs.less +++ b/styles/less/ui/sidebar/tabs.less @@ -1,3 +1,9 @@ +.theme-light #interface #ui-right #sidebar { + menu li button img { + filter: @grey-filter; + } +} + #interface #ui-right #sidebar { menu li button { img { diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less index 543511da..6fcf6db2 100755 --- a/styles/less/utils/colors.less +++ b/styles/less/utils/colors.less @@ -58,6 +58,8 @@ @dark-80: #22222280; @dark-filter: brightness(0) saturate(100%); +@grey-filter: brightness(15%) saturate(20%); + @deep-black: #0e0d15; @beige: #efe6d8; diff --git a/templates/scene/dh-config.hbs b/templates/scene/dh-config.hbs index 0d20c302..1f7dcd81 100644 --- a/templates/scene/dh-config.hbs +++ b/templates/scene/dh-config.hbs @@ -1,9 +1,24 @@