summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/settings.cpp25
-rw-r--r--src/settings_type.h3
-rw-r--r--src/table/settings/gameopt_settings.ini1
-rw-r--r--src/table/settings/settings.ini18
4 files changed, 36 insertions, 11 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index 56c02e5e1..d39c04593 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -22,6 +22,7 @@
*/
#include "stdafx.h"
+#include <array>
#include <limits>
#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 39a73b3ed..802368384 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 849c731b6..f24adb17a 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<std::string, GAME_DIFFICULTY_NUM> _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 4f9ea607a..9281ed662 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