diff options
author | rubidium <rubidium@openttd.org> | 2011-01-09 14:55:22 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2011-01-09 14:55:22 +0000 |
commit | ade2f29f5d4bd48bf94dd875fe212f884e336c4c (patch) | |
tree | cea2f99ff3efd69b4e155b3a63c063b26145342e | |
parent | 35be634974abbd5a78429ef114cff16c78eb555a (diff) | |
download | openttd-ade2f29f5d4bd48bf94dd875fe212f884e336c4c.tar.xz |
(svn r21747) -Fix [FS#4395]: the diagonal iterator would iterate twice over some tiles (fonsinchen)
-rw-r--r-- | src/tilearea.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/tilearea.cpp b/src/tilearea.cpp index 74f701315..c518fe8f1 100644 --- a/src/tilearea.cpp +++ b/src/tilearea.cpp @@ -139,15 +139,22 @@ TileIterator &DiagonalTileIterator::operator++() { assert(this->tile != INVALID_TILE); + bool new_line = false; do { /* Iterate using the rotated coordinates. */ if (this->a_max > 0) { - ++this->a_cur; + this->a_cur += 2; + new_line = this->a_cur >= this->a_max; } else { - --this->a_cur; + this->a_cur -= 2; + new_line = this->a_cur <= this->a_max; } - if (this->a_cur == this->a_max) { - this->a_cur = 0; + if (new_line) { + /* offset of initial a_cur: one tile in the same direction as a_max + * every second line. + */ + this->a_cur = abs(this->a_cur) % 2 ? 0 : (this->a_max > 0 ? 1 : -1); + if (this->b_max > 0) { ++this->b_cur; } else { |