From 6d631d7a131f484f61568499fd77d6f5ef5e6cb2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 5 Mar 2025 17:58:03 +0000 Subject: [PATCH] Fix f8b1e30: Fix recent savegames may have incorrect EngineFlags saved. (#13745) Detect and update engines saved with invalid EngineFlags. --- src/saveload/afterload.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 792f28a846..14d2ecb76d 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3344,6 +3344,18 @@ bool AfterLoadGame() } } + if (!IsSavegameVersionBefore(SLV_INCREASE_HOUSE_LIMIT) && IsSavegameVersionBeforeOrAt(SLV_SCRIPT_SAVE_INSTANCES)) { + /* Between these two versions (actually from f8b1e303 to 77236258) EngineFlags had an off-by-one. Depending + * on when the save was started, this may or may not affect existing engines. Here we try to detect invalid flags + * and reset them to what they should be. */ + for (Engine *e : Engine::Iterate()) { + if (e->flags.Test(EngineFlag::Available)) continue; + if (e->flags.Test(EngineFlag{2}) || (e->flags.Test(EngineFlag::ExclusivePreview) && e->preview_asked.None())) { + e->flags = EngineFlags(e->flags.base() >> 1U); + } + } + } + for (Company *c : Company::Iterate()) { UpdateCompanyLiveries(c); }