From 435e012286372050f0e9b1e9cf4be4258079e021 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 11 May 2021 22:18:02 +0100 Subject: [PATCH] Fix loading of old park files --- src/openrct2/ParkFile.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/openrct2/ParkFile.cpp b/src/openrct2/ParkFile.cpp index d1ebc969c3..ae0f0bd892 100644 --- a/src/openrct2/ParkFile.cpp +++ b/src/openrct2/ParkFile.cpp @@ -850,8 +850,7 @@ namespace OpenRCT2 auto banner = GetBanner(i); if (banner != nullptr) { - cs.Write(i); - ReadWriteBanner(cs, *banner); + ReadWriteBanner(version, cs, *banner); numWritten++; } } @@ -862,10 +861,16 @@ namespace OpenRCT2 { if (version == 0) { - for (BannerIndex i = 0; i < MAX_BANNERS; i++) + std::vector banners; + cs.ReadWriteVector(banners, [version, &cs](Banner& banner) { ReadWriteBanner(version, cs, banner); }); + for (size_t i = 0; i < banners.size(); i++) { auto banner = GetOrCreateBanner(i); - ReadWriteBanner(cs, *banner); + if (banner != nullptr) + { + *banner = std::move(banners[i]); + banner->id = static_cast(i); + } } } else @@ -873,15 +878,17 @@ namespace OpenRCT2 auto numBanners = cs.Read(); for (size_t i = 0; i < numBanners; i++) { - auto bannerIndex = cs.Read(); - auto banner = GetOrCreateBanner(bannerIndex); + Banner readBanner; + ReadWriteBanner(version, cs, readBanner); + + auto banner = GetOrCreateBanner(readBanner.id); if (banner == nullptr) { throw std::runtime_error("Invalid banner index"); } else { - ReadWriteBanner(cs, *banner); + *banner = std::move(readBanner); } } } @@ -889,8 +896,12 @@ namespace OpenRCT2 }); } - void ReadWriteBanner(OrcaStream::ChunkStream& cs, Banner& banner) + static void ReadWriteBanner(uint32_t version, OrcaStream::ChunkStream& cs, Banner& banner) { + if (version >= 1) + { + cs.ReadWrite(banner.id); + } cs.ReadWrite(banner.type); cs.ReadWrite(banner.flags); cs.ReadWrite(banner.text);