diff --git a/src/economy.cpp b/src/economy.cpp --- a/src/economy.cpp +++ b/src/economy.cpp @@ -621,7 +621,7 @@ static void AddSingleInflation(Money *va } } -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; diff --git a/src/economy_func.h b/src/economy_func.h --- a/src/economy_func.h +++ b/src/economy_func.h @@ -19,6 +19,7 @@ struct Player; void ResetPriceBaseMultipliers(); void SetPriceBaseMultiplier(uint price, byte factor); +void ResetEconomy(); extern const ScoreInfo _score_info[]; extern int _score_part[MAX_PLAYERS][SCORE_END]; diff --git a/src/openttd.cpp b/src/openttd.cpp --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -2454,6 +2454,7 @@ void ReloadNewGRFData() /* reload grf data */ GfxLoadSprites(); LoadStringWidthTable(); + ResetEconomy(); /* reload vehicles */ ResetVehiclePosHash(); AfterLoadVehicles(false);