From bffff8e35773750bc0762710fd46a3bc4ffa340e Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 4 Feb 2022 21:27:20 +0000 Subject: [PATCH] Add feature array as parameter to SlXvIsFeaturePresent methods --- src/saveload/extended_ver_sl.cpp | 10 +++++----- src/saveload/extended_ver_sl.h | 24 +++++++++++++++++++++--- src/saveload/vehicle_sl.cpp | 8 ++++---- src/table/settings/settings.ini | 2 +- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index dd4e429e76..77bde8e69f 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -181,15 +181,15 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { * and return the combination of the two tests using the operator defined in the constructor. * Otherwise just returns the result of the savegame version test */ -bool SlXvFeatureTest::IsFeaturePresent(SaveLoadVersion savegame_version, SaveLoadVersion savegame_version_from, SaveLoadVersion savegame_version_to) const +bool SlXvFeatureTest::IsFeaturePresent(uint16 feature_versions[XSLFI_SIZE], SaveLoadVersion savegame_version, SaveLoadVersion savegame_version_from, SaveLoadVersion savegame_version_to) const { bool savegame_version_ok = savegame_version >= savegame_version_from && savegame_version < savegame_version_to; - if (this->functor) return (*this->functor)(savegame_version, savegame_version_ok); + if (this->functor) return (*this->functor)(savegame_version, savegame_version_ok, feature_versions); if (this->feature == XSLFI_NULL) return savegame_version_ok; - bool feature_ok = SlXvIsFeaturePresent(this->feature, this->min_version, this->max_version); + bool feature_ok = SlXvIsFeaturePresent(feature_versions, this->feature, this->min_version, this->max_version); switch (op) { case XSLFTO_OR: @@ -207,10 +207,10 @@ bool SlXvFeatureTest::IsFeaturePresent(SaveLoadVersion savegame_version, SaveLoa /** * Returns true if @p feature is present and has a version inclusively bounded by @p min_version and @p max_version */ -bool SlXvIsFeaturePresent(SlXvFeatureIndex feature, uint16 min_version, uint16 max_version) +bool SlXvIsFeaturePresent(uint16 feature_versions[XSLFI_SIZE], SlXvFeatureIndex feature, uint16 min_version, uint16 max_version) { assert(feature < XSLFI_SIZE); - return _sl_xv_feature_versions[feature] >= min_version && _sl_xv_feature_versions[feature] <= max_version; + return feature_versions[feature] >= min_version && feature_versions[feature] <= max_version; } /** diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 5bc452825d..e6c7b93245 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -153,7 +153,7 @@ enum SlXvFeatureTestOperator { * Structure to describe an extended feature version test, and how it combines with a traditional savegame version test */ struct SlXvFeatureTest { - using TestFunctorPtr = bool (*)(uint16, bool); ///< Return true if feature present, first parameter is standard savegame version, second is whether standard savegame version is within bounds + using TestFunctorPtr = bool (*)(uint16, bool, uint16[XSLFI_SIZE]); ///< Return true if feature present, first parameter is standard savegame version, second is whether standard savegame version is within bounds private: uint16 min_version; @@ -172,10 +172,20 @@ struct SlXvFeatureTest { SlXvFeatureTest(TestFunctorPtr functor_) : min_version(0), max_version(0), feature(XSLFI_NULL), op(XSLFTO_OR), functor(functor_) { } - bool IsFeaturePresent(SaveLoadVersion savegame_version, SaveLoadVersion savegame_version_from, SaveLoadVersion savegame_version_to) const; + bool IsFeaturePresent(uint16 feature_versions[XSLFI_SIZE], SaveLoadVersion savegame_version, SaveLoadVersion savegame_version_from, SaveLoadVersion savegame_version_to) const; + + inline bool IsFeaturePresent(SaveLoadVersion savegame_version, SaveLoadVersion savegame_version_from, SaveLoadVersion savegame_version_to) const + { + return this->IsFeaturePresent(_sl_xv_feature_versions, savegame_version, savegame_version_from, savegame_version_to); + } }; -bool SlXvIsFeaturePresent(SlXvFeatureIndex feature, uint16 min_version = 1, uint16 max_version = 0xFFFF); +bool SlXvIsFeaturePresent(uint16 feature_versions[XSLFI_SIZE], SlXvFeatureIndex feature, uint16 min_version = 1, uint16 max_version = 0xFFFF); + +inline bool SlXvIsFeaturePresent(SlXvFeatureIndex feature, uint16 min_version = 1, uint16 max_version = 0xFFFF) +{ + return SlXvIsFeaturePresent(_sl_xv_feature_versions, feature, min_version, max_version); +} /** * Returns true if @p feature is missing (i.e. has a version of 0, or less than the specified minimum version) @@ -185,6 +195,14 @@ inline bool SlXvIsFeatureMissing(SlXvFeatureIndex feature, uint16 min_version = return !SlXvIsFeaturePresent(feature, min_version); } +/** + * Returns true if @p feature is missing (i.e. has a version of 0, or less than the specified minimum version) + */ +inline bool SlXvIsFeatureMissing(uint16 feature_versions[XSLFI_SIZE], SlXvFeatureIndex feature, uint16 min_version = 1) +{ + return !SlXvIsFeaturePresent(feature_versions, feature, min_version); +} + const char *SlXvGetFeatureName(SlXvFeatureIndex feature); /** diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index d21356e51c..b3cfa16775 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -674,11 +674,11 @@ SaveLoadTable GetVehicleDescription(VehicleType vt) SLE_VAR(Vehicle, day_counter, SLE_UINT8), SLE_VAR(Vehicle, tick_counter, SLE_UINT8), - SLE_CONDVAR_X(Vehicle, running_ticks, SLE_FILE_U8 | SLE_VAR_U16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { - return version_in_range && !(SlXvIsFeaturePresent(XSLFI_SPRINGPP, 3) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_CHILLPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); + SLE_CONDVAR_X(Vehicle, running_ticks, SLE_FILE_U8 | SLE_VAR_U16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range, uint16 feature_versions[XSLFI_SIZE]) -> bool { + return version_in_range && !(SlXvIsFeaturePresent(feature_versions, XSLFI_SPRINGPP, 3) || SlXvIsFeaturePresent(feature_versions, XSLFI_JOKERPP) || SlXvIsFeaturePresent(feature_versions, XSLFI_CHILLPP) || SlXvIsFeaturePresent(feature_versions, XSLFI_VARIABLE_DAY_LENGTH, 2)); })), - SLE_CONDVAR_X(Vehicle, running_ticks, SLE_UINT16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { - return version_in_range && (SlXvIsFeaturePresent(XSLFI_SPRINGPP, 2) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_CHILLPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); + SLE_CONDVAR_X(Vehicle, running_ticks, SLE_UINT16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range, uint16 feature_versions[XSLFI_SIZE]) -> bool { + return version_in_range && (SlXvIsFeaturePresent(feature_versions, XSLFI_SPRINGPP, 2) || SlXvIsFeaturePresent(feature_versions, XSLFI_JOKERPP) || SlXvIsFeaturePresent(feature_versions, XSLFI_CHILLPP) || SlXvIsFeaturePresent(feature_versions, XSLFI_VARIABLE_DAY_LENGTH, 2)); })), SLE_VAR(Vehicle, cur_implicit_order_index, SLE_VEHORDERID), diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index ab7ff41619..b893187e73 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -1013,7 +1013,7 @@ var = linkgraph.recalc_not_scaled_by_daylength def = true str = STR_CONFIG_SETTING_LINKGRAPH_NOT_DAYLENGTH_SCALED strhelp = STR_CONFIG_SETTING_LINKGRAPH_NOT_DAYLENGTH_SCALED_HELPTEXT -extver = SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { return version_in_range && SlXvIsFeaturePresent(XSLFI_LINKGRAPH_DAY_SCALE) && !SlXvIsFeaturePresent(XSLFI_JOKERPP); }) +extver = SlXvFeatureTest([](uint16 version, bool version_in_range, uint16 feature_versions[XSLFI_SIZE]) -> bool { return version_in_range && SlXvIsFeaturePresent(feature_versions, XSLFI_LINKGRAPH_DAY_SCALE) && !SlXvIsFeaturePresent(feature_versions, XSLFI_JOKERPP); }) patxname = ""linkgraph_day_scale.linkgraph.recalc_not_scaled_by_daylength"" [SDT_ENUM]