Changeset - r21473:67944b039d89
[Not reviewed]
master
0 2 0
rubidium - 11 years ago 2014-05-11 18:35:34
rubidium@openttd.org
(svn r26582) -Feature-ish: quickly decay cargo after about 21 months of not having picked any of the cargo, and prevent houses and industries providing more cargo
2 files changed with 34 insertions and 15 deletions:
0 comments (0 inline, 0 general)
src/station_base.h
Show inline comments
 
@@ -169,11 +169,12 @@ struct GoodsEntry {
 
		GES_ACCEPTANCE,
 

	
 
		/**
 
		 * Set when the cargo was ever waiting at the station.
 
		 * This indicates whether a cargo has a rating at the station.
 
		 * Set when cargo was ever waiting at the station.
 
		 * It is set when cargo supplied by surrounding tiles is moved to the station, or when
 
		 * arriving vehicles unload/transfer cargo without it being a final delivery.
 
		 * This also indicates, whether a cargo has a rating at the station.
 
		 * This flag is never cleared.
 
		 *
 
		 * This flag is cleared after 255 * STATION_RATING_TICKS of not having seen a pickup.
 
		 */
 
		GES_RATING,
 

	
src/station_cmd.cpp
Show inline comments
 
@@ -3240,6 +3240,28 @@ static inline void byte_inc_sat(byte *p)
 
	if (b != 0) *p = b;
 
}
 

	
 
/**
 
 * Truncate the cargo by a specific amount.
 
 * @param cs The type of cargo to perform the truncation for.
 
 * @param ge The goods entry, of the station, to truncate.
 
 * @param amount The amount to truncate the cargo by.
 
 */
 
static void TruncateCargo(const CargoSpec *cs, GoodsEntry *ge, uint amount = UINT_MAX)
 
{
 
	/* If truncating also punish the source stations' ratings to
 
	 * decrease the flow of incoming cargo. */
 

	
 
	StationCargoAmountMap waiting_per_source;
 
	ge->cargo.Truncate(amount, &waiting_per_source);
 
	for (StationCargoAmountMap::iterator i(waiting_per_source.begin()); i != waiting_per_source.end(); ++i) {
 
		Station *source_station = Station::GetIfValid(i->first);
 
		if (source_station == NULL) continue;
 

	
 
		GoodsEntry &source_ge = source_station->goods[cs->Index()];
 
		source_ge.max_waiting_cargo = max(source_ge.max_waiting_cargo, i->second);
 
	}
 
}
 

	
 
static void UpdateStationRating(Station *st)
 
{
 
	bool waiting_changed = false;
 
@@ -3260,6 +3282,13 @@ static void UpdateStationRating(Station 
 
		/* Only change the rating if we are moving this cargo */
 
		if (ge->HasRating()) {
 
			byte_inc_sat(&ge->time_since_pickup);
 
			if (ge->time_since_pickup == 255 && _settings_game.order.selectgoods) {
 
				ClrBit(ge->status, GoodsEntry::GES_RATING);
 
				ge->last_speed = 0;
 
				TruncateCargo(cs, ge);
 
				waiting_changed = true;
 
				continue;
 
			}
 

	
 
			bool skip = false;
 
			int rating = 0;
 
@@ -3373,18 +3402,7 @@ static void UpdateStationRating(Station 
 
					 * next rating calculation. */
 
					ge->max_waiting_cargo = 0;
 

	
 
					/* If truncating also punish the source stations' ratings to
 
					 * decrease the flow of incoming cargo. */
 

	
 
					StationCargoAmountMap waiting_per_source;
 
					ge->cargo.Truncate(ge->cargo.AvailableCount() - waiting, &waiting_per_source);
 
					for (StationCargoAmountMap::iterator i(waiting_per_source.begin()); i != waiting_per_source.end(); ++i) {
 
						Station *source_station = Station::GetIfValid(i->first);
 
						if (source_station == NULL) continue;
 

	
 
						GoodsEntry &source_ge = source_station->goods[cs->Index()];
 
						source_ge.max_waiting_cargo = max(source_ge.max_waiting_cargo, i->second);
 
					}
 
					TruncateCargo(cs, ge, ge->cargo.AvailableCount() - waiting);
 
				} else {
 
					/* If the average number per next hop is low, be more forgiving. */
 
					ge->max_waiting_cargo = waiting_avg;
0 comments (0 inline, 0 general)