summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/saveload/saveload.cpp18
-rw-r--r--src/saveload/saveload.h1
-rw-r--r--src/settings.cpp10
3 files changed, 10 insertions, 19 deletions
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp
index 427a19aa9..35a6437e1 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);
@@ -1412,21 +1412,6 @@ static inline bool SlIsObjectValidInSavegame(const SaveLoad &sld)
}
/**
- * 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.
* @param slt The SaveLoad table with objects to save/load.
@@ -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 ce597affc..c178c4731 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 93caff15d..c2594277d 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<uint16>(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));