From ea7ed286a63fdade4f1b55738a9d0fb110c00c01 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Sat, 26 Jul 2008 14:58:08 +0000 Subject: (svn r13836) -Fix [FS#2074]: Automatically recalculate inflation if NewGRFs are changed and cargo types are added, so that cargo payment rates are correct. --- src/economy.cpp | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'src/economy.cpp') diff --git a/src/economy.cpp b/src/economy.cpp index 9983ecfaf..ee1c155d5 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -621,7 +621,7 @@ static void AddSingleInflation(Money *value, uint16 *frac, int32 amt) } } -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 @@ static void AddInflation() * 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 @@ void StartupEconomy() _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 LoadUnloadStation(Station *st) 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; -- cgit v1.2.3-70-g09d2