Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0a54a47951 | |||
| 0b71504da3 | |||
| 0a7d8495c6 | |||
| 6e74582089 | |||
| 20e8713e30 | |||
| 544740b697 | |||
| 404e978377 | |||
| 4a56cdb0a4 | |||
| 48e6901b59 | |||
| 15e910424f | |||
| baba6e2986 | |||
| 6f0a04c20f |
@@ -1,3 +1,21 @@
|
|||||||
|
## 1.3.5
|
||||||
|
### Bugfixes
|
||||||
|
- Fixed a regression where spaces could suddenly change their color during measurement
|
||||||
|
|
||||||
|
## 1.3.4
|
||||||
|
### Module compatibility
|
||||||
|
- Increased compatiblility with other modules (namely Drag Ruler and Terrain Ruler are no longer incompatible)
|
||||||
|
|
||||||
|
## 1.3.3
|
||||||
|
### Bugfixes
|
||||||
|
- Speed Provider Settings are now being saved for non GM players
|
||||||
|
|
||||||
|
|
||||||
|
## 1.3.2
|
||||||
|
### Translation
|
||||||
|
- Updated japanese translation (thanks to togue)
|
||||||
|
|
||||||
|
|
||||||
## 1.3.1
|
## 1.3.1
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
- Fixed a bug where the coloring of ranges wouldn't work with the generic speed provider if the Dash Multiplier was set to 0
|
- Fixed a bug where the coloring of ranges wouldn't work with the generic speed provider if the Dash Multiplier was set to 0
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ The game systems that offer Drag Ruler integration are:
|
|||||||
- Cypher System (starting with version 1.13.0)
|
- Cypher System (starting with version 1.13.0)
|
||||||
- Pathfinder 1 (starting with version 0.77.3)
|
- Pathfinder 1 (starting with version 0.77.3)
|
||||||
- Pathfinder 2e (via the module [PF2E Drag Ruler Integration](https://foundryvtt.com/packages/pf2e-dragruler/))
|
- Pathfinder 2e (via the module [PF2E Drag Ruler Integration](https://foundryvtt.com/packages/pf2e-dragruler/))
|
||||||
|
- Tormenta20 (starting with version 1.1.37)
|
||||||
|
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@
|
|||||||
"noSettings": "This speed provider doesn't offer any configuration options.",
|
"noSettings": "This speed provider doesn't offer any configuration options.",
|
||||||
"color": {
|
"color": {
|
||||||
"name": "Color for {colorName}",
|
"name": "Color for {colorName}",
|
||||||
"hint": "The color that will be used to color square that are within {colorName} range",
|
"hint": "The color that will be used to color squares that are within {colorName} range",
|
||||||
"unreachable": {
|
"unreachable": {
|
||||||
"name": "unreachable",
|
"name": "unreachable",
|
||||||
"hint": "The color for spaces that aren't reachable by the dragged token"
|
"hint": "The color for spaces that aren't reachable by the dragged token"
|
||||||
|
|||||||
+43
-16
@@ -1,30 +1,57 @@
|
|||||||
{
|
{
|
||||||
"drag-ruler": {
|
"drag-ruler": {
|
||||||
|
"genericSpeedProvider": {
|
||||||
|
"settings": {
|
||||||
|
"dashMultiplier": {
|
||||||
|
"name": "早足の倍率",
|
||||||
|
"hint": "設定すると、移動経路の測定中に第二の色分けが追加されます。0にすると第二速度が無効になります。"
|
||||||
|
},
|
||||||
|
"speedAttribute": {
|
||||||
|
"name": "移動速度の属性値",
|
||||||
|
"hint": "コマの移動速度が定義された属性値を指定します。移動範囲表示の色分けに使用されます。"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"speeds": {
|
||||||
|
"walk": "歩き",
|
||||||
|
"dash": "早足"
|
||||||
|
}
|
||||||
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"alwaysShowSpeedForPCs": {
|
"alwaysShowSpeedForPCs": {
|
||||||
"name": "プレイヤーキャラクターの移動速度を全員に公開する",
|
"name": "プレイヤーキャラクターの移動速度を全員に公開する",
|
||||||
"hint": "有効にすると、アクターの観察者(Observer)権限を持たない人にも,移動範囲の色分けが表示されるようになります。"
|
"hint": "有効にすると、アクターの観察者(Observer)権限を持たない人にも,移動範囲の色分けが表示されるようになります。"
|
||||||
},
|
},
|
||||||
"dashMultiplier": {
|
"speedProviderSettings": {
|
||||||
"name": "早足の倍率",
|
"name": "移動速度の提供元",
|
||||||
"hint": "有効にすると、移動範囲に二つ目の色分けが追加されます。0にすると、この機能は無効になります。"
|
"hint": "ゲームシステムに固有のすべての設定をここで行います。",
|
||||||
|
"button": "移動速度の提供元設定",
|
||||||
|
"windowTitle": "移動速度の提供元設定",
|
||||||
|
"headers": {
|
||||||
|
"speedProvider": "移動速度の提供元",
|
||||||
|
"speedProviderSettings": "提供元に固有の設定"
|
||||||
},
|
},
|
||||||
"speedAttribute": {
|
"activeProvider": {
|
||||||
"name": "移動速度の属性値",
|
"name": "現在有効な提供元",
|
||||||
"hint": "コマの移動速度が定義された属性値を指定します。移動範囲表示の色分けに使用されます。"
|
"hint": "以下の設定は、現在有効な移動速度の提供元によって変化します。GMが別の提供元を選択すると、利用可能な項目が変更となる場合があります。"
|
||||||
},
|
},
|
||||||
"speedProvider": {
|
"noSettings": "この移動速度提供元には、設定オプションがありません。",
|
||||||
"name": "移動速度設定の提供元",
|
"color": {
|
||||||
"hint": "色分けに使用する速度情報の提供元を選択します。ゲームシステムやモジュールを選択すると、Drag Ruler自体が提供するものより柔軟な色分けが行える可能性があります。",
|
"name": "{colorName}の色",
|
||||||
"choices": {
|
"hint": "{colorName}の範囲に使用するセルの色を指定します。",
|
||||||
"module": "モジュール",
|
"unreachable": {
|
||||||
"native": "Drag Ruler",
|
"name": "到達不能域",
|
||||||
"system": "ゲームシステム"
|
"hint": "ドラッグしたコマが到達できない範囲の色を指定します。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"staticFirstColor": {
|
"speedProvider": {
|
||||||
"name": "一つ目の色を固定する",
|
"name": "移動速度の提供元",
|
||||||
"hint": "一つ目の移動範囲の色に、プレイヤーの色でなく固定された色を使用します。"
|
"hint": "色分けに使用する速度情報の提供元を選択します。Drag Rulerは基本機能を備えた汎用の提供元を備えており、正しく設定すればすべてのゲームシステムで動作するはずです。しかしゲームシステムやモジュールを介することで、より多くの提供元を利用することもできます。こうした提供元を利用すると、ゲームルールとの統合がさらに向上するかもしれません。以下のオプションは、ここで選択した提供元によって変化します。",
|
||||||
|
"choices": {
|
||||||
|
"module": "モジュール {name}",
|
||||||
|
"native": "汎用",
|
||||||
|
"system": "システム {name}"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"swapSpacebarRightClick": {
|
"swapSpacebarRightClick": {
|
||||||
"name": "スペースキーと右クリックを入れ替える",
|
"name": "スペースキーと右クリックを入れ替える",
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
"name": "drag-ruler",
|
"name": "drag-ruler",
|
||||||
"title": "Drag Ruler",
|
"title": "Drag Ruler",
|
||||||
"description": "When dragging a token displays a ruler showing how far you've moved that token.",
|
"description": "When dragging a token displays a ruler showing how far you've moved that token.",
|
||||||
"version": "1.3.1",
|
"version": "1.3.5",
|
||||||
"minimumCoreVersion" : "0.7.9",
|
"minimumCoreVersion" : "0.7.9",
|
||||||
"compatibleCoreVersion" : "0.7.9",
|
"compatibleCoreVersion" : "0.7.9",
|
||||||
"authors": [
|
"authors": [
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"url": "https://github.com/manuelVo/foundryvtt-drag-ruler",
|
"url": "https://github.com/manuelVo/foundryvtt-drag-ruler",
|
||||||
"download": "https://github.com/manuelVo/foundryvtt-drag-ruler/archive/v1.3.1.zip",
|
"download": "https://github.com/manuelVo/foundryvtt-drag-ruler/archive/v1.3.5.zip",
|
||||||
"manifest": "https://raw.githubusercontent.com/manuelVo/foundryvtt-drag-ruler/master/module.json",
|
"manifest": "https://raw.githubusercontent.com/manuelVo/foundryvtt-drag-ruler/master/module.json",
|
||||||
"readme": "https://github.com/manuelVo/foundryvtt-drag-ruler/blob/master/README.md",
|
"readme": "https://github.com/manuelVo/foundryvtt-drag-ruler/blob/master/README.md",
|
||||||
"changelog": "https://github.com/manuelVo/foundryvtt-drag-ruler/blob/master/CHANGELOG.md",
|
"changelog": "https://github.com/manuelVo/foundryvtt-drag-ruler/blob/master/CHANGELOG.md",
|
||||||
|
|||||||
+41
-1
@@ -166,7 +166,7 @@ export function measure(destination, {gridSpaces=true, snap=false} = {}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Highlight grid positions
|
// Highlight grid positions
|
||||||
this._highlightMeasurement(ray, s.startDistance);
|
highlightMeasurementNative.call(this, ray, s.startDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw endpoints
|
// Draw endpoints
|
||||||
@@ -177,3 +177,43 @@ export function measure(destination, {gridSpaces=true, snap=false} = {}) {
|
|||||||
// Return the measured segments
|
// Return the measured segments
|
||||||
return segments;
|
return segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function highlightMeasurementNative(ray, startDistance) {
|
||||||
|
const spacer = canvas.scene.data.gridType === CONST.GRID_TYPES.SQUARE ? 1.41 : 1;
|
||||||
|
const nMax = Math.max(Math.floor(ray.distance / (spacer * Math.min(canvas.grid.w, canvas.grid.h))), 1);
|
||||||
|
const tMax = Array.fromRange(nMax+1).map(t => t / nMax);
|
||||||
|
|
||||||
|
// Track prior position
|
||||||
|
let prior = null;
|
||||||
|
|
||||||
|
// Iterate over ray portions
|
||||||
|
for ( let [i, t] of tMax.entries() ) {
|
||||||
|
let {x, y} = ray.project(t);
|
||||||
|
|
||||||
|
// Get grid position
|
||||||
|
let [x0, y0] = (i === 0) ? [null, null] : prior;
|
||||||
|
let [x1, y1] = canvas.grid.grid.getGridPositionFromPixels(x, y);
|
||||||
|
if ( x0 === x1 && y0 === y1 ) continue;
|
||||||
|
|
||||||
|
// Highlight the grid position
|
||||||
|
let [xg, yg] = canvas.grid.grid.getPixelsFromGridPosition(x1, y1);
|
||||||
|
let subDistance = canvas.grid.measureDistances([{ray: new Ray(ray.A, {x: xg, y: yg})}], {gridSpaces: true})[0]
|
||||||
|
let color = dragRuler.getColorForDistance.call(this, startDistance, subDistance)
|
||||||
|
canvas.grid.highlightPosition(this.name, {x: xg, y: yg, color: color});
|
||||||
|
|
||||||
|
// Skip the first one
|
||||||
|
prior = [x1, y1];
|
||||||
|
if ( i === 0 ) continue;
|
||||||
|
|
||||||
|
// If the positions are not neighbors, also highlight their halfway point
|
||||||
|
if ( !canvas.grid.isNeighbor(x0, y0, x1, y1) ) {
|
||||||
|
let th = tMax[i - 1] + (0.5 / nMax);
|
||||||
|
let {x, y} = ray.project(th);
|
||||||
|
let [x1h, y1h] = canvas.grid.grid.getGridPositionFromPixels(x, y);
|
||||||
|
let [xgh, ygh] = canvas.grid.grid.getPixelsFromGridPosition(x1h, y1h);
|
||||||
|
subDistance = canvas.grid.measureDistances([{ray: new Ray(ray.A, {x: xgh, y: ygh})}], {gridSpaces: true})[0]
|
||||||
|
color = dragRuler.getColorForDistance.call(this, startDistance, subDistance)
|
||||||
|
canvas.grid.highlightPosition(this.name, {x: xgh, y: ygh, color: color});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
-25
@@ -13,7 +13,6 @@ Hooks.once("init", () => {
|
|||||||
hookTokenDragHandlers()
|
hookTokenDragHandlers()
|
||||||
hookRulerFunctions()
|
hookRulerFunctions()
|
||||||
hookKeyboardManagerFunctions()
|
hookKeyboardManagerFunctions()
|
||||||
patchRulerHighlightMeasurement()
|
|
||||||
|
|
||||||
window.dragRuler = {
|
window.dragRuler = {
|
||||||
getColorForDistance,
|
getColorForDistance,
|
||||||
@@ -238,11 +237,6 @@ function deleteWaypoint() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function strInsertAfter(haystack, needle, strToInsert) {
|
|
||||||
const pos = haystack.indexOf(needle) + needle.length
|
|
||||||
return haystack.slice(0, pos) + strToInsert + haystack.slice(pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getColorForDistance(startDistance, subDistance=0) {
|
export function getColorForDistance(startDistance, subDistance=0) {
|
||||||
if (!this.isDragRuler)
|
if (!this.isDragRuler)
|
||||||
return this.color
|
return this.color
|
||||||
@@ -263,22 +257,3 @@ export function getColorForDistance(startDistance, subDistance=0) {
|
|||||||
}, {range: Infinity, color: getUnreachableColorFromSpeedProvider()})
|
}, {range: Infinity, color: getUnreachableColorFromSpeedProvider()})
|
||||||
return currentRange.color
|
return currentRange.color
|
||||||
}
|
}
|
||||||
|
|
||||||
// These patches were written with foundry-0.7.9.js as reference
|
|
||||||
function patchRulerHighlightMeasurement() {
|
|
||||||
let code = Ruler.prototype._highlightMeasurement.toString()
|
|
||||||
// Replace CRLF with LF in case foundry.js has CRLF for some reason
|
|
||||||
code = code.replace(/\r\n/g, "\n")
|
|
||||||
// Remove function signature and closing curly bracket (those are on the first and last line)
|
|
||||||
code = code.slice(code.indexOf("\n"), code.lastIndexOf("\n"))
|
|
||||||
|
|
||||||
const calcColorCode = `
|
|
||||||
let subDistance = canvas.grid.measureDistances([{ray: new Ray(ray.A, {x: xg, y: yg})}], {gridSpaces: true})[0]
|
|
||||||
let color = dragRuler.getColorForDistance.call(this, startDistance, subDistance)
|
|
||||||
`
|
|
||||||
|
|
||||||
code = strInsertAfter(code, "Position(x1, y1);\n", calcColorCode)
|
|
||||||
code = strInsertAfter(code, "Position(x1h, y1h);\n", calcColorCode.replace("x: xg, y: yg", "x: xgh, y: ygh"))
|
|
||||||
code = code.replace(/color: this\.color\}/g, "color}")
|
|
||||||
Ruler.prototype._highlightMeasurement = new Function("ray", "startDistance=undefined", code)
|
|
||||||
}
|
|
||||||
|
|||||||
+2
-1
@@ -111,6 +111,7 @@ class SpeedProviderSettings extends FormApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _updateObject(event, formData) {
|
async _updateObject(event, formData) {
|
||||||
|
const selectedSpeedProvider = game.user.isGM ? formData.speedProvider : game.settings.get(settingsKey, "speedProvider")
|
||||||
for (let [key, value] of Object.entries(formData)) {
|
for (let [key, value] of Object.entries(formData)) {
|
||||||
// Check if this is color, convert the value to an integer
|
// Check if this is color, convert the value to an integer
|
||||||
const splitKey = key.split(".", 3)
|
const splitKey = key.split(".", 3)
|
||||||
@@ -121,7 +122,7 @@ class SpeedProviderSettings extends FormApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't change settings for speed providers that aren't currently active
|
// Don't change settings for speed providers that aren't currently active
|
||||||
if (key !== "speedProvider" && !key.startsWith(formData.speedProvider))
|
if (key !== "speedProvider" && !key.startsWith(selectedSpeedProvider))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
// Get the key for the current setting
|
// Get the key for the current setting
|
||||||
|
|||||||
Reference in New Issue
Block a user