changeset 7328:35cf803fe4b9 draft

(svn r10691) -Codechange [FS#509]: simplify GetTransportedGoodsIncome to make it more obvious and less hidden what actually happens. Based on a patch by rfalke.
author rubidium <rubidium@openttd.org>
date Wed, 25 Jul 2007 19:26:33 +0000
parents 0ab2820a1e52
children 5846403c5d11
files src/economy.cpp
diffstat 1 files changed, 29 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1168,7 +1168,6 @@
 Money GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, CargoID cargo_type)
 {
 	const CargoSpec *cs = GetCargo(cargo_type);
-	byte f;
 
 	/* Use callback to calculate cargo profit, if available */
 	if (HASBIT(cs->callback_mask, CBM_CARGO_PROFIT_CALC)) {
@@ -1187,28 +1186,39 @@
 		}
 	}
 
-	/* zero the distance if it's the bank and very short transport. */
-	if (_opt.landscape == LT_TEMPERATE && cs->label == 'VALU' && dist < 10)
-		dist = 0;
+	/* zero the distance (thus income) if it's the bank and very short transport. */
+	if (_opt.landscape == LT_NORMAL && cs->label == 'VALU' && dist < 10) return 0;
+
 
-	f = 255;
-	if (transit_days > cs->transit_days[0]) {
-		transit_days -= cs->transit_days[0];
-		f -= transit_days;
+	static const int MIN_TIME_FACTOR = 31;
+	static const int MAX_TIME_FACTOR = 255;
+
+	const int days1 = cs->transit_days[0];
+	const int days2 = cs->transit_days[1];
+	const int days_over_days1 = transit_days - days1;
 
-		if (transit_days > cs->transit_days[1]) {
-			transit_days -= cs->transit_days[1];
+	/*
+	 * The time factor is calculated based on the time it took
+	 * (transit_days) compared two cargo-depending values. The
+	 * range is divided into three parts:
+	 *
+	 *  - constant for fast transits
+	 *  - linear decreasing with time with a slope of -1 for medium transports
+	 *  - linear decreasing with time with a slope of -2 for slow transports
+	 *
+	 */
+	int time_factor;
+	if (days_over_days1 <= 0) {
+		time_factor = MAX_TIME_FACTOR;
+	} else if (days_over_days1 <= days2) {
+		time_factor = MAX_TIME_FACTOR - days_over_days1;
+	} else {
+		time_factor = MAX_TIME_FACTOR - 2 * days_over_days1 + days2;
+	}
 
-			if (f < transit_days) {
-				f = 0;
-			} else {
-				f -= transit_days;
-			}
-		}
-	}
-	if (f < 31) f = 31;
+	if (time_factor < MIN_TIME_FACTOR) time_factor = MIN_TIME_FACTOR;
 
-	return BIGMULSS(dist * f * num_pieces, _cargo_payment_rates[cargo_type], 21);
+	return BIGMULSS(dist * time_factor * num_pieces, _cargo_payment_rates[cargo_type], 21);
 }
 
 static void DeliverGoodsToIndustry(TileIndex xy, CargoID cargo_type, int num_pieces)