Changeset - r20848:1f20560be042
[Not reviewed]
master
0 2 0
fonsinchen - 11 years ago 2013-10-20 14:27:36
fonsinchen@openttd.org
(svn r25892) -Fix: off-by-one error in GetVia prevented certain flows from getting picked
2 files changed with 4 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/station_base.h
Show inline comments
 
@@ -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;
src/station_cmd.cpp
Show inline comments
 
@@ -4065,7 +4065,7 @@ uint FlowStat::GetShare(StationID st) co
 
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 exc
 
	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 exc
 
	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);
0 comments (0 inline, 0 general)