mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #4779 from wolfreak99/load_game_or_sc6
Display and load sc6 files in "load game" browser
This commit is contained in:
commit
bd9ab83710
|
@ -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.
|
||||
|
|
19
src/editor.c
19
src/editor.c
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue