diff --git a/src/openrct2/ParkImporter.h b/src/openrct2/ParkImporter.h
index 9132761e65..ea29ee0282 100644
--- a/src/openrct2/ParkImporter.h
+++ b/src/openrct2/ParkImporter.h
@@ -23,6 +23,7 @@ namespace OpenRCT2
{
struct IStream;
struct GameState_t;
+ struct ParkPreview;
} // namespace OpenRCT2
struct ScenarioIndexEntry;
@@ -58,6 +59,7 @@ public:
virtual void Import(OpenRCT2::GameState_t& gameState) = 0;
virtual bool PopulateIndexEntry(ScenarioIndexEntry* dst) = 0;
+ virtual OpenRCT2::ParkPreview GetParkPreview() = 0;
};
namespace OpenRCT2::ParkImporter
diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj
index fab2e94f6d..567a99d60e 100644
--- a/src/openrct2/libopenrct2.vcxproj
+++ b/src/openrct2/libopenrct2.vcxproj
@@ -391,6 +391,7 @@
+
@@ -1014,6 +1015,7 @@
+
diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp
index 4bb6aee695..d8939f894a 100644
--- a/src/openrct2/park/ParkFile.cpp
+++ b/src/openrct2/park/ParkFile.cpp
@@ -59,6 +59,7 @@
#include "../world/tile_element/SmallSceneryElement.h"
#include "../world/tile_element/TrackElement.h"
#include "Legacy.h"
+#include "ParkPreview.h"
#include
#include
@@ -94,6 +95,7 @@ namespace OpenRCT2
constexpr uint32_t CHEATS = 0x36;
constexpr uint32_t RESTRICTED_OBJECTS = 0x37;
constexpr uint32_t PLUGIN_STORAGE = 0x38;
+ constexpr uint32_t PREVIEW = 0x39;
constexpr uint32_t PACKED_OBJECTS = 0x80;
// clang-format on
}; // namespace ParkFileChunkType
@@ -196,6 +198,7 @@ namespace OpenRCT2
ReadWriteCheatsChunk(gameState, os);
ReadWriteRestrictedObjectsChunk(gameState, os);
ReadWritePluginStorageChunk(gameState, os);
+ ReadWritePreviewChunk(gameState, os);
ReadWritePackedObjectsChunk(os);
}
@@ -235,6 +238,24 @@ namespace OpenRCT2
return entry;
}
+ ParkPreview ReadPreviewChunk()
+ {
+ ParkPreview preview{};
+ auto& os = *_os;
+ os.ReadWriteChunk(ParkFileChunkType::PREVIEW, [&preview](OrcaStream::ChunkStream& cs) {
+ cs.ReadWrite(preview.parkName);
+ cs.ReadWrite(preview.parkRating);
+ cs.ReadWrite(preview.year);
+ cs.ReadWrite(preview.month);
+ cs.ReadWrite(preview.day);
+ cs.ReadWrite(preview.parkUsesMoney);
+ cs.ReadWrite(preview.cash);
+ cs.ReadWrite(preview.numRides);
+ cs.ReadWrite(preview.numGuests);
+ });
+ return preview;
+ }
+
private:
static uint8_t GetMinCarsPerTrain(uint8_t value)
{
@@ -477,6 +498,23 @@ namespace OpenRCT2
});
}
+ void ReadWritePreviewChunk(GameState_t& gameState, OrcaStream& os)
+ {
+ os.ReadWriteChunk(ParkFileChunkType::PREVIEW, [&gameState](OrcaStream::ChunkStream& cs) {
+ auto preview = OpenRCT2::generatePreviewFromGameState(gameState);
+
+ cs.ReadWrite(preview.parkName);
+ cs.ReadWrite(preview.parkRating);
+ cs.ReadWrite(preview.year);
+ cs.ReadWrite(preview.month);
+ cs.ReadWrite(preview.day);
+ cs.ReadWrite(preview.parkUsesMoney);
+ cs.ReadWrite(preview.cash);
+ cs.ReadWrite(preview.numRides);
+ cs.ReadWrite(preview.numGuests);
+ });
+ }
+
void ReadWriteGeneralChunk(GameState_t& gameState, OrcaStream& os)
{
const auto version = os.GetHeader().TargetVersion;
@@ -2745,6 +2783,11 @@ public:
*dst = _parkFile->ReadScenarioChunk();
return true;
}
+
+ ParkPreview GetParkPreview() override
+ {
+ return _parkFile->ReadPreviewChunk();
+ }
};
std::unique_ptr ParkImporter::CreateParkFile(IObjectRepository& objectRepository)
diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h
index 8abc895438..91d0d7c803 100644
--- a/src/openrct2/park/ParkFile.h
+++ b/src/openrct2/park/ParkFile.h
@@ -20,7 +20,7 @@ namespace OpenRCT2
struct GameState_t;
// Current version that is saved.
- constexpr uint32_t kParkFileCurrentVersion = 51;
+ constexpr uint32_t kParkFileCurrentVersion = 52;
// The minimum version that is forwards compatible with the current version.
constexpr uint32_t kParkFileMinVersion = 51;
@@ -48,6 +48,7 @@ namespace OpenRCT2
constexpr uint16_t kExtendedStandUpRollerCoasterVersion = 48;
constexpr uint16_t kPeepAnimationObjectsVersion = 49;
constexpr uint16_t kDiagonalLongFlatToSteepAndDiveLoopVersion = 50;
+ constexpr uint16_t kEmbeddedParkPreviewChunk = 52;
} // namespace OpenRCT2
class ParkFileExporter
diff --git a/src/openrct2/park/ParkPreview.cpp b/src/openrct2/park/ParkPreview.cpp
new file mode 100644
index 0000000000..094e74daa2
--- /dev/null
+++ b/src/openrct2/park/ParkPreview.cpp
@@ -0,0 +1,34 @@
+/*****************************************************************************
+ * Copyright (c) 2014-2025 OpenRCT2 developers
+ *
+ * For a complete list of all authors, please refer to contributors.md
+ * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
+ *
+ * OpenRCT2 is licensed under the GNU General Public License version 3.
+ *****************************************************************************/
+
+#include "ParkPreview.h"
+
+#include "../Context.h"
+#include "../GameState.h"
+#include "../ride/RideManager.hpp"
+
+namespace OpenRCT2
+{
+ ParkPreview generatePreviewFromGameState(const GameState_t& gameState)
+ {
+ ParkPreview preview{
+ .parkName = gameState.Park.Name,
+ .parkRating = gameState.Park.Rating,
+ .year = gameState.Date.GetYear(),
+ .month = gameState.Date.GetMonth(),
+ .day = gameState.Date.GetDay(),
+ .parkUsesMoney = !(gameState.Park.Flags & PARK_FLAGS_NO_MONEY),
+ .cash = gameState.Cash,
+ .numRides = static_cast(RideManager().size()),
+ .numGuests = static_cast(gameState.NumGuestsInPark),
+ };
+
+ return preview;
+ }
+} // namespace OpenRCT2
diff --git a/src/openrct2/park/ParkPreview.h b/src/openrct2/park/ParkPreview.h
new file mode 100644
index 0000000000..5aa400098a
--- /dev/null
+++ b/src/openrct2/park/ParkPreview.h
@@ -0,0 +1,35 @@
+/*****************************************************************************
+ * Copyright (c) 2014-2025 OpenRCT2 developers
+ *
+ * For a complete list of all authors, please refer to contributors.md
+ * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
+ *
+ * OpenRCT2 is licensed under the GNU General Public License version 3.
+ *****************************************************************************/
+
+#pragma once
+
+#include "../core/Money.hpp"
+
+#include
+#include
+
+namespace OpenRCT2
+{
+ struct ParkPreview
+ {
+ std::string parkName{};
+ uint16_t parkRating{};
+ int32_t year{};
+ int32_t month{};
+ int32_t day{};
+ bool parkUsesMoney{ true };
+ money64 cash{};
+ uint16_t numRides{};
+ uint16_t numGuests{};
+ };
+
+ struct GameState_t;
+
+ ParkPreview generatePreviewFromGameState(const GameState_t& gameState);
+} // namespace OpenRCT2
diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp
index 06f82b99af..69c93efaec 100644
--- a/src/openrct2/rct1/S4Importer.cpp
+++ b/src/openrct2/rct1/S4Importer.cpp
@@ -52,6 +52,7 @@
#include "../object/PeepAnimationsObject.h"
#include "../object/ScenarioTextObject.h"
#include "../park/Legacy.h"
+#include "../park/ParkPreview.h"
#include "../peep/RideUseSystem.h"
#include "../rct12/CSStringConverter.h"
#include "../rct12/EntryList.h"
@@ -289,6 +290,11 @@ namespace OpenRCT2::RCT1
return true;
}
+ ParkPreview GetParkPreview() override
+ {
+ return {};
+ }
+
money64 CorrectRCT1ParkValue(money32 oldParkValue)
{
if (oldParkValue == kMoney32Undefined)
diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp
index 51985b2b97..85ad178496 100644
--- a/src/openrct2/rct2/S6Importer.cpp
+++ b/src/openrct2/rct2/S6Importer.cpp
@@ -52,6 +52,7 @@
#include "../object/ScenarioTextObject.h"
#include "../object/WallSceneryEntry.h"
#include "../park/Legacy.h"
+#include "../park/ParkPreview.h"
#include "../peep/RideUseSystem.h"
#include "../rct12/CSStringConverter.h"
#include "../rct12/EntryList.h"
@@ -314,6 +315,11 @@ namespace OpenRCT2::RCT2
return true;
}
+ ParkPreview GetParkPreview() override
+ {
+ return {};
+ }
+
void Import(GameState_t& gameState) override
{
Initialise(gameState);