1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-19 13:03:11 +01:00

use S6Importer for network load game

This commit is contained in:
Ted John
2016-05-08 17:21:55 +01:00
parent bc7d1343da
commit 2ab41b547a
3 changed files with 64 additions and 79 deletions

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -29,6 +29,8 @@ extern "C"
class S6Importer
{
public:
bool FixIssues;
S6Importer();
void LoadSavedGame(const utf8 * path);