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:
nethack.rankin
2007-03-29 04:03:35 +00:00
parent 8748bf5334
commit b4f39da9dd
2 changed files with 7 additions and 6 deletions
+1
View File
@@ -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
View File
@@ -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)))