import {buildCostFunction} from "./api.js"; import {settingsKey} from "./settings.js"; import {highlightTokenShape} from "./util.js"; export function getHexSizeSupportTokenGridCenter(token) { const tokenCenterOffset = CONFIG.hexSizeSupport.getCenterOffset(token) return {x: token.x + tokenCenterOffset.x, y: token.y + tokenCenterOffset.y} } export function highlightMeasurementTerrainRuler(ray, startDistance, tokenShape=[{x: 0, y: 0}], alpha=1) { for (const space of ray.terrainRulerVisitedSpaces.reverse()) { const color = this.dragRulerGetColorForDistance(startDistance + space.distance); highlightTokenShape.call(this, space, tokenShape, color, alpha) } } export function measureDistances(segments, entity, shape, options={}) { const opts = duplicate(options) if (canvas.grid.diagonalRule === "EUCL") { opts.ignoreGrid = true; opts.gridSpaes = false; } if (opts.enableTerrainRuler) { opts.gridSpaces = true; const firstNewSegmentIndex = segments.findIndex(segment => !segment.ray.dragRulerVisitedSpaces); const previousSegments = segments.slice(0, firstNewSegmentIndex); const newSegments = segments.slice(firstNewSegmentIndex); const distances = previousSegments.map(segment => segment.ray.dragRulerVisitedSpaces[segment.ray.dragRulerVisitedSpaces.length - 1].distance); previousSegments.forEach(segment => segment.ray.terrainRulerVisitedSpaces = duplicate(segment.ray.dragRulerVisitedSpaces)); opts.costFunction = buildCostFunction(entity, shape); if (previousSegments.length > 0) opts.terrainRulerInitialState = previousSegments[previousSegments.length - 1].ray.dragRulerFinalState; return distances.concat(terrainRuler.measureDistances(newSegments, opts)); } else { // If another module wants to enable grid measurements but disable grid highlighting, // manually set the *duplicate* option's gridSpaces value to true for the Foundry logic to work properly if(!opts.ignoreGrid) { opts.gridSpaces = true; } return canvas.grid.measureDistances(segments, opts); } } export function checkDependencies() { if (!game.modules.get("socketlib")?.active) { console.error("Drag Ruler | The `socketlib` module isn't enabled, but it's required for Drag Ruler to operate properly."); if (game.user.isGM) { new Dialog({ title: game.i18n.localize("drag-ruler.dependencies.socketlib.title"), content: `
${game.i18n.localize("drag-ruler.dependencies.socketlib.text")}
`, buttons: { ok: { icon: '', label: game.i18n.localize("drag-ruler.dependencies.ok") } }, }).render(true); } } else if (!game.modules.get("terrain-ruler")?.active && game.user.isGM && !game.settings.get(settingsKey, "neverShowTerrainRulerHint")) { const lastHint = game.settings.get(settingsKey, "lastTerrainRulerHintTime"); if (Date.now() - lastHint > 604800000) { // One week let enabledTerrainModule; if (game.modules.get("enhanced-terrain-layer")?.active) { enabledTerrainModule = game.modules.get("enhanced-terrain-layer").data.title; } if (enabledTerrainModule) { new Dialog({ title: game.i18n.localize("drag-ruler.dependencies.terrain-ruler.title"), content: `${game.i18n.format("drag-ruler.dependencies.terrain-ruler.text", {moduleName: enabledTerrainModule})}
`, buttons: { ok: { icon: '', label: game.i18n.localize("drag-ruler.dependencies.ok"), callback: () => game.settings.set(settingsKey, "lastTerrainRulerHintTime", Date.now()), }, neverShowAgain: { icon: '', label: game.i18n.localize("drag-ruler.dependencies.terrain-ruler.neverShowAgain"), callback: () => game.settings.set(settingsKey, "neverShowTerrainRulerHint", true), } }, close: () => game.settings.set(settingsKey, "lastTerrainRulerHintTime", Date.now()) }).render(true); } } } }