Merge pull request #4779 from wolfreak99/load_game_or_sc6

Display and load sc6 files in "load game" browser
This commit is contained in:
Michael Steenbeek 2016-11-14 21:14:49 +01:00 committed by GitHub
commit bd9ab83710
4 changed files with 71 additions and 42 deletions

View File

@ -27,6 +27,7 @@
- Improved: Performance and reliability of loading objects.
- Improved: Screenshots are now saved with the name of the park and the current date and time.
- Improved: More accurate frame rate calculation
- Improved: In-game file dialog now shows more formats (sv6, sc6, sv4, etc.)
- Removed: BMP screenshots.
- Removed: Intamin and Phoenix easter eggs.
- Fix: [#1038] Guest List is out of order.

View File

@ -258,17 +258,18 @@ bool editor_load_landscape(const utf8 *path)
{
window_close_construction_windows();
char *extension = strrchr(path, '.');
if (extension != NULL) {
if (_stricmp(extension, ".sv4") == 0) {
return editor_load_landscape_from_sv4(path);
} else if (_stricmp(extension, ".sc4") == 0) {
uint32 extension = get_file_extension_type(path);
switch (extension) {
case FILE_EXTENSION_SC6:
case FILE_EXTENSION_SV6:
return editor_read_s6(path);
case FILE_EXTENSION_SC4:
return editor_load_landscape_from_sc4(path);
}
case FILE_EXTENSION_SV4:
return editor_load_landscape_from_sv4(path);
default:
return 0;
}
// Load SC6 / SV6
return editor_read_s6(path);
}
/**

View File

@ -45,6 +45,7 @@
#include "world/scenery.h"
#include "world/sprite.h"
#include "world/water.h"
#include "rct1.h"
const rct_string_id ScenarioCategoryStringIds[SCENARIO_CATEGORY_COUNT] = {
STR_BEGINNER_PARKS,
@ -129,8 +130,18 @@ int scenario_load_and_play_from_path(const char *path)
{
window_close_construction_windows();
if (!scenario_load(path))
uint32 extension = get_file_extension_type(path);
if (extension == FILE_EXTENSION_SC6) {
if (!scenario_load(path))
return 0;
}
else if (extension == FILE_EXTENSION_SC4) {
if (!rct1_load_scenario(path))
return 0;
}
else {
return 0;
}
reset_sprite_spatial_index();
reset_all_sprite_quadrant_placements();

View File

@ -186,14 +186,14 @@ rct_window *window_loadsave_open(int type, char *defaultName)
case LOADSAVETYPE_GAME:
w->widgets[WIDX_TITLE].text = isSave ? STR_FILE_DIALOG_TITLE_SAVE_GAME : STR_FILE_DIALOG_TITLE_LOAD_GAME;
if (window_loadsave_get_dir(gConfigGeneral.last_save_game_directory, path, "save", sizeof(path))) {
window_loadsave_populate_list(w, isSave, path, ".sv6");
window_loadsave_populate_list(w, isSave, path, ".sv6;.sc6;.sv4;.sc4");
success = true;
}
break;
case LOADSAVETYPE_LANDSCAPE:
w->widgets[WIDX_TITLE].text = isSave ? STR_FILE_DIALOG_TITLE_SAVE_LANDSCAPE : STR_FILE_DIALOG_TITLE_LOAD_LANDSCAPE;
if (window_loadsave_get_dir(gConfigGeneral.last_save_landscape_directory, path, "landscape", sizeof(path))) {
window_loadsave_populate_list(w, isSave, path, ".sc6");
window_loadsave_populate_list(w, isSave, path, ".sc6;.sv6;.sc4;.sv4");
success = true;
}
break;
@ -207,7 +207,7 @@ rct_window *window_loadsave_open(int type, char *defaultName)
case LOADSAVETYPE_TRACK:
w->widgets[WIDX_TITLE].text = isSave ? STR_FILE_DIALOG_TITLE_SAVE_TRACK : STR_FILE_DIALOG_TITLE_INSTALL_NEW_TRACK_DESIGN;
if (window_loadsave_get_dir(gConfigGeneral.last_save_track_directory, path, "track", sizeof(path))) {
window_loadsave_populate_list(w, isSave, path, ".td?");
window_loadsave_populate_list(w, isSave, path, ".td6;.td4");
success = true;
}
break;
@ -251,12 +251,12 @@ static bool browse(bool isSave, char *path, size_t pathSize)
case LOADSAVETYPE_GAME:
title = isSave ? STR_FILE_DIALOG_TITLE_SAVE_GAME : STR_FILE_DIALOG_TITLE_LOAD_GAME;
desc.filters[0].name = language_get_string(STR_OPENRCT2_SAVED_GAME);
desc.filters[0].pattern = isSave ? "*.sv6" : "*.sv4;*.sv6";
desc.filters[0].pattern = isSave ? "*.sv6" : "*.sv6;*.sc6;*.sv4;*.sc4";
break;
case LOADSAVETYPE_LANDSCAPE:
title = isSave ? STR_FILE_DIALOG_TITLE_SAVE_LANDSCAPE : STR_FILE_DIALOG_TITLE_LOAD_LANDSCAPE;
desc.filters[0].name = language_get_string(STR_OPENRCT2_LANDSCAPE_FILE);
desc.filters[0].pattern = isSave ? "*.sc6" : "*.sc4;*.sv4;*.sc6;*.sv6";
desc.filters[0].pattern = isSave ? "*.sc6" : "*.sc6;*.sv6;*.sc4;*.sv4";
break;
case LOADSAVETYPE_SCENARIO:
title = STR_FILE_DIALOG_TITLE_SAVE_SCENARIO;
@ -266,7 +266,7 @@ static bool browse(bool isSave, char *path, size_t pathSize)
case LOADSAVETYPE_TRACK:
title = isSave ? STR_FILE_DIALOG_TITLE_SAVE_TRACK : STR_FILE_DIALOG_TITLE_INSTALL_NEW_TRACK_DESIGN;
desc.filters[0].name = language_get_string(STR_OPENRCT2_TRACK_DESIGN_FILE);
desc.filters[0].pattern = isSave ? "*.td6" : "*.td4;*.td6";
desc.filters[0].pattern = isSave ? "*.td6" : "*.td6;*.td4";
break;
}
@ -653,34 +653,45 @@ static void window_loadsave_populate_list(rct_window *w, int includeNewItem, con
}
platform_enumerate_files_end(fileEnumHandle);
// List all files with the wanted extension
// List all files with the wanted extensions
char filter[MAX_PATH];
safe_strcpy(filter, directory, sizeof(filter));
safe_strcat_path(filter, "*", sizeof(filter));
path_append_extension(filter, extension, sizeof(filter));
char extCopy[64];
safe_strcpy(extCopy, extension, sizeof(extCopy));
char * extToken;
bool showExtension = false;
extToken = strtok(extCopy, ";");
while (extToken != NULL) {
safe_strcpy(filter, directory, sizeof(filter));
safe_strcat_path(filter, "*", sizeof(filter));
path_append_extension(filter, extToken, sizeof(filter));
file_info fileInfo;
fileEnumHandle = platform_enumerate_files_begin(filter);
while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) {
if (listItemCapacity <= _listItemsCount) {
listItemCapacity *= 2;
_listItems = realloc(_listItems, listItemCapacity * sizeof(loadsave_list_item));
}
file_info fileInfo;
fileEnumHandle = platform_enumerate_files_begin(filter);
while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) {
if (listItemCapacity <= _listItemsCount) {
listItemCapacity *= 2;
_listItems = realloc(_listItems, listItemCapacity * sizeof(loadsave_list_item));
loadsave_list_item *listItem = &_listItems[_listItemsCount];
safe_strcpy(listItem->path, directory, sizeof(listItem->path));
safe_strcat_path(listItem->path, fileInfo.path, sizeof(listItem->path));
listItem->type = TYPE_FILE;
listItem->date_modified = platform_file_get_modified_time(listItem->path);
// Remove the extension (but only the first extension token)
safe_strcpy(listItem->name, fileInfo.path, sizeof(listItem->name));
if (!showExtension)
path_remove_extension(listItem->name);
_listItemsCount++;
}
platform_enumerate_files_end(fileEnumHandle);
loadsave_list_item *listItem = &_listItems[_listItemsCount];
safe_strcpy(listItem->path, directory, sizeof(listItem->path));
safe_strcat_path(listItem->path, fileInfo.path, sizeof(listItem->path));
listItem->type = TYPE_FILE;
listItem->date_modified = platform_file_get_modified_time(listItem->path);
// Remove the extension
safe_strcpy(listItem->name, fileInfo.path, sizeof(listItem->name));
path_remove_extension(listItem->name);
_listItemsCount++;
extToken = strtok(NULL, ";");
showExtension = true; //Show any extension after the first iteration
}
platform_enumerate_files_end(fileEnumHandle);
window_loadsave_sort_list(0, _listItemsCount - 1);
}
@ -725,11 +736,11 @@ static void window_loadsave_select(rct_window *w, const char *path)
switch (_type & 0x0F) {
case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME) :
save_path(&gConfigGeneral.last_save_game_directory, path);
uint32 extension = get_file_extension_type(path);
if (gLoadSaveTitleSequenceSave) {
utf8 newName[MAX_PATH];
const char *extension = path_get_extension(path);
safe_strcpy(newName, path_get_filename(path), MAX_PATH);
if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0)
if (extension != FILE_EXTENSION_SV6 && extension != FILE_EXTENSION_SC6)
path_append_extension(newName, ".sv6", sizeof(newName));
if (title_sequence_save_exists(gCurrentTitleSequence, newName)) {
set_format_arg(0, intptr_t, (intptr_t)&_listItems[w->selected_list_item].name);
@ -740,7 +751,12 @@ static void window_loadsave_select(rct_window *w, const char *path)
window_close(w);
}
window_loadsave_invoke_callback(MODAL_RESULT_OK);
} else if (game_load_save(path)) {
} else if (
(extension == FILE_EXTENSION_SV6 && game_load_save(path)) ||
(extension == FILE_EXTENSION_SC6 && scenario_load_and_play_from_path(path)) ||
(extension == FILE_EXTENSION_SV4 && game_load_save(path)) ||
(extension == FILE_EXTENSION_SC4 && scenario_load_and_play_from_path(path))
) {
safe_strcpy(gScenarioSavePath, path, MAX_PATH);
gFirstTimeSave = 0;