Use upstream table chunk format for PATS
This commit is contained in:
@@ -36,7 +36,7 @@ static std::vector<SaveLoad> GetSettingsDesc(bool is_loading)
|
||||
std::vector<SaveLoad> saveloads;
|
||||
for (auto &sd : GetSettingsTableInternal()) {
|
||||
if (sd->flags & SF_NOT_IN_SAVE) continue;
|
||||
if (sd->patx_name != nullptr && !(is_loading && (sd->flags & SF_ENABLE_UPSTREAM_LOAD))) continue;
|
||||
if (sd->patx_name != nullptr && !(sd->flags & SF_ENABLE_TABLE_PATS)) continue;
|
||||
if (!sd->save.ext_feature_test.IsFeaturePresent(_sl_version, sd->save.version_from, sd->save.version_to)) continue;
|
||||
|
||||
VarType new_type = 0;
|
||||
@@ -118,7 +118,8 @@ static std::vector<SaveLoad> GetSettingsDesc(bool is_loading)
|
||||
error("Unexpected save conv for %s: 0x%02X", sd->name, sd->save.conv);
|
||||
}
|
||||
|
||||
if (strcmp(sd->name, "economy.town_growth_rate") == 0) {
|
||||
/* economy.town_growth_rate is int8 here, but uint8 in upstream saves */
|
||||
if (is_loading && !SlXvIsFeaturePresent(XSLFI_TABLE_PATS) && strcmp(sd->name, "economy.town_growth_rate") == 0) {
|
||||
SB(new_type, 0, 4, SLE_FILE_U8);
|
||||
}
|
||||
|
||||
|
@@ -3166,33 +3166,6 @@ static void LoadSettings(const SettingTable &settings, void *object)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save and load handler for settings, except for those which go in the PATX chunk
|
||||
* @param settings SettingDesc struct containing all information
|
||||
* @param object can be either nullptr in which case we load global variables or
|
||||
* a pointer to a struct which is getting saved
|
||||
*/
|
||||
static void SaveSettings(const SettingTable &settings, void *object)
|
||||
{
|
||||
/* We need to write the CH_RIFF header, but unfortunately can't call
|
||||
* SlCalcLength() because we have a different format. So do this manually */
|
||||
size_t length = 0;
|
||||
for (auto &sd : settings) {
|
||||
if (sd->flags & SF_NOT_IN_SAVE) continue;
|
||||
if (sd->patx_name != nullptr) continue;
|
||||
if (sd->xref.target != nullptr) continue;
|
||||
length += SlCalcObjMemberLength(object, sd->save);
|
||||
}
|
||||
SlSetLength(length);
|
||||
|
||||
for (auto &sd : settings) {
|
||||
if (sd->flags & SF_NOT_IN_SAVE) continue;
|
||||
if (sd->patx_name != nullptr) continue;
|
||||
if (sd->xref.target != nullptr) continue;
|
||||
SlObjectMember(object, sd->save);
|
||||
}
|
||||
}
|
||||
|
||||
/** @file
|
||||
*
|
||||
* The PATX chunk stores additional settings in an unordered format
|
||||
@@ -3220,6 +3193,7 @@ static std::vector<const SettingDesc *> MakeSettingsPatxList(const SettingTable
|
||||
|
||||
for (auto &sd : settings) {
|
||||
if (sd->patx_name == nullptr) continue;
|
||||
if ((sd->flags & SF_ENABLE_TABLE_PATS) && SlXvIsFeaturePresent(XSLFI_TABLE_PATS)) continue;
|
||||
sorted_patx_settings.push_back(sd.get());
|
||||
}
|
||||
|
||||
@@ -3331,6 +3305,7 @@ static void SaveSettingsPatx(const SettingTable &settings, void *object)
|
||||
size_t length = 8;
|
||||
for (auto &sd : settings) {
|
||||
if (sd->patx_name == nullptr) continue;
|
||||
if (sd->flags & SF_ENABLE_TABLE_PATS) continue;
|
||||
uint32 setting_length = (uint32)SlCalcObjMemberLength(object, sd->save);
|
||||
if (!setting_length) continue;
|
||||
|
||||
@@ -3542,11 +3517,6 @@ static void Check_PATS()
|
||||
LoadSettings(_settings, &_load_check_data.settings);
|
||||
}
|
||||
|
||||
static void Save_PATS()
|
||||
{
|
||||
SaveSettings(_settings, &_settings_game);
|
||||
}
|
||||
|
||||
static void Load_PATX()
|
||||
{
|
||||
LoadSettingsPatx(_settings, &_settings_game);
|
||||
@@ -3562,9 +3532,28 @@ static void Save_PATX()
|
||||
SaveSettingsPatx(_settings, &_settings_game);
|
||||
}
|
||||
|
||||
struct PATSChunkInfo
|
||||
{
|
||||
static SaveLoadVersion GetLoadVersion()
|
||||
{
|
||||
extern SaveLoadVersion _sl_xv_upstream_version;
|
||||
return _sl_xv_upstream_version;
|
||||
}
|
||||
|
||||
static bool SaveUpstream()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool LoadUpstream()
|
||||
{
|
||||
return SlXvIsFeaturePresent(XSLFI_TABLE_PATS);
|
||||
}
|
||||
};
|
||||
|
||||
static const ChunkHandler setting_chunk_handlers[] = {
|
||||
{ 'OPTS', nullptr, Load_OPTS, nullptr, nullptr, CH_RIFF },
|
||||
{ 'PATS', Save_PATS, Load_PATS, nullptr, Check_PATS, CH_RIFF },
|
||||
MakeConditionallyUpstreamChunkHandler<'PATS', PATSChunkInfo>(nullptr, Load_PATS, nullptr, Check_PATS, CH_RIFF),
|
||||
{ 'PATX', Save_PATX, Load_PATX, nullptr, Check_PATX, CH_RIFF },
|
||||
};
|
||||
|
||||
|
@@ -41,7 +41,7 @@ enum SettingFlag : uint32 {
|
||||
SF_GUI_ADVISE_DEFAULT = 1 << 19, ///< Advise the user to leave this setting at its default value
|
||||
SF_ENUM_PRE_CB_VALIDATE = 1 << 20, ///< Call the pre_check callback for enum incoming value validation
|
||||
SF_CONVERT_BOOL_TO_INT = 1 << 21, ///< Accept a boolean value when loading an int-type setting from the config file
|
||||
SF_ENABLE_UPSTREAM_LOAD = 1 << 22, ///< Enable loading from upstream mode savegames even when patx_name is set
|
||||
SF_ENABLE_TABLE_PATS = 1 << 22, ///< Enable saving/loading from table mode PATS chunks even when patx_name is set
|
||||
SF_PRIVATE = 1 << 23, ///< Setting is in private ini
|
||||
SF_SECRET = 1 << 24, ///< Setting is in secrets ini
|
||||
};
|
||||
|
@@ -193,6 +193,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
||||
{ XSLFI_VARIABLE_TICK_RATE, XSCF_IGNORABLE_ALL, 1, 1, "variable_tick_rate", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_ROAD_VEH_FLAGS, XSCF_NULL, 1, 1, "road_veh_flags", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_STATION_TILE_CACHE_FLAGS, XSCF_IGNORABLE_ALL, 1, 1, "station_tile_cache_flags", saveSTC, loadSTC, nullptr },
|
||||
|
||||
{ XSLFI_SCRIPT_INT64, XSCF_NULL, 1, 1, "script_int64", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_U64_TICK_COUNTER, XSCF_NULL, 1, 1, "u64_tick_counter", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_LINKGRAPH_TRAVEL_TIME, XSCF_NULL, 1, 1, "linkgraph_travel_time", nullptr, nullptr, nullptr },
|
||||
@@ -207,7 +208,10 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
||||
{ XSLFI_SAVEGAME_ID, XSCF_NULL, 1, 1, "slv_savegame_id", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_NEWGRF_LAST_SERVICE, XSCF_NULL, 1, 1, "slv_newgrf_last_service", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_CARGO_TRAVELLED, XSCF_NULL, 1, 1, "slv_cargo_travelled", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_NULL, XSCF_NULL, 0, 0, nullptr, nullptr, nullptr, nullptr },// This is the end marker
|
||||
|
||||
{ XSLFI_TABLE_PATS, XSCF_NULL, 1, 1, "table_pats", nullptr, nullptr, nullptr },
|
||||
|
||||
{ XSLFI_NULL, XSCF_NULL, 0, 0, nullptr, nullptr, nullptr, nullptr }, // This is the end marker
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -158,6 +158,8 @@ enum SlXvFeatureIndex {
|
||||
XSLFI_NEWGRF_LAST_SERVICE, ///< See: SLV_NEWGRF_LAST_SERVICE (PR #11124)
|
||||
XSLFI_CARGO_TRAVELLED, ///< See: SLV_CARGO_TRAVELLED (PR #11283)
|
||||
|
||||
XSLFI_TABLE_PATS, ///< Use upstream table format for PATS
|
||||
|
||||
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
|
||||
XSLFI_ZPOS_32_BIT, ///< Vehicle/sign z_pos is 32 bit instead of 8 bit, but savegame version may be before this became true in trunk
|
||||
|
@@ -210,7 +210,7 @@ cat = SC_BASIC
|
||||
[SDT_VAR]
|
||||
var = difficulty.competitors_interval
|
||||
type = SLE_UINT16
|
||||
flags = SF_ENABLE_UPSTREAM_LOAD
|
||||
flags = SF_ENABLE_TABLE_PATS
|
||||
def = 10
|
||||
min = MIN_COMPETITORS_INTERVAL
|
||||
max = MAX_COMPETITORS_INTERVAL
|
||||
@@ -741,7 +741,7 @@ patxname = ""buy_land_rate_limit.construction.purchase_land_frame_burst""
|
||||
[SDT_VAR]
|
||||
var = construction.build_object_per_64k_frames
|
||||
type = SLE_UINT32
|
||||
flags = SF_ENABLE_UPSTREAM_LOAD
|
||||
flags = SF_ENABLE_TABLE_PATS
|
||||
def = 32 << 16
|
||||
min = 0
|
||||
max = 1 << 30
|
||||
@@ -752,7 +752,7 @@ patxname = ""build_object_rate_limit.construction.build_object_per_64k_frames""
|
||||
[SDT_VAR]
|
||||
var = construction.build_object_frame_burst
|
||||
type = SLE_UINT16
|
||||
flags = SF_ENABLE_UPSTREAM_LOAD
|
||||
flags = SF_ENABLE_TABLE_PATS
|
||||
def = 2048
|
||||
min = 0
|
||||
max = 1 << 15
|
||||
@@ -4018,7 +4018,7 @@ cat = SC_BASIC
|
||||
[SDT_VAR]
|
||||
var = game_creation.custom_industry_number
|
||||
type = SLE_UINT16
|
||||
flags = SF_ENABLE_UPSTREAM_LOAD
|
||||
flags = SF_ENABLE_TABLE_PATS
|
||||
def = 1
|
||||
min = 1
|
||||
max = 64000
|
||||
@@ -4328,7 +4328,7 @@ strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL
|
||||
var = locale.units_velocity_nautical
|
||||
type = SLE_UINT8
|
||||
from = SLV_VELOCITY_NAUTICAL
|
||||
flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN | SF_ENABLE_UPSTREAM_LOAD
|
||||
flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN | SF_ENABLE_TABLE_PATS
|
||||
def = 1
|
||||
max = 4
|
||||
full = _locale_units
|
||||
|
Reference in New Issue
Block a user