(svn r13836) -Fix [FS#2074]: Automatically recalculate inflation if NewGRFs are changed and cargo types are added, so that cargo payment rates are correct.
--- a/src/economy.cpp Sat Jul 26 10:21:26 2008 +0000
+++ b/src/economy.cpp Sat Jul 26 14:58:08 2008 +0000
@@ -621,7 +621,7 @@
}
}
-static void AddInflation()
+static void AddInflation(bool check_year = true)
{
/* The cargo payment inflation differs from the normal inflation, so the
* relative amount of money you make with a transport decreases slowly over
@@ -638,7 +638,7 @@
* 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 - _settings_game.game_creation.starting_year) >= (ORIGINAL_MAX_YEAR - ORIGINAL_BASE_YEAR)) return;
+ if (check_year && (_cur_year - _settings_game.game_creation.starting_year) >= (ORIGINAL_MAX_YEAR - ORIGINAL_BASE_YEAR)) return;
/* Approximation for (100 + infl_amount)% ** (1 / 12) - 100%
* scaled by 65536
@@ -818,6 +818,35 @@
_economy.fluct = GB(Random(), 0, 8) + 168;
}
+void ResetEconomy()
+{
+ /* Test if resetting the economy is needed. */
+ bool needed = false;
+
+ for (CargoID c = 0; c < NUM_CARGO; c++) {
+ const CargoSpec *cs = GetCargo(c);
+ if (!cs->IsValid()) continue;
+ if (_cargo_payment_rates[c] == 0) {
+ needed = true;
+ break;
+ }
+ }
+
+ if (!needed) return;
+
+ /* Remember old unrounded maximum loan value. NewGRF has the ability
+ * to change all the other inflation affected base costs. */
+ Money old_value = _economy.max_loan_unround;
+
+ /* Reset the economy */
+ StartupEconomy();
+ InitializeLandscapeVariables(false);
+
+ /* Reapply inflation, ignoring the year */
+ while (old_value > _economy.max_loan_unround) {
+ AddInflation(false);
+ }
+}
Money GetPriceByIndex(uint8 index)
{
@@ -1718,8 +1747,7 @@
void PlayersMonthlyLoop()
{
PlayersGenStatistics();
- if (_settings_game.economy.inflation && _cur_year < MAX_YEAR)
- AddInflation();
+ if (_settings_game.economy.inflation) AddInflation();
PlayersPayInterest();
/* Reset the _current_player flag */
_current_player = OWNER_NONE;
--- a/src/economy_func.h Sat Jul 26 10:21:26 2008 +0000
+++ b/src/economy_func.h Sat Jul 26 14:58:08 2008 +0000
@@ -19,6 +19,7 @@
void ResetPriceBaseMultipliers();
void SetPriceBaseMultiplier(uint price, byte factor);
+void ResetEconomy();
extern const ScoreInfo _score_info[];
extern int _score_part[MAX_PLAYERS][SCORE_END];
--- a/src/openttd.cpp Sat Jul 26 10:21:26 2008 +0000
+++ b/src/openttd.cpp Sat Jul 26 14:58:08 2008 +0000
@@ -2454,6 +2454,7 @@
/* reload grf data */
GfxLoadSprites();
LoadStringWidthTable();
+ ResetEconomy();
/* reload vehicles */
ResetVehiclePosHash();
AfterLoadVehicles(false);