src/economy.cpp
changeset 9717 b7806a165a75
parent 9659 187142ff9b6c
child 9950 2a0d0769c0e3
--- 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;