diff --git a/src/game.c b/src/game.c index ed0ae704bd..6d7f5fb42a 100644 --- a/src/game.c +++ b/src/game.c @@ -766,84 +766,6 @@ void game_fix_save_vars() { } } -// Load game state for multiplayer -int game_load_network(SDL_RWops* rw) -{ - int i, j; - - rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4; - rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - - // Read first chunk - sawyercoding_read_chunk(rw, (uint8*)s6Header); - if (s6Header->type == S6_TYPE_SAVEDGAME) { - // Read packed objects - if (s6Header->num_packed_objects > 0) { - j = 0; - for (i = 0; i < s6Header->num_packed_objects; i++) - j += object_load_packed(rw); - if (j > 0) - object_list_load(); - } - } - - uint8 load_success = object_read_and_load_entries(rw); - - // Read flags (16 bytes) - sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); - - // Read map elements - memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element)); - sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); - - // Read game data, including sprites - sawyercoding_read_chunk(rw, (uint8*)0x010E63B8); - - // Read checksum - uint32 checksum; - SDL_RWread(rw, &checksum, sizeof(uint32), 1); - - // Read other data not in normal save files - gGamePaused = SDL_ReadLE32(rw); - _guestGenerationProbability = SDL_ReadLE32(rw); - _suggestedGuestMaximum = SDL_ReadLE32(rw); - gCheatsSandboxMode = SDL_ReadU8(rw); - gCheatsDisableClearanceChecks = SDL_ReadU8(rw); - gCheatsDisableSupportLimits = SDL_ReadU8(rw); - gCheatsDisableTrainLengthLimit = SDL_ReadU8(rw); - gCheatsShowAllOperatingModes = SDL_ReadU8(rw); - gCheatsShowVehiclesFromOtherTrackTypes = SDL_ReadU8(rw); - gCheatsFastLiftHill = SDL_ReadU8(rw); - gCheatsDisableBrakesFailure = SDL_ReadU8(rw); - gCheatsDisableAllBreakdowns = SDL_ReadU8(rw); - gCheatsUnlockAllPrices = SDL_ReadU8(rw); - gCheatsBuildInPauseMode = SDL_ReadU8(rw); - gCheatsIgnoreRideIntensity = SDL_ReadU8(rw); - gCheatsDisableVandalism = SDL_ReadU8(rw); - gCheatsDisableLittering = SDL_ReadU8(rw); - gCheatsNeverendingMarketing = SDL_ReadU8(rw); - gCheatsFreezeClimate = SDL_ReadU8(rw); - - if (!load_success){ - set_load_objects_fail_reason(); - if (gInputFlags & INPUT_FLAG_5){ - //call 0x0040705E Sets cursor position and something else. Calls maybe wind func 8 probably pointless - gInputFlags &= ~INPUT_FLAG_5; - } - - return 0;//This never gets called - } - - // The rest is the same as in scenario load and play - reset_loaded_objects(); - map_update_tile_pointers(); - reset_0x69EBE4(); - openrct2_reset_object_tween_locations(); - game_convert_strings_to_utf8(); - gLastAutoSaveTick = SDL_GetTicks(); - return 1; -} - /** * * rct2: 0x00675E1B diff --git a/src/rct2/S6Importer.cpp b/src/rct2/S6Importer.cpp index 01fd34e955..a70d2f827c 100644 --- a/src/rct2/S6Importer.cpp +++ b/src/rct2/S6Importer.cpp @@ -48,6 +48,7 @@ public: S6Importer::S6Importer() { + FixIssues = false; memset(&_s6, 0, sizeof(_s6)); } @@ -388,7 +389,10 @@ void S6Importer::Import() map_update_tile_pointers(); reset_0x69EBE4(); game_convert_strings_to_utf8(); - game_fix_save_vars(); // OpenRCT2 fix broken save games + if (FixIssues) + { + game_fix_save_vars(); + } } extern "C" @@ -412,6 +416,7 @@ extern "C" auto s6Importer = new S6Importer(); try { + s6Importer->FixIssues = true; s6Importer->LoadSavedGame(rw); s6Importer->Import(); @@ -444,6 +449,7 @@ extern "C" auto s6Importer = new S6Importer(); try { + s6Importer->FixIssues = true; s6Importer->LoadScenario(path); s6Importer->Import(); @@ -470,4 +476,59 @@ extern "C" gLastAutoSaveTick = SDL_GetTicks(); return result; } + + int game_load_network(SDL_RWops* rw) + { + bool result = false; + auto s6Importer = new S6Importer(); + try + { + s6Importer->LoadSavedGame(rw); + s6Importer->Import(); + + openrct2_reset_object_tween_locations(); + result = true; + } + catch (ObjectLoadException) + { + set_load_objects_fail_reason(); + } + catch (Exception) + { + } + delete s6Importer; + + if (!result) + { + return 0; + } + + // Read checksum + uint32 checksum; + SDL_RWread(rw, &checksum, sizeof(uint32), 1); + + // Read other data not in normal save files + gGamePaused = SDL_ReadLE32(rw); + _guestGenerationProbability = SDL_ReadLE32(rw); + _suggestedGuestMaximum = SDL_ReadLE32(rw); + gCheatsSandboxMode = SDL_ReadU8(rw) != 0; + gCheatsDisableClearanceChecks = SDL_ReadU8(rw) != 0; + gCheatsDisableSupportLimits = SDL_ReadU8(rw) != 0; + gCheatsDisableTrainLengthLimit = SDL_ReadU8(rw) != 0; + gCheatsShowAllOperatingModes = SDL_ReadU8(rw) != 0; + gCheatsShowVehiclesFromOtherTrackTypes = SDL_ReadU8(rw) != 0; + gCheatsFastLiftHill = SDL_ReadU8(rw) != 0; + gCheatsDisableBrakesFailure = SDL_ReadU8(rw) != 0; + gCheatsDisableAllBreakdowns = SDL_ReadU8(rw) != 0; + gCheatsUnlockAllPrices = SDL_ReadU8(rw) != 0; + gCheatsBuildInPauseMode = SDL_ReadU8(rw) != 0; + gCheatsIgnoreRideIntensity = SDL_ReadU8(rw) != 0; + gCheatsDisableVandalism = SDL_ReadU8(rw) != 0; + gCheatsDisableLittering = SDL_ReadU8(rw) != 0; + gCheatsNeverendingMarketing = SDL_ReadU8(rw) != 0; + gCheatsFreezeClimate = SDL_ReadU8(rw) != 0; + + gLastAutoSaveTick = SDL_GetTicks(); + return 1; + } } diff --git a/src/rct2/S6Importer.h b/src/rct2/S6Importer.h index 49d6a329b4..8070dabeae 100644 --- a/src/rct2/S6Importer.h +++ b/src/rct2/S6Importer.h @@ -29,6 +29,8 @@ extern "C" class S6Importer { public: + bool FixIssues; + S6Importer(); void LoadSavedGame(const utf8 * path);