From 3e299aa488b2e7fa0b7d1c2af87a6c1f960ef845 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 17 Nov 2023 22:53:02 +0000 Subject: [PATCH] Use upstream table chunk format for PATS --- src/saveload/settings_sl.cpp | 5 +-- src/settings.cpp | 55 +++++++++++++-------------------- src/settings_internal.h | 2 +- src/sl/extended_ver_sl.cpp | 6 +++- src/sl/extended_ver_sl.h | 2 ++ src/table/settings/settings.ini | 10 +++--- 6 files changed, 38 insertions(+), 42 deletions(-) diff --git a/src/saveload/settings_sl.cpp b/src/saveload/settings_sl.cpp index 3a807f2e0b..a3d31c6b10 100644 --- a/src/saveload/settings_sl.cpp +++ b/src/saveload/settings_sl.cpp @@ -36,7 +36,7 @@ static std::vector GetSettingsDesc(bool is_loading) std::vector 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 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); } diff --git a/src/settings.cpp b/src/settings.cpp index fae2eb64f5..9b9ee65b44 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -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 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 }, }; diff --git a/src/settings_internal.h b/src/settings_internal.h index 0cb3855c4b..4d30e2357e 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -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 }; diff --git a/src/sl/extended_ver_sl.cpp b/src/sl/extended_ver_sl.cpp index f0c661f730..c20051a878 100644 --- a/src/sl/extended_ver_sl.cpp +++ b/src/sl/extended_ver_sl.cpp @@ -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 }; /** diff --git a/src/sl/extended_ver_sl.h b/src/sl/extended_ver_sl.h index 9d52dbd0bf..1f6b17c874 100644 --- a/src/sl/extended_ver_sl.h +++ b/src/sl/extended_ver_sl.h @@ -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 diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index 5d28250dca..e8e743e9e8 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -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