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
|
||||
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
|
||||
use a more precise jumping path for far, non-straight line destinations
|
||||
|
||||
|
||||
Platform- and/or Interface-Specific Fixes
|
||||
|
||||
@@ -433,10 +433,10 @@ walk_path(src_cc, dest_cc, check_proc, arg)
|
||||
prev_x = x;
|
||||
prev_y = y;
|
||||
y += y_change;
|
||||
err += dx;
|
||||
if (err >= dy) {
|
||||
err += dx << 1;
|
||||
if (err > dy) {
|
||||
x += x_change;
|
||||
err -= dy;
|
||||
err -= dy << 1;
|
||||
}
|
||||
/* check for early exit condition */
|
||||
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_y = y;
|
||||
x += x_change;
|
||||
err += dy;
|
||||
if (err >= dx) {
|
||||
err += dy << 1;
|
||||
if (err > dx) {
|
||||
y += y_change;
|
||||
err -= dx;
|
||||
err -= dx << 1;
|
||||
}
|
||||
/* check for early exit condition */
|
||||
if (!(keep_going = (*check_proc)(arg, x, y)))
|
||||
|
||||
Reference in New Issue
Block a user