diff --git a/src/settings.cpp b/src/settings.cpp index 56c02e5e19..d39c045938 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -22,6 +22,7 @@ */ #include "stdafx.h" +#include #include #include "currency.h" #include "screenshot.h" @@ -1227,7 +1228,9 @@ static void PrepareOldDiffCustom() */ static void HandleOldDiffCustom(bool savegame) { - uint options_to_load = GAME_DIFFICULTY_NUM - ((savegame && IsSavegameVersionBefore(SLV_4)) ? 1 : 0); + /* Savegames before v4 didn't have "town_council_tolerance" in savegame yet. */ + bool has_no_town_council_tolerance = savegame && IsSavegameVersionBefore(SLV_4); + uint options_to_load = GAME_DIFFICULTY_NUM - (has_no_town_council_tolerance ? 1 : 0); if (!savegame) { /* If we did read to old_diff_custom, then at least one value must be non 0. */ @@ -1239,11 +1242,21 @@ static void HandleOldDiffCustom(bool savegame) if (!old_diff_custom_used) return; } - for (uint i = 0; i < options_to_load; i++) { - const SettingDesc *sd = GetSettingDescription(i); - /* Skip deprecated options */ - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) continue; - int32 value = (int32)((i == 4 ? 1000 : 1) * _old_diff_custom[i]); + /* Iterate over all the old difficulty settings, and convert the list-value to the new setting. */ + uint i = 0; + for (const auto &name : _old_diff_settings) { + if (has_no_town_council_tolerance && name == "town_council_tolerance") continue; + + std::string fullname = "difficulty." + name; + const SettingDesc *sd = GetSettingFromName(fullname.c_str()); + + /* Some settings are no longer in use; skip reading those. */ + if (sd == nullptr) { + i++; + continue; + } + + int32 value = (int32)((name == "max_loan" ? 1000 : 1) * _old_diff_custom[i++]); sd->AsIntSetting()->MakeValueValidAndWrite(savegame ? &_settings_game : &_settings_newgame, value); } } diff --git a/src/settings_type.h b/src/settings_type.h index 39a73b3ed9..8023683848 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -61,6 +61,9 @@ enum IndustryDensity { /** Settings related to the difficulty of the game */ struct DifficultySettings { + byte competitor_start_time; ///< Unused value, used to load old savegames. + byte competitor_intelligence; ///< Unused value, used to load old savegames. + byte max_no_competitors; ///< the number of competitors (AIs) byte number_towns; ///< the amount of towns byte industry_density; ///< The industry density. @see IndustryDensity diff --git a/src/table/settings/gameopt_settings.ini b/src/table/settings/gameopt_settings.ini index 849c731b67..f24adb17a6 100644 --- a/src/table/settings/gameopt_settings.ini +++ b/src/table/settings/gameopt_settings.ini @@ -15,6 +15,7 @@ [pre-amble] static const uint GAME_DIFFICULTY_NUM = 18; +static const std::array _old_diff_settings{"max_no_competitors", "competitor_start_time", "number_towns", "industry_density", "max_loan", "initial_interest", "vehicle_costs", "competitor_speed", "competitor_intelligence", "vehicle_breakdowns", "subsidy_multiplier", "construction_cost", "terrain_type", "quantity_sea_lakes", "economy", "line_reverse_mode", "disasters", "town_council_tolerance"}; static uint16 _old_diff_custom[GAME_DIFFICULTY_NUM]; uint8 _old_diff_level; ///< Old difficulty level from old savegames uint8 _old_units; ///< Old units from old savegames diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index 4f9ea607ab..9281ed6624 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -94,7 +94,7 @@ startup = false ; Saved settings variables. -; Do not ADD or REMOVE something in this "difficulty.XXX" table or before it. It breaks savegame compatibility. +; The next 18 entries are important for savegame compatibility. Do NOT remove those. See HandleOldDiffCustom() for more details. [SDT_VAR] var = difficulty.max_no_competitors type = SLE_UINT8 @@ -106,10 +106,14 @@ interval = 1 post_cb = MaxNoAIsChange cat = SC_BASIC -[SDT_NULL] -length = 1 +[SDT_VAR] +var = difficulty.competitor_start_time +type = SLE_UINT8 from = SLV_97 to = SLV_110 +def = 2 +min = 0 +max = 3 [SDT_VAR] var = difficulty.number_towns @@ -192,10 +196,14 @@ strhelp = STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT strval = STR_AI_SPEED_VERY_SLOW cat = SC_BASIC -[SDT_NULL] -length = 1 +[SDT_VAR] +var = difficulty.competitor_intelligence +type = SLE_UINT8 from = SLV_97 to = SLV_110 +def = 0 +min = 0 +max = 2 [SDT_VAR] var = difficulty.vehicle_breakdowns