From f4809291cb52dab4e911d578edb099bd304da394 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 18 Feb 2025 15:48:57 +0100 Subject: [PATCH] Initial park save preview implementation --- src/openrct2/ParkImporter.h | 2 ++ src/openrct2/libopenrct2.vcxproj | 2 ++ src/openrct2/park/ParkFile.cpp | 43 +++++++++++++++++++++++++++++++ src/openrct2/park/ParkFile.h | 3 ++- src/openrct2/park/ParkPreview.cpp | 34 ++++++++++++++++++++++++ src/openrct2/park/ParkPreview.h | 35 +++++++++++++++++++++++++ src/openrct2/rct1/S4Importer.cpp | 6 +++++ src/openrct2/rct2/S6Importer.cpp | 6 +++++ 8 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 src/openrct2/park/ParkPreview.cpp create mode 100644 src/openrct2/park/ParkPreview.h 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);