summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfonsinchen <fonsinchen@openttd.org>2013-10-20 14:27:36 +0000
committerfonsinchen <fonsinchen@openttd.org>2013-10-20 14:27:36 +0000
commit9337c561b0cc37a9156d4132178d54322cf6d06e (patch)
treef86b661e6ad266bd1c8a687ff0eb193b82d46896
parent54db96be43bbb94f3d5193647be2f787a192f358 (diff)
downloadopenttd-9337c561b0cc37a9156d4132178d54322cf6d06e.tar.xz
(svn r25892) -Fix: off-by-one error in GetVia prevented certain flows from getting picked
-rw-r--r--src/station_base.h2
-rw-r--r--src/station_cmd.cpp6
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);