mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-23 15:52:55 +01:00
Move rct2_open_file to Context
This commit is contained in:
@@ -256,6 +256,12 @@ namespace OpenRCT2
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Open(const std::string &path) final override
|
||||||
|
{
|
||||||
|
auto fs = FileStream(path, FILE_MODE_OPEN);
|
||||||
|
OpenParkAutoDetectFormat(&fs, path);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool LoadBaseGraphics()
|
bool LoadBaseGraphics()
|
||||||
{
|
{
|
||||||
@@ -293,7 +299,6 @@ namespace OpenRCT2
|
|||||||
break;
|
break;
|
||||||
case STARTUP_ACTION_OPEN:
|
case STARTUP_ACTION_OPEN:
|
||||||
{
|
{
|
||||||
bool parkLoaded = false;
|
|
||||||
// A path that includes "://" is illegal with all common filesystems, so it is almost certainly a URL
|
// 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
|
// This way all cURL supported protocols, like http, ftp, scp and smb are automatically handled
|
||||||
if (strstr(gOpenRCT2StartupActionPath, "://") != nullptr)
|
if (strstr(gOpenRCT2StartupActionPath, "://") != nullptr)
|
||||||
@@ -309,18 +314,27 @@ namespace OpenRCT2
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto ms = MemoryStream(data, dataSize, MEMORY_ACCESS::OWNER);
|
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
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parkLoaded = rct2_open_file(gOpenRCT2StartupActionPath);
|
try
|
||||||
}
|
{
|
||||||
|
Open(gOpenRCT2StartupActionPath);
|
||||||
if (!parkLoaded)
|
}
|
||||||
{
|
catch (const std::exception &ex)
|
||||||
Console::Error::WriteLine("Failed to load '%s'", gOpenRCT2StartupActionPath);
|
{
|
||||||
break;
|
Console::Error::WriteLine("Failed to load '%s'", gOpenRCT2StartupActionPath);
|
||||||
|
Console::Error::WriteLine("%s", ex.what());
|
||||||
|
title_load();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
||||||
@@ -534,7 +548,7 @@ namespace OpenRCT2
|
|||||||
console_update();
|
console_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenParkAutoDetectFormat(IStream * stream)
|
bool OpenParkAutoDetectFormat(IStream * stream, const std::string &path)
|
||||||
{
|
{
|
||||||
ClassifiedFile info;
|
ClassifiedFile info;
|
||||||
if (TryClassifyFile(stream, &info))
|
if (TryClassifyFile(stream, &info))
|
||||||
@@ -552,41 +566,27 @@ namespace OpenRCT2
|
|||||||
parkImporter.reset(ParkImporter::CreateS6(_objectRepository, _objectManager));
|
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();
|
game_load_init();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
catch (const Exception &)
|
else
|
||||||
{
|
{
|
||||||
Console::Error::WriteLine("Error loading saved game.");
|
scenario_begin();
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
try
|
handle_park_load_failure_with_title_opt(&result, path.c_str(), true);
|
||||||
{
|
|
||||||
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.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ enum
|
|||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace OpenRCT2
|
namespace OpenRCT2
|
||||||
{
|
{
|
||||||
interface IPlatformEnvironment;
|
interface IPlatformEnvironment;
|
||||||
@@ -94,6 +96,7 @@ namespace OpenRCT2
|
|||||||
virtual sint32 RunOpenRCT2(int argc, char * * argv) abstract;
|
virtual sint32 RunOpenRCT2(int argc, char * * argv) abstract;
|
||||||
|
|
||||||
virtual bool Initialise() abstract;
|
virtual bool Initialise() abstract;
|
||||||
|
virtual void Open(const std::string &path) abstract;
|
||||||
virtual void Finish() abstract;
|
virtual void Finish() abstract;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -269,7 +269,7 @@ sint32 cmdline_for_gfxbench(const char **argv, sint32 argc)
|
|||||||
if (context->Initialise())
|
if (context->Initialise())
|
||||||
{
|
{
|
||||||
drawing_engine_init();
|
drawing_engine_init();
|
||||||
rct2_open_file(inputPath);
|
context->Open(inputPath);
|
||||||
|
|
||||||
gIntroState = INTRO_STATE_NONE;
|
gIntroState = INTRO_STATE_NONE;
|
||||||
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
||||||
@@ -388,7 +388,7 @@ sint32 cmdline_for_screenshot(const char **argv, sint32 argc)
|
|||||||
if (context->Initialise())
|
if (context->Initialise())
|
||||||
{
|
{
|
||||||
drawing_engine_init();
|
drawing_engine_init();
|
||||||
rct2_open_file(inputPath);
|
context->Open(inputPath);
|
||||||
|
|
||||||
gIntroState = INTRO_STATE_NONE;
|
gIntroState = INTRO_STATE_NONE;
|
||||||
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
||||||
|
|||||||
@@ -275,78 +275,6 @@ static void rct2_draw_fps(rct_drawpixelinfo *dpi)
|
|||||||
gfx_set_dirty_blocks(x - 16, y - 4, gLastDrawStringX + 16, 16);
|
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
|
* rct2: 0x00674C95
|
||||||
|
|||||||
@@ -177,8 +177,6 @@ sint32 check_files_integrity();
|
|||||||
const char *get_file_path(sint32 pathId);
|
const char *get_file_path(sint32 pathId);
|
||||||
void rct2_quit();
|
void rct2_quit();
|
||||||
|
|
||||||
bool rct2_open_file(const char *path);
|
|
||||||
|
|
||||||
uint32 get_file_extension_type(const utf8 *path);
|
uint32 get_file_extension_type(const utf8 *path);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
Reference in New Issue
Block a user