diff --git a/Changelog.md b/Changelog.md index 782e3e5..cc7f9bc 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,10 @@ +# 0.10.9 +Additional fix for 5-10-5 using 10-5-10 (the offset distance was not fixed previously). Closes #195, #196. +If the movement cost is rounded to 0, don't display the label. Closes #196. +Update Polish translation. Closes #199. Thanks @Lioheart! +Fix for movement penalty getting inverted for grid measurement option. Closes #198. +Fix right-click to add waypoints. Closes #197, #192. + # 0.10.8 Fix for 5-10-5 using 10-5-10 and vice versa. Closes #195. Update libGeometry to v0.3.12. diff --git a/languages/pl.json b/languages/pl.json index f8415e4..da57476 100644 --- a/languages/pl.json +++ b/languages/pl.json @@ -55,8 +55,8 @@ "elevationruler.settings.speed-highlighting-no-hostiles.name": "Brak podświetlenia szybkości wrogów", "elevationruler.settings.speed-highlighting-no-hostiles.hint": "Po włączeniu tej opcji użytkownik nie może zobaczyć szybkości wrogiego lub tajnego tokena, chyba że ma uprawnienia obserwatora lub właściciela.", - "elevationruler.settings.token-ruler-combat-history.name": "Śledzenie ruchu w walce", - "elevationruler.settings.token-ruler-combat-history.hint": "W przypadku podświetlania szybkości tokenów, podczas wyświetlania podświetlenia należy zsumować wszystkie ruchy tokenów w rundzie.", + "elevationruler.settings.token-ruler-combat-history.name": "Śledzenie historii ruchów w walce", + "elevationruler.settings.token-ruler-combat-history.hint": "Wyświetla historię na linijce, gdy token porusza się wielokrotnie w tej samej rundzie walki.", "elevationruler.settings.combine-prior-with-total.name": "Połączenie wcześniejszego ruchu z całkowitym ruchem", "elevationruler.settings.combine-prior-with-total.hint": "Jeśli opcja śledzenia ruchu bojowego jest włączona, połącz wcześniejszy ruch tokena w rundzie z całkowitym ruchem. W przeciwnym razie umieść wcześniejszy ruch w osobnej linii.", @@ -74,10 +74,13 @@ "elevationruler.settings.token-speed-multiplier.hint": "W przypadku podświetlania szybkości tokena jest to mnożnik używany do przejścia od chodzenia do biegania (kreska) do maksimum. Na przykład, z mnożnikiem 2, token z prędkością chodu 25 będzie podświetlony na pomarańczowo po pierwszych 25 jednostkach odległości i na czerwono po pierwszych 50.", "elevationruler.settings.round-to-multiple.name": "Dystans zaokrąglony do wielokrotności", - "elevationruler.settings.round-to-multiple.hint": "W przypadku pomiaru odległości bez siatki wyświetlana odległość jest zaokrąglana do najbliższej wielokrotności wprowadzonej liczby. Ustaw wartość 0, aby wyłączyć zaokrąglanie.", + "elevationruler.settings.round-to-multiple.hint": "Zaokrągla wyświetlaną odległość do najbliższej wielokrotności wprowadzonej liczby. Ustaw wartość 0, aby wyłączyć zaokrąglanie.", - "elevationruler.settings.token-terrain-multiplier.name": "Token jako współczynnik terenu", - "elevationruler.settings.token-terrain-multiplier.hint": "Mnożnik używany do obliczania prędkości ruchu podczas przechodzenia przez inne tokeny. Ustaw na 1, aby ignorować. Wartości mniejsze niż 1 traktują pola tokenów jako szybsze niż normalnie; wartości większe niż 1 karzą ruch przez pola tokenów.", + "elevationruler.settings.token-terrain-multiplier.name": "Procentowa kara za token", + "elevationruler.settings.token-terrain-multiplier.hint": "Karze ruch przez inne tokeny. Wartość 1 oznacza brak kary, wartość mniejsza niż 1 oznacza premię, a wartość większa niż 1 oznacza mnożnik kary. Na przykład, ustawienie 2 podwaja koszt ruchu przez token.", + + "elevationruler.settings.token-terrain-multiplier-flat.name": "Płaska kara za token", + "elevationruler.settings.token-terrain-multiplier-flat.hint": "Jeśli opcja ta jest włączona, traktuje karę za ruch tokenem jako stałą wartość dodatkowego dystansu. Na przykład, ustawienie na 5 dodaje +5 do każdego kwadratu ruchu. Wartości ujemne zapewniają płaską premię.", "elevationruler.settings.pathfinding_enable.name": "Użyj wyszukiwania ścieżek", "elevationruler.settings.pathfinding_enable.hint": "Po włączeniu dodaje do elementów sterujących tokenów przełącznik wyznaczania ścieżki, który spowoduje, że linijka wyznaczy ścieżkę wokół ścian i tokenów, w zależności od ustawień. Wyłącz tę opcję, jeśli śledzenie ścieżek powoduje problemy z kompatybilnością. Wyłączenie może również spowodować niewielki wzrost wydajności.", @@ -96,6 +99,7 @@ "elevationruler.settings.grid-terrain-algorithm.name": "Pomiar siatki terenu", "elevationruler.settings.grid-terrain-algorithm.hint": "Jak uwzględnić kary lub premie za ruch wynikające z terenu i tokenów na siatce? Środek: zastosuj, jeśli teren/token pokrywa się ze środkiem siatki; Procent obszaru: zastosuj, jeśli teren/token pokrywa co najmniej taką część kwadratu/heksu siatki; Euklidesowy: proporcjonalnie na podstawie procentu segmentu linii w obrębie terenu/tokenu między tym kwadratem/heksem siatki a poprzednim.", + "elevationruler.settings.grid-terrain-choice-center-point": "Punkt środkowy", "elevationruler.settings.grid-terrain-choice-percent-area": "Procent powierzchni", "elevationruler.settings.grid-terrain-choice-euclidean": "Euklidesowy", @@ -106,11 +110,31 @@ "elevationruler.settings.automatic-movement-type.name": "Autowykrywanie typu ruchu", "elevationruler.settings.automatic-movement-type.hint": "Automatycznie wykrywa typ ruchu na podstawie pozycji tokena. Ustaw efekt statusu tokena na \"latanie\" lub \"kopanie\", aby go zastąpić.", + "elevationruler.settings.euclidean-grid-distance.name": "Preferuj odległość euklidesową", + "elevationruler.settings.euclidean-grid-distance.hint": "W przypadku scen siatkowych, jeśli wybrano „Dokładne (√2)” dla głównych ustawień „Przekątne siatki kwadratowej”, wymusi to pomiar odległości euklidesowej zamiast odległości w jednostkach heksów/kwadratów. W przypadku siatki heksów ma to wpływ tylko na ruch po przekątnej.", + + "elevationruler.settings.scale-text.name": "Skala tekstu linijki", + "elevationruler.settings.scale-text.hint": "Po włączeniu, tekst linijki będzie skalowany w zależności od `canvas.dimensions.size`. Dalsze dostosowanie skalowania za pomocą `CONFIG.elevationruler.textScale`.", + + "elevationruler.settings.force-grid-penalties.name": "Użycie siatki dla kar za ruch", + "elevationruler.settings.force-grid-penalties.hint": "Gdy opcja ta jest włączona, kary za ruch są naliczane tylko wtedy, gdy token/rysunek/region pokrywa środek heksu/kwadratu, a kary są naliczane za kwadrat lub heks na mapach z siatką. Gdy opcja ta jest wyłączona, kary za ruch są naliczane proporcjonalnie do ruchu. Na przykład, jeśli rysunek z karą ruchu x2 obejmuje 3/4 pola siatki, będzie ona stosowana do 3/4 ruchu przez to pole (tj. kara 1,5x).", + + "elevationruler.settings.customized-labels.name": "Niestandardowy tekst linijki", + "elevationruler.settings.customized-labels.hint": "Dostosuj tekst linijki. Zmień style używając `CONFIG.elevationruler.labelStyles` i `CONFIG.elevationruler.labelIcons`.", + "elevationruler.controls.prefer-token-elevation.name": "Preferuj wysokość tokena", "elevationruler.controls.pathfinding-control.name": "Użyj wyszukiwania ścieżek", - "elevationruler.drawingconfig.movementPenalty.name": "Premia/kara za ruch", - "elevationruler.drawingconfig.movementPenalty.hint": "Wartość 1 oznacza brak kary. Wartości większe niż jeden powodują karę za ruch o ten procent; wartości mniejsze niż jeden zapewniają premię do ruchu. Na przykład, ustawienie wartości 2 podwaja ruch przez ten obszar. Ruch poniżej narysowanej wysokości będzie ignorowany.", + "elevationruler.drawingconfig.movementPenalty.name": "Procentowa kara za ruch", + "elevationruler.drawingconfig.movementPenalty.hint": "Wartość 1 oznacza brak kary, wartość mniejsza niż 1 oznacza premię, a wartość większa niż 1 oznacza mnożnik kary. Na przykład, ustawienie 2 podwaja koszt ruchu przez ten obszar. Ruch pod narysowaną wysokością będzie ignorowany.", + + "elevationruler.drawingconfig.flatMovementPenalty.name": "Użycie kary płaskiej", + "elevationruler.drawingconfig.flatMovementPenalty.hint": "Jeśli opcja ta jest włączona, traktuje karę jako stałą wartość dodatkowego dystansu. Na przykład, ustawienie na 5 dodaje +5 do każdego kwadratu ruchu. Wartości ujemne zapewniają płaską premię.", - "elevationruler.clearMovement": "Wyczyść ruch bojowy" + "elevationruler.clearMovement": "Wyczyść ruch bojowy", + "elevationruler.waypoint": "punkt trasy", + "elevationruler.up": "w górę", + "elevationruler.down": "w dół", + "elevationruler.added": "dodany", + "elevationruler.prior": "wcześniejszy" } \ No newline at end of file diff --git a/scripts/Token.js b/scripts/Token.js index b7c7ac2..9a43ea5 100644 --- a/scripts/Token.js +++ b/scripts/Token.js @@ -133,8 +133,8 @@ function _onDragLeftCancel(wrapped, event) { if ( event.button === 2 && ruler._isTokenRuler && ruler.active && ruler.state === Ruler.STATES.MEASURING ) { log("Token#_onDragLeftMove|Token ruler active"); event.preventDefault(); - if ( event.ctrlKey ) ruler._removeWaypoint(event.interactionData.origin, {snap: !event.shiftKey}); - else ruler._addWaypoint(event.interactionData.origin, {snap: !event.shiftKey}); + if ( event.ctrlKey ) ruler._removeWaypoint(event.interactionData.destination, {snap: !event.shiftKey}); + else ruler._addWaypoint(event.interactionData.destination, {snap: !event.shiftKey}); return false; } diff --git a/scripts/geometry b/scripts/geometry index 0da25ed..2f0b2d3 160000 --- a/scripts/geometry +++ b/scripts/geometry @@ -1 +1 @@ -Subproject commit 0da25ed79a39f25a398e1e39cff925312ab97536 +Subproject commit 2f0b2d3cc679dc05c26ed5d5c291ad9ad5b08a96 diff --git a/scripts/measurement/Grid.js b/scripts/measurement/Grid.js index fc39507..d82bd1d 100644 --- a/scripts/measurement/Grid.js +++ b/scripts/measurement/Grid.js @@ -95,11 +95,12 @@ function directPath3dSquare(start, end) { * - @returns {number} */ function singleOffsetSquareDistanceFn(numDiagonals = 0) { + const diagonals = canvas.grid.diagonals ?? game.settings.get("core", "gridDiagonals"); const D = CONST.GRID_DIAGONALS; let nDiag = numDiagonals; let fn; - if ( canvas.grid.diagonals === D.ALTERNATING_1 || canvas.grid.diagonals === D.ALTERNATING_2 ) { - const kFn = canvas.grid.diagonals === D.ALTERNATING_1 + if ( diagonals === D.ALTERNATING_1 || diagonals === D.ALTERNATING_2 ) { + const kFn = diagonals === D.ALTERNATING_2 ? () => nDiag & 1 ? 2 : 1 : () => nDiag & 1 ? 1 : 2; fn = (prevOffset, currOffset) => { @@ -116,7 +117,7 @@ function singleOffsetSquareDistanceFn(numDiagonals = 0) { } else { let k = 1; let k2 = 1; - switch ( canvas.grid.diagonals ) { + switch ( diagonals ) { case D.EQUIDISTANT: k = 1; k2 = 1; break; case D.EXACT: k = Math.SQRT2; k2 = Math.SQRT3; break; case D.APPROXIMATE: k = 1.5; k2 = 1.75; break; @@ -176,11 +177,12 @@ function directPath3dHex(start, end) { * - @returns {number} */ function singleOffsetHexDistanceFn(numDiagonals = 0) { + const diagonals = canvas.grid.diagonals ?? game.settings.get("core", "gridDiagonals"); const D = CONST.GRID_DIAGONALS; let nDiag = numDiagonals; let fn; - if ( canvas.grid.diagonals === D.ALTERNATING_1 || canvas.grid.diagonals === D.ALTERNATING_2 ) { - const kFn = canvas.grid.diagonals === D.ALTERNATING_1 + if ( diagonals === D.ALTERNATING_1 || diagonals === D.ALTERNATING_2 ) { + const kFn = diagonals === D.ALTERNATING_2 ? () => nDiag & 1 ? 2 : 1 : () => nDiag & 1 ? 1 : 2; fn = (prevOffset, currOffset) => { @@ -195,7 +197,7 @@ function singleOffsetHexDistanceFn(numDiagonals = 0) { }; } else { let k = 1; - switch ( canvas.grid.diagonals ) { + switch ( diagonals ) { case D.EQUIDISTANT: k = 1; break; case D.EXACT: k = Math.SQRT2; break; case D.APPROXIMATE: k = 1.5; break; diff --git a/scripts/measurement/MovePenalty.js b/scripts/measurement/MovePenalty.js index 4fa58ad..0ee6c64 100644 --- a/scripts/measurement/MovePenalty.js +++ b/scripts/measurement/MovePenalty.js @@ -243,8 +243,9 @@ export class MovePenalty { const startingSpeed = this.speedFn(tClone) || 1; regions.forEach(r => this.#addTerrainsToToken(tClone, r)); - const speedInGrid = ((this.speedFn(tClone) || 1) * currentMultiplier); - const gridMult = startingSpeed / speedInGrid; + currentMultiplier ||= 1; // Don't let it divide by 0. + const speedInGrid = ((this.speedFn(tClone) || 1) / currentMultiplier); + const gridMult = startingSpeed / speedInGrid; // If currentMultiplier > 1, gridMult should be > 1. return (flatPenalty + (gridMult * costFreeDistance)); /* Example diff --git a/scripts/segment_labels_highlighting.js b/scripts/segment_labels_highlighting.js index 2bf5203..46a7b48 100644 --- a/scripts/segment_labels_highlighting.js +++ b/scripts/segment_labels_highlighting.js @@ -138,6 +138,7 @@ export function segmentTerrainLabel(s) { if ( s.waypoint.cost.almostEqual(s.waypoint.offsetDistance) ) return ""; const units = (canvas.scene.grid.units) ? ` ${canvas.scene.grid.units}` : ""; const addedCost = roundMultiple(s.waypoint.cost - s.waypoint.offsetDistance); + if ( addedCost.almostEqual(0) ) return ""; const symbol = addedCost > 0 ? "+" : "-"; if ( CONFIG[MODULE_ID].SPEED.useFontAwesome ) {