diff --git a/src/openrct2/ParkFile.cpp b/src/openrct2/ParkFile.cpp index bdfada731f..3ee06b62a6 100644 --- a/src/openrct2/ParkFile.cpp +++ b/src/openrct2/ParkFile.cpp @@ -1,6 +1,7 @@ #include "ParkFile.h" #include "Context.h" +#include "GameState.h" #include "OpenRCT2.h" #include "ParkImporter.h" #include "Version.h" @@ -237,7 +238,7 @@ void ParkFile::WriteTilesChunk() WriteValue(gMapSize); WriteValue(gMapSize); BeginArray(); - auto numTiles = (size_t)gMapSize * gMapSize; + auto numTiles = std::size(gTileElements); for (size_t i = 0; i < numTiles; i++) { WriteBuffer(&gTileElements[i], sizeof(gTileElements[i])); @@ -295,6 +296,7 @@ void ParkFile::Load(const std::string_view& path) void ParkFile::Import() { + ReadTilesChunk(); } ParkFile::Header ParkFile::ReadHeader(std::istream& fs) @@ -356,6 +358,26 @@ std::string ParkFile::ReadString() return buffer; } +void ParkFile::ReadTilesChunk() +{ + if (SeekChunk(ParkFileChunkType::TILES)) + { + auto mapWidth = ReadValue(); + [[maybe_unused]] auto mapHeight = ReadValue(); + + OpenRCT2::GetContext()->GetGameState()->InitAll(mapWidth); + + auto numElements = ReadArray(); + ReadBuffer(gTileElements, numElements * sizeof(TileElement)); + + map_update_tile_pointers(); + } + else + { + throw std::runtime_error("No tiles chunk found."); + } +} + enum : uint32_t { S6_SAVE_FLAG_EXPORT = 1 << 0, @@ -421,6 +443,7 @@ class ParkFileImporter : public IParkImporter { private: const IObjectRepository& _objectRepository; + std::unique_ptr _parkFile; public: ParkFileImporter(IObjectRepository& objectRepository) @@ -430,9 +453,9 @@ public: ParkLoadResult Load(const utf8* path) override { - auto parkFile = std::make_unique(); - parkFile->Load(path); - return ParkLoadResult(std::move(parkFile->RequiredObjects)); + _parkFile = std::make_unique(); + _parkFile->Load(path); + return ParkLoadResult(std::move(_parkFile->RequiredObjects)); } ParkLoadResult LoadSavedGame(const utf8* path, bool skipObjectCheck = false) override @@ -453,6 +476,7 @@ public: void Import() override { + _parkFile->Import(); } bool GetDetails(scenario_index_entry* dst) override diff --git a/src/openrct2/ParkFile.h b/src/openrct2/ParkFile.h index 943ede2014..1cf8bfa91b 100644 --- a/src/openrct2/ParkFile.h +++ b/src/openrct2/ParkFile.h @@ -70,6 +70,8 @@ namespace OpenRCT2 void WriteGeneralChunk(); void WriteTilesChunk(); + void ReadTilesChunk(); + Header ReadHeader(std::istream& fs); bool SeekChunk(uint32_t id); size_t ReadArray();