diff --git a/src/openrct2/management/NewsItem.cpp b/src/openrct2/management/NewsItem.cpp index f1cc1f0934..855348b7d2 100644 --- a/src/openrct2/management/NewsItem.cpp +++ b/src/openrct2/management/NewsItem.cpp @@ -484,3 +484,23 @@ void News::RemoveItem(int32_t index) } gameState.NewsItems[newsBoundary - 1].Type = News::ItemType::Null; } + +void News::importNewsItems( + GameState_t& gameState, const std::vector& recent, const std::vector& archived) +{ + gameState.NewsItems.Clear(); + + for (size_t i = 0; i < std::min(recent.size(), News::ItemHistoryStart); i++) + { + gameState.NewsItems[i] = recent[i]; + } + size_t offset = News::ItemHistoryStart; + for (size_t i = 0; i < std::min(archived.size(), News::MaxItemsArchive); i++) + { + gameState.NewsItems[offset + i] = archived[i]; + } + + // Still need to set the correct type to properly terminate the queue + if (archived.size() < News::MaxItemsArchive) + gameState.NewsItems[offset + archived.size()].Type = News::ItemType::Null; +} diff --git a/src/openrct2/management/NewsItem.h b/src/openrct2/management/NewsItem.h index 8e850b2a89..00efbade45 100644 --- a/src/openrct2/management/NewsItem.h +++ b/src/openrct2/management/NewsItem.h @@ -18,10 +18,16 @@ #include #include #include +#include struct CoordsXYZ; class Formatter; +namespace OpenRCT2 +{ + struct GameState_t; +} + namespace OpenRCT2::News { enum class ItemType : uint8_t @@ -315,4 +321,7 @@ namespace OpenRCT2::News void AddItemToQueue(News::Item* newNewsItem); void RemoveItem(int32_t index); + + void importNewsItems( + GameState_t& gameState, const std::vector& recent, const std::vector& archived); } // namespace OpenRCT2::News diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index fc5356d344..6c5c1d27c4 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -1129,26 +1129,13 @@ namespace OpenRCT2 os.ReadWriteChunk(ParkFileChunkType::NOTIFICATIONS, [&gameState](OrcaStream::ChunkStream& cs) { if (cs.GetMode() == OrcaStream::Mode::READING) { - gameState.NewsItems.Clear(); - std::vector recent; cs.ReadWriteVector(recent, [&cs](News::Item& item) { ReadWriteNewsItem(cs, item); }); - for (size_t i = 0; i < std::min(recent.size(), News::ItemHistoryStart); i++) - { - gameState.NewsItems[i] = recent[i]; - } std::vector archived; cs.ReadWriteVector(archived, [&cs](News::Item& item) { ReadWriteNewsItem(cs, item); }); - size_t offset = News::ItemHistoryStart; - for (size_t i = 0; i < std::min(archived.size(), News::MaxItemsArchive); i++) - { - gameState.NewsItems[offset + i] = archived[i]; - } - // Still need to set the correct type to properly terminate the queue - if (archived.size() < News::MaxItemsArchive) - gameState.NewsItems[offset + archived.size()].Type = News::ItemType::Null; + News::importNewsItems(gameState, recent, archived); } else {