From 36a712a57950813034856bfa49fe6cb42dd7c772 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 20 Aug 2017 11:14:43 +0100 Subject: [PATCH] Add very and extremely slow options to town growth rate setting --- src/lang/english.txt | 2 ++ src/saveload/extended_ver_sl.cpp | 1 + src/saveload/extended_ver_sl.h | 1 + src/settings.cpp | 15 +++++++++++++++ src/settings_type.h | 2 +- src/table/settings.ini | 9 ++++++--- src/town_cmd.cpp | 15 +++++++++++++-- 7 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 7430138b64..67b284b8f0 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1727,6 +1727,8 @@ STR_CONFIG_SETTING_ZOOM_LVL_OUT_64X :64x STR_CONFIG_SETTING_ZOOM_LVL_OUT_128X :128x STR_CONFIG_SETTING_TOWN_GROWTH :Town growth speed: {STRING2} STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Speed of town growth +STR_CONFIG_SETTING_TOWN_GROWTH_EXTREME_SLOW :Extremely slow +STR_CONFIG_SETTING_TOWN_GROWTH_VERY_SLOW :Very slow STR_CONFIG_SETTING_TOWN_GROWTH_NONE :None STR_CONFIG_SETTING_TOWN_GROWTH_SLOW :Slow STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Normal diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index a757bf17eb..eebf8dd91c 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -77,6 +77,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_CUSTOM_BRIDGE_HEADS, XSCF_NULL, 1, 1, "custom_bridge_heads", NULL, NULL, NULL }, { XSLFI_CHUNNEL, XSCF_NULL, 1, 1, "chunnel", NULL, NULL, "TUNN" }, { XSLFI_SCHEDULED_DISPATCH, XSCF_NULL, 1, 1, "scheduled_dispatch", NULL, NULL, NULL }, + { XSLFI_MORE_TOWN_GROWTH_RATES, XSCF_NULL, 1, 1, "more_town_growth_rates", NULL, NULL, NULL }, { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 3333b0e9c3..dbd0b7e7c8 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -51,6 +51,7 @@ enum SlXvFeatureIndex { XSLFI_CUSTOM_BRIDGE_HEADS, ///< Custom bridge heads XSLFI_CHUNNEL, ///< Tunnels under water (channel tunnel) XSLFI_SCHEDULED_DISPATCH, ///< Scheduled vehicle dispatching + XSLFI_MORE_TOWN_GROWTH_RATES, ///< More town growth rates XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk diff --git a/src/settings.cpp b/src/settings.cpp index c7ecefab2c..521ee2cb5e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1445,6 +1445,21 @@ static bool UpdateClientConfigValues(int32 p1) /* End - Callback Functions */ +/* Begin - GUI order callbacks */ + +static int OrderTownGrowthRate(uint nth) +{ + if (nth == 0) { + return 0; + } else if (nth <= 2) { + return nth - 3; + } else { + return nth - 2; + } +} + +/* End - GUI order callbacks */ + /** * Prepare for reading and old diff_custom by zero-ing the memory. */ diff --git a/src/settings_type.h b/src/settings_type.h index b88b0bcc56..f2fae26dc9 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -540,7 +540,7 @@ struct EconomySettings { bool give_money; ///< allow giving other companies money bool mod_road_rebuild; ///< roadworks remove unnecessary RoadBits bool multiple_industry_per_town; ///< allow many industries of the same type per town - uint8 town_growth_rate; ///< town growth rate + int8 town_growth_rate; ///< town growth rate uint8 larger_towns; ///< the number of cities to build. These start off larger and grow twice as fast uint8 initial_city_size; ///< multiplier for the initial size of the cities compared to towns TownLayoutByte town_layout; ///< select town layout, @see TownLayout diff --git a/src/table/settings.ini b/src/table/settings.ini index 1de4aacadc..bea4de53fb 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -61,6 +61,8 @@ static bool CheckSharingAir(int32 p1); /* Begin - GUI order callbacks */ +static int OrderTownGrowthRate(uint nth); + /* End - GUI order callbacks */ /* Some settings do not need to be synchronised when playing in multiplayer. @@ -1738,15 +1740,16 @@ extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) [SDT_VAR] base = GameSettings var = economy.town_growth_rate -type = SLE_UINT8 +type = SLE_INT8 from = 54 guiflags = SGF_MULTISTRING def = 2 -min = 0 +min = -2 max = 4 str = STR_CONFIG_SETTING_TOWN_GROWTH strhelp = STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT -strval = STR_CONFIG_SETTING_TOWN_GROWTH_NONE +strval = STR_CONFIG_SETTING_TOWN_GROWTH_EXTREME_SLOW +orderproc = OrderTownGrowthRate [SDT_VAR] base = GameSettings diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 1fa286e595..a924edb506 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -3389,9 +3389,20 @@ static void UpdateTownGrowRate(Town *t) /* Use the normal growth rate values if new buildings have been funded in * this town and the growth rate is set to none. */ - uint growth_multiplier = _settings_game.economy.town_growth_rate != 0 ? _settings_game.economy.town_growth_rate - 1 : 1; + int growth_multiplier; + if (_settings_game.economy.town_growth_rate == 0) { + growth_multiplier = 1; + } else if (_settings_game.economy.town_growth_rate > 0) { + growth_multiplier = _settings_game.economy.town_growth_rate - 1; + } else { + growth_multiplier = _settings_game.economy.town_growth_rate; + } - m >>= growth_multiplier; + if (growth_multiplier < 0) { + m <<= (-growth_multiplier); + } else { + m >>= growth_multiplier; + } if (t->larger_town) m /= 2; t->growth_rate = m / (t->cache.num_houses / 50 + 1);