From 264991dfa506c0bdebb2e2c936f79a2412dad442 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 4 Jun 2021 09:31:28 +0200 Subject: [PATCH] Codechange: move SLF_NO_NETWORK_SYNC into settings It is a settings-only flag, so don't pollute SaveLoad code with it. --- src/saveload/saveload.cpp | 18 +----------------- src/saveload/saveload.h | 1 + src/settings.cpp | 10 ++++++++-- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 427a19aa95..35a6437e18 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -584,7 +584,7 @@ static inline uint SlGetArrayLength(size_t length) * @param conv VarType type of variable that is used for calculating the size * @return Return the size of this type in bytes */ -static inline uint SlCalcConvMemLen(VarType conv) +uint SlCalcConvMemLen(VarType conv) { static const byte conv_mem_size[] = {1, 1, 1, 2, 2, 4, 4, 8, 8, 0}; byte length = GB(conv, 4, 4); @@ -1411,21 +1411,6 @@ static inline bool SlIsObjectValidInSavegame(const SaveLoad &sld) return (_sl_version >= sld.version_from && _sl_version < sld.version_to); } -/** - * Are we going to load this variable when loading a savegame or not? - * @note If the variable is skipped it is skipped in the savegame - * bytestream itself as well, so there is no need to skip it somewhere else - */ -static inline bool SlSkipVariableOnLoad(const SaveLoad &sld) -{ - if ((sld.conv & SLF_NO_NETWORK_SYNC) && _sl.action != SLA_SAVE && _networking && !_network_server) { - SlSkipBytes(SlCalcConvMemLen(sld.conv) * sld.length); - return true; - } - - return false; -} - /** * Calculate the size of an object. * @param object to be measured. @@ -1538,7 +1523,6 @@ bool SlObjectMember(void *ptr, const SaveLoad &sld) case SL_STDSTR: /* CONDITIONAL saveload types depend on the savegame version */ if (!SlIsObjectValidInSavegame(sld)) return false; - if (SlSkipVariableOnLoad(sld)) return false; switch (sld.cmd) { case SL_VAR: SlSaveLoadConv(ptr, conv); break; diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index ce597affc4..c178c47313 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -896,6 +896,7 @@ void WriteValue(void *ptr, VarType conv, int64 val); void SlSetArrayIndex(uint index); int SlIterateArray(); +uint SlCalcConvMemLen(VarType conv); void SlAutolength(AutolengthProc *proc, void *arg); size_t SlGetFieldLength(); void SlSetLength(size_t length); diff --git a/src/settings.cpp b/src/settings.cpp index 93caff15dd..c2594277d6 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2025,9 +2025,15 @@ static void LoadSettings(const SettingTable &settings, void *object) for (auto &osd : settings) { if (osd->save.conv & SLF_NOT_IN_SAVE) continue; - void *ptr = GetVariableAddress(object, osd->save); + SaveLoad sl = osd->save; + if ((osd->save.conv & SLF_NO_NETWORK_SYNC) && _networking && !_network_server) { + /* We don't want to read this setting, so we do need to skip over it. */ + sl = SLE_NULL(static_cast(SlCalcConvMemLen(osd->save.conv) * osd->save.length)); + } + + void *ptr = GetVariableAddress(object, sl); + if (!SlObjectMember(ptr, sl)) continue; - if (!SlObjectMember(ptr, osd->save)) continue; if (osd->IsIntSetting()) { const IntSettingDesc *int_setting = osd->AsIntSetting(); int_setting->MakeValueValidAndWrite(object, int_setting->Read(object));