diff --git a/lang/en.json b/lang/en.json index 0186ae3e..e358977f 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2405,14 +2405,6 @@ "hideAttribution": { "label": "Hide Attribution" }, - "showTokenDistance": { - "label": "Show Token Distance on Hover", - "choices": { - "always": "Always", - "encounters": "Encounters", - "never": "Never" - } - }, "expandedTitle": "Auto-expand Descriptions", "extendCharacterDescriptions": { "label": "Characters" diff --git a/module/applications/settings/homebrewSettings.mjs b/module/applications/settings/homebrewSettings.mjs index add3c9e1..6e2e665d 100644 --- a/module/applications/settings/homebrewSettings.mjs +++ b/module/applications/settings/homebrewSettings.mjs @@ -165,8 +165,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli name: game.i18n.localize('DAGGERHEART.SETTINGS.Homebrew.newDowntimeMove'), img: 'icons/magic/life/cross-worn-green.webp', description: '', - actions: [], - effects: [] + actions: [] } }); } else if (['armorFeatures', 'weaponFeatures'].includes(type)) { diff --git a/module/canvas/placeables/measuredTemplate.mjs b/module/canvas/placeables/measuredTemplate.mjs index e1ea79f5..ef7d284b 100644 --- a/module/canvas/placeables/measuredTemplate.mjs +++ b/module/canvas/placeables/measuredTemplate.mjs @@ -18,9 +18,8 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur static getRangeLabels(distanceValue, settings) { let result = { distance: distanceValue, units: '' }; - if (!settings.enabled) return result; - const sceneRangeMeasurement = canvas.scene.flags.daggerheart?.rangeMeasurement; + const { disable, custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting; if (sceneRangeMeasurement?.setting === disable.id) { result.distance = distanceValue; @@ -28,9 +27,31 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur return result; } - const ranges = sceneRangeMeasurement?.setting === custom.id ? sceneRangeMeasurement : settings; - const distanceKey = ['melee', 'veryClose', 'close', 'far'].find(r => ranges[r] >= distanceValue); - result.distance = game.i18n.localize(`DAGGERHEART.CONFIG.Range.${distanceKey ?? 'veryFar'}.name`); + 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 <= veryClose) { + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryClose.name'); + return result; + } + if (distanceValue <= close) { + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.close.name'); + return result; + } + if (distanceValue <= far) { + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name'); + return result; + } + if (distanceValue > far) { + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name'); + } + return result; } } diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index bc5c2a01..2266d0da 100644 --- a/module/canvas/placeables/token.mjs +++ b/module/canvas/placeables/token.mjs @@ -1,5 +1,3 @@ -import DhMeasuredTemplate from "./measuredTemplate.mjs"; - export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { /** @inheritdoc */ async _draw(options) { @@ -80,60 +78,6 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { return canvas.grid.measurePath([adjustedOriginPoint, adjustDestinationPoint]).distance; } - _onHoverIn(event, options) { - super._onHoverIn(event, options); - - // Check if the setting is enabled - const setting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance).showTokenDistance; - if (setting === "never" || (setting === "encounters" && !game.combat?.started)) return; - - // Check if this token isn't invisible and is actually being hovered - const isTokenValid = - this.visible && - this.hover && - !this.isPreview && - !this.document.isSecret && - !this.controlled && - !this.animation; - if (!isTokenValid) return; - - // Ensure we have a single controlled token - const originToken = canvas.tokens.controlled[0]; - if (!originToken || canvas.tokens.controlled.length > 1) return; - - // Determine the actual range - const ranges = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement; - const distanceNum = originToken.distanceTo(this); - const distanceResult = DhMeasuredTemplate.getRangeLabels(distanceNum, ranges); - const distanceLabel = `${distanceResult.distance} ${distanceResult.units}`.trim(); - - // Create the element - const element = document.createElement('div'); - element.id = 'token-hover-distance'; - element.classList.add('waypoint-label', 'last'); - const ruler = document.createElement('i'); - ruler.classList.add('fa-solid', 'fa-ruler'); - element.appendChild(ruler); - const labelEl = document.createElement('span'); - labelEl.classList.add('total-measurement'); - labelEl.textContent = distanceLabel; - element.appendChild(labelEl); - - // Position the element and add to the DOM - const center = this.getCenterPoint(); - element.style.setProperty('--transformY', 'calc(-100% - 10px)'); - element.style.setProperty('--position-y', `${this.y}px`); - element.style.setProperty('--position-x', `${center.x}px`); - element.style.setProperty('--ui-scale', String(canvas.dimensions.uiScale)); - document.querySelector('#token-hover-distance')?.remove(); - document.querySelector('#measurement').appendChild(element); - } - - _onHoverOut(...args) { - super._onHoverOut(...args); - document.querySelector('#token-hover-distance')?.remove(); - } - /** Returns the point at which a line starting at origin and ending at destination intersects the edge of the bounds */ #getEdgeBoundary(bounds, originPoint, destinationPoint) { const points = [ diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index ae49c73e..be1dfce1 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -252,8 +252,7 @@ export const defaultRestOptions = { ] } } - }, - effects: [] + } }, clearStress: { id: 'clearStress', @@ -286,8 +285,7 @@ export const defaultRestOptions = { ] } } - }, - effects: [] + } }, repairArmor: { id: 'repairArmor', @@ -320,8 +318,7 @@ export const defaultRestOptions = { ] } } - }, - effects: [] + } }, prepare: { id: 'prepare', @@ -329,8 +326,7 @@ export const defaultRestOptions = { icon: 'fa-solid fa-dumbbell', img: 'icons/skills/trades/academics-merchant-scribe.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.shortRest.prepare.description'), - actions: {}, - effects: [] + actions: {} } }), longRest: () => ({ @@ -365,8 +361,7 @@ export const defaultRestOptions = { ] } } - }, - effects: [] + } }, clearStress: { id: 'clearStress', @@ -399,8 +394,7 @@ export const defaultRestOptions = { ] } } - }, - effects: [] + } }, repairArmor: { id: 'repairArmor', @@ -433,8 +427,7 @@ export const defaultRestOptions = { ] } } - }, - effects: [] + } }, prepare: { id: 'prepare', @@ -442,8 +435,7 @@ export const defaultRestOptions = { icon: 'fa-solid fa-dumbbell', img: 'icons/skills/trades/academics-merchant-scribe.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.prepare.description'), - actions: {}, - effects: [] + actions: {} }, workOnAProject: { id: 'workOnAProject', @@ -451,8 +443,7 @@ export const defaultRestOptions = { icon: 'fa-solid fa-diagram-project', img: 'icons/skills/social/thumbsup-approval-like.webp', description: game.i18n.localize('DAGGERHEART.APPLICATIONS.Downtime.longRest.workOnAProject.description'), - actions: {}, - effects: [] + actions: {} } }) }; diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index e843027b..115e6463 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -114,24 +114,9 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * Return Item the action is attached too. */ get item() { - if (!this.parent.parent && this.systemPath) - return foundry.utils.getProperty(this.parent, this.systemPath).get(this.id); - return this.parent.parent; } - get applyEffects() { - if (this.item.systemPath) { - const itemEffectIds = this.item.effects.map(x => x._id); - const movePathSplit = this.item.systemPath.split('.'); - movePathSplit.pop(); - const move = foundry.utils.getProperty(this.parent, movePathSplit.join('.')); - return new Collection(itemEffectIds.map(id => [id, move.effects.find(x => x.id === id)])); - } - - return this.item.effects; - } - /** * Return the first Actor parent found. */ @@ -140,7 +125,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel ? this.item : this.item?.parent instanceof DhpActor ? this.item.parent - : null; + : this.item?.actor; } static getRollType(parent) { diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 8af4c74c..bf6e83c0 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -41,8 +41,7 @@ export default class DhCharacter extends BaseDataActor { min: 0, integer: true, label: 'DAGGERHEART.GENERAL.hope' - }), - isReversed: new fields.BooleanField({ initial: false }) + }) }) }), traits: new fields.SchemaField({ diff --git a/module/data/fields/action/effectsField.mjs b/module/data/fields/action/effectsField.mjs index 6afd470b..2233a383 100644 --- a/module/data/fields/action/effectsField.mjs +++ b/module/data/fields/action/effectsField.mjs @@ -73,7 +73,7 @@ export default class EffectsField extends fields.ArrayField { }); effects.forEach(async e => { - const effect = (this.item.applyEffects ?? this.item.effects).get(e._id); + const effect = this.item.effects.get(e._id); if (!token.actor || !effect) return; await EffectsField.applyEffect(effect, token.actor); }); @@ -96,7 +96,7 @@ export default class EffectsField extends fields.ArrayField { content: await foundry.applications.handlebars.renderTemplate( 'systems/daggerheart/templates/ui/chat/effectSummary.hbs', { - effects: this.effects.map(e => (this.item.applyEffects ?? this.item.effects).get(e._id)), + effects: this.effects.map(e => this.item.effects.get(e._id)), targets: messageTargets } ) @@ -123,7 +123,7 @@ export default class EffectsField extends fields.ArrayField { // Otherwise, create a new effect on the target const effectData = foundry.utils.mergeObject({ - ...(effect.toObject?.() ?? effect), + ...effect.toObject(), disabled: false, transfer: false, origin: effect.uuid diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index 9c006beb..0d71ab86 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -152,7 +152,6 @@ export function ActionMixin(Base) { } get uuid() { - if (!(this.item instanceof game.system.api.documents.DHItem)) return null; return `${this.item.uuid}.${this.documentName}.${this.id}`; } diff --git a/module/data/settings/Appearance.mjs b/module/data/settings/Appearance.mjs index d7a638d7..2b8d3b27 100644 --- a/module/data/settings/Appearance.mjs +++ b/module/data/settings/Appearance.mjs @@ -42,25 +42,6 @@ export default class DhAppearance extends foundry.abstract.DataModel { damage: new BooleanField(), target: new BooleanField() }), - showTokenDistance: new StringField({ - required: true, - choices: { - always: { - value: 'always', - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.showTokenDistance.choices.always' - }, - encounters: { - value: 'encounters', - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.showTokenDistance.choices.encounters' - }, - never: { - value: 'never', - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.showTokenDistance.choices.never' - } - }, - nullable: false, - initial: 'always' - }), hideAttribution: new BooleanField(), showGenericStatusEffects: new BooleanField({ initial: true }) }; diff --git a/module/data/settings/Homebrew.mjs b/module/data/settings/Homebrew.mjs index b8804fa7..0138713c 100644 --- a/module/data/settings/Homebrew.mjs +++ b/module/data/settings/Homebrew.mjs @@ -12,20 +12,6 @@ const currencyField = (initial, label, icon) => icon: new foundry.data.fields.StringField({ required: true, nullable: false, blank: true, initial: icon }) }); -const restMoveField = () => - new foundry.data.fields.SchemaField({ - name: new foundry.data.fields.StringField({ required: true }), - icon: new foundry.data.fields.StringField({ required: true }), - img: new foundry.data.fields.FilePathField({ - initial: 'icons/magic/life/cross-worn-green.webp', - categories: ['IMAGE'], - base64: false - }), - description: new foundry.data.fields.HTMLField(), - actions: new ActionsField(), - effects: new foundry.data.fields.ArrayField(new foundry.data.fields.ObjectField()) - }); - export default class DhHomebrew extends foundry.abstract.DataModel { static defineSchema() { const fields = foundry.data.fields; @@ -119,11 +105,37 @@ export default class DhHomebrew extends foundry.abstract.DataModel { restMoves: new fields.SchemaField({ longRest: new fields.SchemaField({ nrChoices: new fields.NumberField({ required: true, integer: true, min: 1, initial: 2 }), - moves: new fields.TypedObjectField(restMoveField(), { initial: defaultRestOptions.longRest() }) + moves: new fields.TypedObjectField( + new fields.SchemaField({ + name: new fields.StringField({ required: true }), + icon: new fields.StringField({ required: true }), + img: new fields.FilePathField({ + initial: 'icons/magic/life/cross-worn-green.webp', + categories: ['IMAGE'], + base64: false + }), + description: new fields.HTMLField(), + actions: new ActionsField() + }), + { initial: defaultRestOptions.longRest() } + ) }), shortRest: new fields.SchemaField({ nrChoices: new fields.NumberField({ required: true, integer: true, min: 1, initial: 2 }), - moves: new fields.TypedObjectField(restMoveField(), { initial: defaultRestOptions.shortRest() }) + moves: new fields.TypedObjectField( + new fields.SchemaField({ + name: new fields.StringField({ required: true }), + icon: new fields.StringField({ required: true }), + img: new fields.FilePathField({ + initial: 'icons/magic/life/cross-worn-green.webp', + categories: ['IMAGE'], + base64: false + }), + description: new fields.HTMLField(), + actions: new ActionsField() + }), + { initial: defaultRestOptions.shortRest() } + ) }) }), domains: new fields.TypedObjectField( diff --git a/module/documents/token.mjs b/module/documents/token.mjs index b9507c2f..317f3acf 100644 --- a/module/documents/token.mjs +++ b/module/documents/token.mjs @@ -269,7 +269,7 @@ export default class DHToken extends CONFIG.Token.documentClass { // Hexagon symmetry if (columns) { - const rowData = DHToken.#getHexagonalShape(height, width, shape, false); + const rowData = BaseToken.#getHexagonalShape(height, width, shape, false); if (!rowData) return null; // Transpose the offsets/points of the shape in row orientation diff --git a/module/enrichers/TemplateEnricher.mjs b/module/enrichers/TemplateEnricher.mjs index 4bc8fdeb..4b9b052e 100644 --- a/module/enrichers/TemplateEnricher.mjs +++ b/module/enrichers/TemplateEnricher.mjs @@ -4,7 +4,6 @@ export default function DhTemplateEnricher(match, _options) { const params = parseInlineParams(match[1]); const { type, angle = CONFIG.MeasuredTemplate.defaults.angle, inline = false } = params; const direction = Number(params.direction) || 0; - params.range = params.range?.toLowerCase(); const range = params.range && Number.isNaN(Number(params.range)) ? Object.values(CONFIG.DH.GENERAL.templateRanges).find( diff --git a/system.json b/system.json index 90ebf11d..4a5eee0f 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "1.6.2", + "version": "1.6.1", "compatibility": { "minimum": "13.346", "verified": "13.351", diff --git a/templates/settings/appearance-settings/main.hbs b/templates/settings/appearance-settings/main.hbs index 32dd9e63..75a7e634 100644 --- a/templates/settings/appearance-settings/main.hbs +++ b/templates/settings/appearance-settings/main.hbs @@ -16,10 +16,6 @@ value=setting.showGenericStatusEffects localize=true}} {{formGroup - fields.showTokenDistance - value=setting.showTokenDistance - localize=true}} - {{formGroup fields.hideAttribution value=setting.hideAttribution localize=true}}