(svn r13836) -Fix [FS#2074]: Automatically recalculate inflation if NewGRFs are changed and cargo types are added, so that cargo payment rates are correct.

This commit is contained in:
peter1138 2008-07-26 14:58:08 +00:00
parent 49c971c8eb
commit ea7ed286a6
3 changed files with 34 additions and 4 deletions

View File

@ -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;

View File

@ -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];

View File

@ -2454,6 +2454,7 @@ void ReloadNewGRFData()
/* reload grf data */
GfxLoadSprites();
LoadStringWidthTable();
ResetEconomy();
/* reload vehicles */
ResetVehiclePosHash();
AfterLoadVehicles(false);