diff options
author | fonsinchen <fonsinchen@openttd.org> | 2013-10-20 14:27:36 +0000 |
---|---|---|
committer | fonsinchen <fonsinchen@openttd.org> | 2013-10-20 14:27:36 +0000 |
commit | 9337c561b0cc37a9156d4132178d54322cf6d06e (patch) | |
tree | f86b661e6ad266bd1c8a687ff0eb193b82d46896 | |
parent | 54db96be43bbb94f3d5193647be2f787a192f358 (diff) | |
download | openttd-9337c561b0cc37a9156d4132178d54322cf6d06e.tar.xz |
(svn r25892) -Fix: off-by-one error in GetVia prevented certain flows from getting picked
-rw-r--r-- | src/station_base.h | 2 | ||||
-rw-r--r-- | src/station_cmd.cpp | 6 |
2 files changed, 4 insertions, 4 deletions
diff --git a/src/station_base.h b/src/station_base.h index 280df69d7..d2266be9c 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -96,7 +96,7 @@ public: inline StationID GetVia() const { assert(!this->shares.empty()); - return this->shares.upper_bound(RandomRange((--this->shares.end())->first - 1))->second; + return this->shares.upper_bound(RandomRange((--this->shares.end())->first))->second; } StationID GetVia(StationID excluded, StationID excluded2 = INVALID_STATION) const; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index b9797bdf3..acc036636 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -4065,7 +4065,7 @@ uint FlowStat::GetShare(StationID st) const StationID FlowStat::GetVia(StationID excluded, StationID excluded2) const { assert(!this->shares.empty()); - uint max = (--this->shares.end())->first - 1; + uint max = (--this->shares.end())->first; SharesMap::const_iterator it = this->shares.upper_bound(RandomRange(max)); assert(it != this->shares.end()); if (it->second != excluded && it->second != excluded2) return it->second; @@ -4076,7 +4076,7 @@ StationID FlowStat::GetVia(StationID excluded, StationID excluded2) const uint end = it->first; uint begin = (it == this->shares.begin() ? 0 : (--it)->first); uint interval = end - begin; - if (interval > max) return INVALID_STATION; // Only one station in the map. + if (interval >= max) return INVALID_STATION; // Only one station in the map. uint new_max = max - interval; uint rand = RandomRange(new_max); SharesMap::const_iterator it2 = (rand < begin) ? this->shares.upper_bound(rand) : @@ -4090,7 +4090,7 @@ StationID FlowStat::GetVia(StationID excluded, StationID excluded2) const uint end2 = it2->first; uint begin2 = (it2 == this->shares.begin() ? 0 : (--it2)->first); uint interval2 = end2 - begin2; - if (interval2 > new_max) return INVALID_STATION; // Only the two excluded stations in the map. + if (interval2 >= new_max) return INVALID_STATION; // Only the two excluded stations in the map. new_max -= interval2; if (begin > begin2) { Swap(begin, begin2); |