summaryrefslogtreecommitdiff
path: root/src/economy.cpp
diff options
context:
space:
mode:
authorbelugas <belugas@openttd.org>2008-09-15 17:18:22 +0000
committerbelugas <belugas@openttd.org>2008-09-15 17:18:22 +0000
commit0682dc3a0d97ecee26d807476071d5f552f86212 (patch)
treebbcf66eb7b0fe5be0cf11258b7cfa2654517ac4b /src/economy.cpp
parent606f4defdca281a3f918c9525dbd4d525ad11131 (diff)
downloadopenttd-0682dc3a0d97ecee26d807476071d5f552f86212.tar.xz
(svn r14332) -Fix[FS#1885]: Balance the monthly random industry changes, by introducing a daily random industry change.
This will allow to perform more changes per month on big maps and less on smaller maps, while not overtaxing the IndustryMonthlyLoop process. Thanks to frosch, for nice code ideas and rewrites
Diffstat (limited to 'src/economy.cpp')
-rw-r--r--src/economy.cpp54
1 files changed, 43 insertions, 11 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index ee9ada24b..a80ea602d 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -786,6 +786,27 @@ void SetPriceBaseMultiplier(uint price, byte factor)
price_base_multiplier[price] = factor;
}
+/**
+ * Initialize the variables that will maintain the daily industry change system.
+ * @param init_counter specifies if the counter is required to be initialized
+ */
+static void StartupIndustryDailyChanges(bool init_counter)
+{
+ uint map_size = MapLogX() + MapLogY();
+ /* After getting map size, it needs to be scaled appropriately and divided by 31,
+ * which stands for the days in a month.
+ * Using just 31 will make it so that a monthly reset (based on the real number of days of that month)
+ * would not be needed.
+ * Since it is based on "fractionnal parts", the leftover days will not make much of a difference
+ * on the overall total number of changes performed */
+ _economy.industry_daily_increment = (1 << map_size) / 31;
+
+ if (init_counter) {
+ /* A new game or a savegame from an older version will require the counter to be initialized */
+ _economy.industry_daily_change_counter = 0;
+ }
+}
+
void StartupEconomy()
{
int i;
@@ -816,6 +837,9 @@ void StartupEconomy()
_economy.infl_amount_pr = max(0, _settings_game.difficulty.initial_interest - 1);
_economy.max_loan_unround = _economy.max_loan = _settings_game.difficulty.max_loan;
_economy.fluct = GB(Random(), 0, 8) + 168;
+
+ StartupIndustryDailyChanges(true); // As we are starting a new game, initialize the counter too
+
}
void ResetEconomy()
@@ -1924,27 +1948,35 @@ static void SaveLoad_CAPR()
}
static const SaveLoad _economy_desc[] = {
- SLE_CONDVAR(Economy, max_loan, SLE_FILE_I32 | SLE_VAR_I64, 0, 64),
- SLE_CONDVAR(Economy, max_loan, SLE_INT64, 65, SL_MAX_VERSION),
- SLE_CONDVAR(Economy, max_loan_unround, SLE_FILE_I32 | SLE_VAR_I64, 0, 64),
- SLE_CONDVAR(Economy, max_loan_unround, SLE_INT64, 65, SL_MAX_VERSION),
- SLE_CONDVAR(Economy, max_loan_unround_fract, SLE_UINT16, 70, SL_MAX_VERSION),
- SLE_VAR(Economy, fluct, SLE_INT16),
- SLE_VAR(Economy, interest_rate, SLE_UINT8),
- SLE_VAR(Economy, infl_amount, SLE_UINT8),
- SLE_VAR(Economy, infl_amount_pr, SLE_UINT8),
+ SLE_CONDVAR(Economy, max_loan, SLE_FILE_I32 | SLE_VAR_I64, 0, 64),
+ SLE_CONDVAR(Economy, max_loan, SLE_INT64, 65, SL_MAX_VERSION),
+ SLE_CONDVAR(Economy, max_loan_unround, SLE_FILE_I32 | SLE_VAR_I64, 0, 64),
+ SLE_CONDVAR(Economy, max_loan_unround, SLE_INT64, 65, SL_MAX_VERSION),
+ SLE_CONDVAR(Economy, max_loan_unround_fract, SLE_UINT16, 70, SL_MAX_VERSION),
+ SLE_VAR(Economy, fluct, SLE_INT16),
+ SLE_VAR(Economy, interest_rate, SLE_UINT8),
+ SLE_VAR(Economy, infl_amount, SLE_UINT8),
+ SLE_VAR(Economy, infl_amount_pr, SLE_UINT8),
+ SLE_CONDVAR(Economy, industry_daily_change_counter, SLE_UINT32, 102, SL_MAX_VERSION),
SLE_END()
};
/** Economy variables */
-static void SaveLoad_ECMY()
+static void Save_ECMY()
+{
+ SlObject(&_economy, _economy_desc);
+}
+
+/** Economy variables */
+static void Load_ECMY()
{
SlObject(&_economy, _economy_desc);
+ StartupIndustryDailyChanges(CheckSavegameVersion(102)); // old savegames will need to be initialized
}
extern const ChunkHandler _economy_chunk_handlers[] = {
{ 'PRIC', SaveLoad_PRIC, SaveLoad_PRIC, CH_RIFF | CH_AUTO_LENGTH},
{ 'CAPR', SaveLoad_CAPR, SaveLoad_CAPR, CH_RIFF | CH_AUTO_LENGTH},
{ 'SUBS', Save_SUBS, Load_SUBS, CH_ARRAY},
- { 'ECMY', SaveLoad_ECMY, SaveLoad_ECMY, CH_RIFF | CH_LAST},
+ { 'ECMY', Save_ECMY, Load_ECMY, CH_RIFF | CH_LAST},
};