changeset 7244:00f3d8da22e4 draft

(svn r10541) -Fix [FS#1028]: cargo payment rates overflow. -Fix: cargo payment rates diverge from cost rates making it impossible to make any profit after a certain number of years. Both are solved by stopping the inflation after 170 years; there is absolutely no point in continueing the inflation after that as it only makes the game have overflows at some point that cannot be solved; using larger variables only delays the inevitable.
author rubidium <rubidium@openttd.org>
date Fri, 13 Jul 2007 12:08:37 +0000
parents c4417d23aad6
children ff90f1b7b555
files src/economy.cpp src/economy.h src/saveload.cpp
diffstat 3 files changed, 22 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -664,6 +664,23 @@
 
 static void AddInflation()
 {
+	/* The cargo payment inflation differs from the normal inflation, so the
+	 * relative amount of money you make with a transport decreases slowly over
+	 * the 170 years. After a few hundred years we reach a level in which the
+	 * games will become unplayable as the maximum income will be less than
+	 * the minimum running cost.
+	 *
+	 * Furthermore there are a lot of inflation related overflows all over the
+	 * place. Solving them is hardly possible because inflation will always
+	 * reach the overflow threshold some day. So we'll just perform the
+	 * inflation mechanism during the first 170 years (the amount of years that
+	 * one had in the original TTD) and stop doing the inflation after that
+	 * because it only causes problems that can't be solved nicely and the
+	 * inflation doesn't add anything after that either; it even makes playing
+	 * it impossible due to the diverging cost and income rates.
+	 */
+	if ((_cur_year - _patches.starting_year) >= (ORIGINAL_MAX_YEAR - ORIGINAL_BASE_YEAR)) return;
+
 	/* Approximation for (100 + infl_amount)% ** (1 / 12) - 100%
 	 * scaled by 65536
 	 * 12 -> months per year
@@ -675,10 +692,9 @@
 		AddSingleInflation((Money*)&_price + i, _price_frac + i, inf);
 	}
 
-	_economy.max_loan_unround += BIGMULUS(_economy.max_loan_unround, inf, 16);
+	AddSingleInflation(&_economy.max_loan_unround, &_economy.max_loan_unround_fract, inf);
 
-	if (_economy.max_loan + 50000 <= _economy.max_loan_unround)
-		_economy.max_loan += 50000;
+	if (_economy.max_loan + 50000 <= _economy.max_loan_unround) _economy.max_loan += 50000;
 
 	inf = _economy.infl_amount_pr * 54;
 	for (CargoID i = 0; i < NUM_CARGO; i++) {
@@ -1902,6 +1918,7 @@
 	SLE_CONDVAR(Economy, max_loan,         SLE_INT64,                  65, SL_MAX_VERSION),
 	SLE_CONDVAR(Economy, max_loan_unround, SLE_FILE_I32 | SLE_VAR_I64,  0, 64),
 	SLE_CONDVAR(Economy, max_loan_unround, SLE_INT64,                  65, SL_MAX_VERSION),
+	SLE_CONDVAR(Economy, max_loan_unround_fract, SLE_UINT16,           70, SL_MAX_VERSION),
 	    SLE_VAR(Economy, fluct,            SLE_FILE_I16 | SLE_VAR_I32),
 	    SLE_VAR(Economy, interest_rate,    SLE_UINT8),
 	    SLE_VAR(Economy, infl_amount,      SLE_UINT8),
--- a/src/economy.h
+++ b/src/economy.h
@@ -11,6 +11,7 @@
 struct Economy {
 	Money max_loan;         ///< Maximum possible loan
 	Money max_loan_unround; ///< Economy fluctuation status
+	uint16 max_loan_unround_fract; ///< Fraction of the unrounded max loan
 	int fluct;
 	byte interest_rate;     ///< Interest
 	byte infl_amount;       ///< inflation amount
--- a/src/saveload.cpp
+++ b/src/saveload.cpp
@@ -30,7 +30,7 @@
 #include <setjmp.h>
 #include <list>
 
-extern const uint16 SAVEGAME_VERSION = 69;
+extern const uint16 SAVEGAME_VERSION = 70;
 uint16 _sl_version;       ///< the major savegame version identifier
 byte   _sl_minor_version; ///< the minor savegame version, DO NOT USE!