fix #H261 - bias in Bresenham's algorithm in walk_path
From a bug report, walk_path() was favoring orthogonal steps at beginning of the path and diagonal ones at end, when intermixing diagonal and orthoganal produced a more accurate representation of the real path. Only mattered for long distance jumps 3x2 or 3x1 steps away; hurtling always moves in a straight line and short (2x1 knight) jumps aren't affected by the patch supplied with the report.
This commit is contained in:
@@ -342,6 +342,7 @@ lit candle or potion of oil which burned out while equipped would leave stale
|
|||||||
wielded/worn figurine which auto-transformed had same stale pointer bug
|
wielded/worn figurine which auto-transformed had same stale pointer bug
|
||||||
format names of not yet id'd artifacts such that obj type shows for non-weapons
|
format names of not yet id'd artifacts such that obj type shows for non-weapons
|
||||||
make quest leader and nemesis be unlikely to be affected by traps
|
make quest leader and nemesis be unlikely to be affected by traps
|
||||||
|
use a more precise jumping path for far, non-straight line destinations
|
||||||
|
|
||||||
|
|
||||||
Platform- and/or Interface-Specific Fixes
|
Platform- and/or Interface-Specific Fixes
|
||||||
|
|||||||
+6
-6
@@ -433,10 +433,10 @@ walk_path(src_cc, dest_cc, check_proc, arg)
|
|||||||
prev_x = x;
|
prev_x = x;
|
||||||
prev_y = y;
|
prev_y = y;
|
||||||
y += y_change;
|
y += y_change;
|
||||||
err += dx;
|
err += dx << 1;
|
||||||
if (err >= dy) {
|
if (err > dy) {
|
||||||
x += x_change;
|
x += x_change;
|
||||||
err -= dy;
|
err -= dy << 1;
|
||||||
}
|
}
|
||||||
/* check for early exit condition */
|
/* check for early exit condition */
|
||||||
if (!(keep_going = (*check_proc)(arg, x, y)))
|
if (!(keep_going = (*check_proc)(arg, x, y)))
|
||||||
@@ -447,10 +447,10 @@ walk_path(src_cc, dest_cc, check_proc, arg)
|
|||||||
prev_x = x;
|
prev_x = x;
|
||||||
prev_y = y;
|
prev_y = y;
|
||||||
x += x_change;
|
x += x_change;
|
||||||
err += dy;
|
err += dy << 1;
|
||||||
if (err >= dx) {
|
if (err > dx) {
|
||||||
y += y_change;
|
y += y_change;
|
||||||
err -= dx;
|
err -= dx << 1;
|
||||||
}
|
}
|
||||||
/* check for early exit condition */
|
/* check for early exit condition */
|
||||||
if (!(keep_going = (*check_proc)(arg, x, y)))
|
if (!(keep_going = (*check_proc)(arg, x, y)))
|
||||||
|
|||||||
Reference in New Issue
Block a user