Add feature array as parameter to SlXvIsFeaturePresent methods

This commit is contained in:
Jonathan G Rennison
2022-02-04 21:27:20 +00:00
parent 3353546966
commit bffff8e357
4 changed files with 31 additions and 13 deletions

View File

@@ -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. * 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 * 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; 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; 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) { switch (op) {
case XSLFTO_OR: 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 * 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); 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;
} }
/** /**

View File

@@ -153,7 +153,7 @@ enum SlXvFeatureTestOperator {
* Structure to describe an extended feature version test, and how it combines with a traditional savegame version test * Structure to describe an extended feature version test, and how it combines with a traditional savegame version test
*/ */
struct SlXvFeatureTest { 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: private:
uint16 min_version; uint16 min_version;
@@ -172,10 +172,20 @@ struct SlXvFeatureTest {
SlXvFeatureTest(TestFunctorPtr functor_) SlXvFeatureTest(TestFunctorPtr functor_)
: min_version(0), max_version(0), feature(XSLFI_NULL), op(XSLFTO_OR), functor(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) * 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); 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); const char *SlXvGetFeatureName(SlXvFeatureIndex feature);
/** /**

View File

@@ -674,11 +674,11 @@ SaveLoadTable GetVehicleDescription(VehicleType vt)
SLE_VAR(Vehicle, day_counter, SLE_UINT8), SLE_VAR(Vehicle, day_counter, SLE_UINT8),
SLE_VAR(Vehicle, tick_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 { 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(XSLFI_SPRINGPP, 3) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_CHILLPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); 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 { 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(XSLFI_SPRINGPP, 2) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_CHILLPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); 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), SLE_VAR(Vehicle, cur_implicit_order_index, SLE_VEHORDERID),

View File

@@ -1013,7 +1013,7 @@ var = linkgraph.recalc_not_scaled_by_daylength
def = true def = true
str = STR_CONFIG_SETTING_LINKGRAPH_NOT_DAYLENGTH_SCALED str = STR_CONFIG_SETTING_LINKGRAPH_NOT_DAYLENGTH_SCALED
strhelp = STR_CONFIG_SETTING_LINKGRAPH_NOT_DAYLENGTH_SCALED_HELPTEXT 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"" patxname = ""linkgraph_day_scale.linkgraph.recalc_not_scaled_by_daylength""
[SDT_ENUM] [SDT_ENUM]