(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 /* The cargo payment inflation differs from the normal inflation, so the
* relative amount of money you make with a transport decreases slowly over * 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 * inflation doesn't add anything after that either; it even makes playing
* it impossible due to the diverging cost and income rates. * 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% /* Approximation for (100 + infl_amount)% ** (1 / 12) - 100%
* scaled by 65536 * scaled by 65536
@ -818,6 +818,35 @@ void StartupEconomy()
_economy.fluct = GB(Random(), 0, 8) + 168; _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) Money GetPriceByIndex(uint8 index)
{ {
@ -1718,8 +1747,7 @@ void LoadUnloadStation(Station *st)
void PlayersMonthlyLoop() void PlayersMonthlyLoop()
{ {
PlayersGenStatistics(); PlayersGenStatistics();
if (_settings_game.economy.inflation && _cur_year < MAX_YEAR) if (_settings_game.economy.inflation) AddInflation();
AddInflation();
PlayersPayInterest(); PlayersPayInterest();
/* Reset the _current_player flag */ /* Reset the _current_player flag */
_current_player = OWNER_NONE; _current_player = OWNER_NONE;

View File

@ -19,6 +19,7 @@ struct Player;
void ResetPriceBaseMultipliers(); void ResetPriceBaseMultipliers();
void SetPriceBaseMultiplier(uint price, byte factor); void SetPriceBaseMultiplier(uint price, byte factor);
void ResetEconomy();
extern const ScoreInfo _score_info[]; extern const ScoreInfo _score_info[];
extern int _score_part[MAX_PLAYERS][SCORE_END]; extern int _score_part[MAX_PLAYERS][SCORE_END];

View File

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