From d70abcc84e57a674fdac1004aa3bd348bd9735ff Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 3 Apr 2021 02:49:15 +0100 Subject: [PATCH] Implement .park for network games --- src/openrct2/ParkFile.cpp | 18 ++++ src/openrct2/network/NetworkBase.cpp | 129 ++++----------------------- 2 files changed, 33 insertions(+), 114 deletions(-) diff --git a/src/openrct2/ParkFile.cpp b/src/openrct2/ParkFile.cpp index b59472d81f..1f1d74c3c5 100644 --- a/src/openrct2/ParkFile.cpp +++ b/src/openrct2/ParkFile.cpp @@ -298,12 +298,26 @@ namespace OpenRCT2 { cs.ReadWrite(gScenarioCompletedBy); } + + if (cs.GetMode() == OrcaStream::Mode::READING) + { + auto earlyCompletion = cs.Read(); + if (network_get_mode() == NETWORK_MODE_CLIENT) + { + gAllowEarlyCompletionInNetworkPlay = earlyCompletion; + } + } + else + { + cs.Write(AllowEarlyCompletion()); + } }); } void ReadWriteGeneralChunk(OrcaStream& os) { auto found = os.ReadWriteChunk(ParkFileChunkType::GENERAL, [](OrcaStream::ChunkStream& cs) { + cs.ReadWrite(gGamePaused); cs.ReadWriteAs(gScenarioTicks); cs.ReadWriteAs(gDateMonthTicks); cs.ReadWrite(gDateMonthsElapsed); @@ -418,11 +432,15 @@ namespace OpenRCT2 } }); + cs.ReadWriteAs(gParkValue); + cs.ReadWriteAs(gParkRating); cs.ReadWrite(gParkRatingCasualtyPenalty); cs.ReadWrite(gCurrentExpenditure); cs.ReadWrite(gCurrentProfit); cs.ReadWrite(gTotalAdmissions); cs.ReadWrite(gTotalIncomeFromAdmissions); + cs.ReadWrite(_guestGenerationProbability); + cs.ReadWrite(_suggestedGuestMaximum); }); } diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index a54af25786..f3c225e22a 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -13,6 +13,7 @@ #include "../Game.h" #include "../GameStateSnapshots.h" #include "../OpenRCT2.h" +#include "../ParkFile.h" #include "../PlatformEnvironment.h" #include "../actions/LoadOrQuitAction.h" #include "../actions/NetworkModifyGroupAction.h" @@ -65,7 +66,6 @@ static constexpr uint32_t CHUNK_SIZE = 1024 * 63; # include "../localisation/Localisation.h" # include "../object/ObjectManager.h" # include "../object/ObjectRepository.h" -# include "../rct2/S6Exporter.h" # include "../scenario/Scenario.h" # include "../util/Util.h" # include "../world/Park.h" @@ -1406,37 +1406,18 @@ void NetworkBase::Server_Send_MAP(NetworkConnection* connection) std::vector NetworkBase::save_for_network(const std::vector& objects) const { - std::vector header; - bool RLEState = gUseRLE; - gUseRLE = false; - + std::vector result; auto ms = OpenRCT2::MemoryStream(); - if (!SaveMap(&ms, objects)) + if (SaveMap(&ms, objects)) { - log_warning("Failed to export map."); - return header; - } - gUseRLE = RLEState; - - const void* data = ms.GetData(); - int32_t size = ms.GetLength(); - - auto compressed = util_zlib_deflate(static_cast(data), size); - if (compressed != std::nullopt) - { - std::string headerString = "open2_sv6_zlib"; - header.resize(headerString.size() + 1 + compressed->size()); - std::memcpy(&header[0], headerString.c_str(), headerString.size() + 1); - std::memcpy(&header[headerString.size() + 1], compressed->data(), compressed->size()); - log_verbose("Sending map of size %u bytes, compressed to %u bytes", size, headerString.size() + 1 + compressed->size()); + result.resize(ms.GetLength()); + std::memcpy(result.data(), ms.GetData(), result.size()); } else { - log_warning("Failed to compress the data, falling back to non-compressed sv6."); - header.resize(size); - std::memcpy(header.data(), data, size); + log_warning("Failed to export map."); } - return header; + return result; } void NetworkBase::Client_Send_CHAT(const char* text) @@ -2655,25 +2636,6 @@ void NetworkBase::Client_Handle_MAP([[maybe_unused]] NetworkConnection& connecti bool has_to_free = false; uint8_t* data = &chunk_buffer[0]; size_t data_size = size; - // zlib-compressed - if (strcmp("open2_sv6_zlib", reinterpret_cast(&chunk_buffer[0])) == 0) - { - log_verbose("Received zlib-compressed sv6 map"); - has_to_free = true; - size_t header_len = strlen("open2_sv6_zlib") + 1; - data = util_zlib_inflate(&chunk_buffer[header_len], size - header_len, &data_size); - if (data == nullptr) - { - log_warning("Failed to decompress data sent from server."); - Close(); - return; - } - } - else - { - log_verbose("Assuming received map is in plain sv6 format"); - } - auto ms = MemoryStream(data, data_size); if (LoadMap(&ms)) { @@ -2716,7 +2678,7 @@ bool NetworkBase::LoadMap(IStream* stream) { auto context = GetContext(); auto& objManager = context->GetObjectManager(); - auto importer = ParkImporter::CreateS6(context->GetObjectRepository()); + auto importer = ParkImporter::CreateParkFile(context->GetObjectRepository()); auto loadResult = importer->LoadFromStream(stream, false); objManager.LoadObjects(loadResult.RequiredObjects); importer->Import(); @@ -2724,43 +2686,12 @@ bool NetworkBase::LoadMap(IStream* stream) EntityTweener::Get().Reset(); AutoCreateMapAnimations(); - // Read checksum - [[maybe_unused]] uint32_t checksum = stream->ReadValue(); - - // Read other data not in normal save files - gGamePaused = stream->ReadValue(); - _guestGenerationProbability = stream->ReadValue(); - _suggestedGuestMaximum = stream->ReadValue(); - gCheatsAllowTrackPlaceInvalidHeights = stream->ReadValue() != 0; - gCheatsEnableAllDrawableTrackPieces = stream->ReadValue() != 0; - gCheatsSandboxMode = stream->ReadValue() != 0; - gCheatsDisableClearanceChecks = stream->ReadValue() != 0; - gCheatsDisableSupportLimits = stream->ReadValue() != 0; - gCheatsDisableTrainLengthLimit = stream->ReadValue() != 0; - gCheatsEnableChainLiftOnAllTrack = stream->ReadValue() != 0; - gCheatsShowAllOperatingModes = stream->ReadValue() != 0; - gCheatsShowVehiclesFromOtherTrackTypes = stream->ReadValue() != 0; - gCheatsFastLiftHill = stream->ReadValue() != 0; - gCheatsDisableBrakesFailure = stream->ReadValue() != 0; - gCheatsDisableAllBreakdowns = stream->ReadValue() != 0; - gCheatsBuildInPauseMode = stream->ReadValue() != 0; - gCheatsIgnoreRideIntensity = stream->ReadValue() != 0; - gCheatsDisableVandalism = stream->ReadValue() != 0; - gCheatsDisableLittering = stream->ReadValue() != 0; - gCheatsNeverendingMarketing = stream->ReadValue() != 0; - gCheatsFreezeWeather = stream->ReadValue() != 0; - gCheatsDisablePlantAging = stream->ReadValue() != 0; - gCheatsAllowArbitraryRideTypeChanges = stream->ReadValue() != 0; - gCheatsDisableRideValueAging = stream->ReadValue() != 0; - gConfigGeneral.show_real_names_of_guests = stream->ReadValue() != 0; - gCheatsIgnoreResearchStatus = stream->ReadValue() != 0; - gAllowEarlyCompletionInNetworkPlay = stream->ReadValue() != 0; - gLastAutoSaveUpdate = AUTOSAVE_PAUSE; result = true; } - catch (const std::exception&) + catch (const std::exception& e) { + Console::Error::WriteLine("Unable to read map from server: %s", e.what()); } return result; } @@ -2772,44 +2703,14 @@ bool NetworkBase::SaveMap(IStream* stream, const std::vector(); - s6exporter->ExportObjectsList = objects; - s6exporter->Export(); - s6exporter->SaveGame(stream); - - // Write other data not in normal save files - stream->WriteValue(gGamePaused); - stream->WriteValue(_guestGenerationProbability); - stream->WriteValue(_suggestedGuestMaximum); - stream->WriteValue(gCheatsAllowTrackPlaceInvalidHeights); - stream->WriteValue(gCheatsEnableAllDrawableTrackPieces); - stream->WriteValue(gCheatsSandboxMode); - stream->WriteValue(gCheatsDisableClearanceChecks); - stream->WriteValue(gCheatsDisableSupportLimits); - stream->WriteValue(gCheatsDisableTrainLengthLimit); - stream->WriteValue(gCheatsEnableChainLiftOnAllTrack); - stream->WriteValue(gCheatsShowAllOperatingModes); - stream->WriteValue(gCheatsShowVehiclesFromOtherTrackTypes); - stream->WriteValue(gCheatsFastLiftHill); - stream->WriteValue(gCheatsDisableBrakesFailure); - stream->WriteValue(gCheatsDisableAllBreakdowns); - stream->WriteValue(gCheatsBuildInPauseMode); - stream->WriteValue(gCheatsIgnoreRideIntensity); - stream->WriteValue(gCheatsDisableVandalism); - stream->WriteValue(gCheatsDisableLittering); - stream->WriteValue(gCheatsNeverendingMarketing); - stream->WriteValue(gCheatsFreezeWeather); - stream->WriteValue(gCheatsDisablePlantAging); - stream->WriteValue(gCheatsAllowArbitraryRideTypeChanges); - stream->WriteValue(gCheatsDisableRideValueAging); - stream->WriteValue(gConfigGeneral.show_real_names_of_guests); - stream->WriteValue(gCheatsIgnoreResearchStatus); - stream->WriteValue(gConfigGeneral.allow_early_completion); - + auto exporter = std::make_unique(); + exporter->ExportObjectsList = objects; + exporter->Export(*stream); result = true; } - catch (const std::exception&) + catch (const std::exception& e) { + Console::Error::WriteLine("Unable to serialise map: %s", e.what()); } return result; }