From edcbfdf097ab14fb041f49fb5e710421739d585c Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 2 Jul 2017 19:10:22 +0100 Subject: [PATCH] Move rct2_open_file to Context --- src/openrct2/Context.cpp | 72 +++++++++++++-------------- src/openrct2/Context.h | 3 ++ src/openrct2/interface/Screenshot.cpp | 4 +- src/openrct2/rct2.c | 72 --------------------------- src/openrct2/rct2.h | 2 - 5 files changed, 41 insertions(+), 112 deletions(-) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index c8f9b23316..a5719c5b0d 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -256,6 +256,12 @@ namespace OpenRCT2 return true; } + void Open(const std::string &path) final override + { + auto fs = FileStream(path, FILE_MODE_OPEN); + OpenParkAutoDetectFormat(&fs, path); + } + private: bool LoadBaseGraphics() { @@ -293,7 +299,6 @@ namespace OpenRCT2 break; case STARTUP_ACTION_OPEN: { - bool parkLoaded = false; // A path that includes "://" is illegal with all common filesystems, so it is almost certainly a URL // This way all cURL supported protocols, like http, ftp, scp and smb are automatically handled if (strstr(gOpenRCT2StartupActionPath, "://") != nullptr) @@ -309,18 +314,27 @@ namespace OpenRCT2 } auto ms = MemoryStream(data, dataSize, MEMORY_ACCESS::OWNER); - parkLoaded = OpenParkAutoDetectFormat(&ms); + if (!OpenParkAutoDetectFormat(&ms, gOpenRCT2StartupActionPath)) + { + Console::Error::WriteLine("Failed to load '%s'", gOpenRCT2StartupActionPath); + title_load(); + break; + } #endif } else { - parkLoaded = rct2_open_file(gOpenRCT2StartupActionPath); - } - - if (!parkLoaded) - { - Console::Error::WriteLine("Failed to load '%s'", gOpenRCT2StartupActionPath); - break; + try + { + Open(gOpenRCT2StartupActionPath); + } + catch (const std::exception &ex) + { + Console::Error::WriteLine("Failed to load '%s'", gOpenRCT2StartupActionPath); + Console::Error::WriteLine("%s", ex.what()); + title_load(); + break; + } } gScreenFlags = SCREEN_FLAGS_PLAYING; @@ -534,7 +548,7 @@ namespace OpenRCT2 console_update(); } - bool OpenParkAutoDetectFormat(IStream * stream) + bool OpenParkAutoDetectFormat(IStream * stream, const std::string &path) { ClassifiedFile info; if (TryClassifyFile(stream, &info)) @@ -552,41 +566,27 @@ namespace OpenRCT2 parkImporter.reset(ParkImporter::CreateS6(_objectRepository, _objectManager)); } - if (info.Type == FILE_TYPE::SAVED_GAME) + auto result = parkImporter->LoadFromStream(stream, false); + if (result.Error == PARK_LOAD_ERROR_OK) { - try + parkImporter->Import(); + game_fix_save_vars(); + sprite_position_tween_reset(); + gScreenAge = 0; + gLastAutoSaveUpdate = AUTOSAVE_PAUSE; + if (info.Type == FILE_TYPE::SAVED_GAME) { - parkImporter->LoadFromStream(stream, false); - parkImporter->Import(); - game_fix_save_vars(); - sprite_position_tween_reset(); - gScreenAge = 0; - gLastAutoSaveUpdate = AUTOSAVE_PAUSE; game_load_init(); - return true; } - catch (const Exception &) + else { - Console::Error::WriteLine("Error loading saved game."); + scenario_begin(); } + return true; } else { - try - { - parkImporter->LoadFromStream(stream, true); - parkImporter->Import(); - game_fix_save_vars(); - sprite_position_tween_reset(); - gScreenAge = 0; - gLastAutoSaveUpdate = AUTOSAVE_PAUSE; - scenario_begin(); - return true; - } - catch (const Exception &) - { - Console::Error::WriteLine("Error loading scenario."); - } + handle_park_load_failure_with_title_opt(&result, path.c_str(), true); } } else diff --git a/src/openrct2/Context.h b/src/openrct2/Context.h index 76ec8c6be6..ecc6be5596 100644 --- a/src/openrct2/Context.h +++ b/src/openrct2/Context.h @@ -67,6 +67,8 @@ enum #ifdef __cplusplus +#include + namespace OpenRCT2 { interface IPlatformEnvironment; @@ -94,6 +96,7 @@ namespace OpenRCT2 virtual sint32 RunOpenRCT2(int argc, char * * argv) abstract; virtual bool Initialise() abstract; + virtual void Open(const std::string &path) abstract; virtual void Finish() abstract; }; diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index df7e6260db..713283fc1b 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -269,7 +269,7 @@ sint32 cmdline_for_gfxbench(const char **argv, sint32 argc) if (context->Initialise()) { drawing_engine_init(); - rct2_open_file(inputPath); + context->Open(inputPath); gIntroState = INTRO_STATE_NONE; gScreenFlags = SCREEN_FLAGS_PLAYING; @@ -388,7 +388,7 @@ sint32 cmdline_for_screenshot(const char **argv, sint32 argc) if (context->Initialise()) { drawing_engine_init(); - rct2_open_file(inputPath); + context->Open(inputPath); gIntroState = INTRO_STATE_NONE; gScreenFlags = SCREEN_FLAGS_PLAYING; diff --git a/src/openrct2/rct2.c b/src/openrct2/rct2.c index 5d5290e93e..1fab078172 100644 --- a/src/openrct2/rct2.c +++ b/src/openrct2/rct2.c @@ -275,78 +275,6 @@ static void rct2_draw_fps(rct_drawpixelinfo *dpi) gfx_set_dirty_blocks(x - 16, y - 4, gLastDrawStringX + 16, 16); } -bool rct2_open_file(const char *path) -{ - char *extension = strrchr(path, '.'); - if (extension == NULL) { - title_load(); - return false; - } - extension++; - - if (_stricmp(extension, "sv6") == 0) { - ParkLoadResult * result = game_load_sv6_path(path); - if (ParkLoadResult_GetError(result) == PARK_LOAD_ERROR_OK) { - ParkLoadResult_Delete(result); - gFirstTimeSaving = false; - if (network_get_mode() == NETWORK_MODE_CLIENT) { - network_close(); - } - game_load_init(); - if (network_get_mode() == NETWORK_MODE_SERVER) { - network_send_map(); - } - peep_update_names(gConfigGeneral.show_real_names_of_guests); - return true; - } - else { - handle_park_load_failure_with_title_opt(result, path, true); - ParkLoadResult_Delete(result); - return false; - } - } else if (_stricmp(extension, "sc6") == 0) { - // TODO scenario install - ParkLoadResult * result = scenario_load_and_play_from_path(path); - if (ParkLoadResult_GetError(result) == PARK_LOAD_ERROR_OK) { - ParkLoadResult_Delete(result); - return true; - } else { - handle_park_load_failure_with_title_opt(result, path, true); - ParkLoadResult_Delete(result); - return false; - } - } else if (_stricmp(extension, "td6") == 0 || _stricmp(extension, "td4") == 0) { - // TODO track design install - return true; - } else if (_stricmp(extension, "sv4") == 0) { - ParkLoadResult * result = rct1_load_saved_game(path); - if (ParkLoadResult_GetError(result) == PARK_LOAD_ERROR_OK) { - ParkLoadResult_Delete(result); - game_load_init(); - return true; - } - else { - handle_park_load_failure_with_title_opt(result, path, true); - ParkLoadResult_Delete(result); - return false; - } - } else if (_stricmp(extension, "sc4") == 0) { - ParkLoadResult * result = rct1_load_scenario(path); - if (ParkLoadResult_GetError(result) == PARK_LOAD_ERROR_OK) { - ParkLoadResult_Delete(result); - scenario_begin(); - return true; - } - else { - handle_park_load_failure_with_title_opt(result, path, true); - ParkLoadResult_Delete(result); - return false; - } - } - title_load(); - return false; -} - /** * * rct2: 0x00674C95 diff --git a/src/openrct2/rct2.h b/src/openrct2/rct2.h index eb8ec99868..a717df7c86 100644 --- a/src/openrct2/rct2.h +++ b/src/openrct2/rct2.h @@ -177,8 +177,6 @@ sint32 check_files_integrity(); const char *get_file_path(sint32 pathId); void rct2_quit(); -bool rct2_open_file(const char *path); - uint32 get_file_extension_type(const utf8 *path); #ifdef __cplusplus