diff --git a/src/saveload/league_sl.cpp b/src/saveload/league_sl.cpp index d762e9daab..4f70d34208 100644 --- a/src/saveload/league_sl.cpp +++ b/src/saveload/league_sl.cpp @@ -10,9 +10,14 @@ #include "saveload.h" +extern SaveLoadVersion _sl_xv_upstream_version; + struct GetLeagueChunkLoadInfo { - static SaveLoadVersion GetVersion() { return SLV_MULTITRACK_LEVEL_CROSSINGS; } + static SaveLoadVersion GetLoadVersion() + { + return _sl_xv_upstream_version != SL_MIN_VERSION ? _sl_xv_upstream_version : SLV_MULTITRACK_LEVEL_CROSSINGS; + } }; static const ChunkHandler league_chunk_handlers[] = { diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index b64c956569..b208ab43d9 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2298,8 +2298,10 @@ static void SlSaveChunk(const ChunkHandler &ch) if (ch.type == CH_UPSTREAM_SAVE) { SaveLoadVersion old_ver = _sl_version; _sl_version = MAX_LOAD_SAVEGAME_VERSION; + auto guard = scope_guard([&]() { + _sl_version = old_ver; + }); upstream_sl::SlSaveChunkChunkByID(ch.id); - _sl_version = old_ver; return; } diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index cc49a57f95..512ba0bcd9 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -14,6 +14,7 @@ #include "../fileio_type.h" #include "../fios.h" #include "../strings_type.h" +#include "../scope.h" #include #include @@ -112,8 +113,10 @@ void SlExecWithSlVersion(SaveLoadVersion use_version, F proc) extern SaveLoadVersion _sl_version; SaveLoadVersion old_ver = _sl_version; _sl_version = use_version; + auto guard = scope_guard([&]() { + _sl_version = old_ver; + }); proc(); - _sl_version = old_ver; } namespace upstream_sl { @@ -129,7 +132,7 @@ namespace upstream_sl { nullptr, SlUnreachablePlaceholder, []() { - SlExecWithSlVersion(F::GetVersion(), []() { + SlExecWithSlVersion(F::GetLoadVersion(), []() { SlFixPointerChunkByID(id); }); }, @@ -140,12 +143,12 @@ namespace upstream_sl { assert(id == chunk_id); switch (op) { case CSLSO_PRE_LOAD: - SlExecWithSlVersion(F::GetVersion(), []() { + SlExecWithSlVersion(F::GetLoadVersion(), []() { SlLoadChunkByID(id); }); break; case CSLSO_PRE_LOADCHECK: - SlExecWithSlVersion(F::GetVersion(), []() { + SlExecWithSlVersion(F::GetLoadVersion(), []() { SlLoadCheckChunkByID(id); }); break;