From 0c51dee94d3e826ccda12a08a4a70211fc3dca17 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 12 Nov 2016 17:12:11 +0000 Subject: [PATCH] Refactor a large amount of title sequence loading Still not yet able to load parks from zip. --- openrct2.vcxproj | 2 + src/config.c | 322 +---------------------------- src/config.h | 34 --- src/interface/title_sequences.c | 88 ++++---- src/interface/title_sequences.h | 7 +- src/title.c | 203 ++++-------------- src/title/TitleSequence.cpp | 72 ++++++- src/title/TitleSequenceManager.cpp | 154 ++++++++++++++ src/title/TitleSequenceManager.h | 46 +++++ src/windows/loadsave.c | 2 +- src/windows/options.c | 10 +- src/windows/title_command_editor.c | 10 + src/windows/title_editor.c | 9 +- 13 files changed, 392 insertions(+), 567 deletions(-) create mode 100644 src/title/TitleSequenceManager.cpp create mode 100644 src/title/TitleSequenceManager.h diff --git a/openrct2.vcxproj b/openrct2.vcxproj index 92ae3037be..253ff35e50 100644 --- a/openrct2.vcxproj +++ b/openrct2.vcxproj @@ -325,6 +325,7 @@ + @@ -570,6 +571,7 @@ + diff --git a/src/config.c b/src/config.c index 8ca2707d32..3796364c8a 100644 --- a/src/config.c +++ b/src/config.c @@ -17,7 +17,6 @@ #include "config.h" #include "interface/keyboard_shortcut.h" #include "interface/themes.h" -#include "interface/title_sequences.h" #include "interface/viewport.h" #include "localisation/language.h" #include "localisation/localisation.h" @@ -334,6 +333,7 @@ sound_configuration gConfigSound; twitch_configuration gConfigTwitch; network_configuration gConfigNetwork; notification_configuration gConfigNotifications; +font_configuration gConfigFonts; title_sequences_configuration gConfigTitleSequences; static bool config_open(const utf8string path); @@ -1090,324 +1090,4 @@ bool config_shortcut_keys_save() return result; } -#pragma endregion - -#pragma region Title Sequences - -static void title_sequence_open(const char *path, const char *customName); - -void title_sequences_set_default() -{ - char path[MAX_PATH]; - char dataPath[MAX_PATH]; - - platform_get_user_directory(path, "title sequences", sizeof(path)); - platform_ensure_directory_exists(path); - - gConfigTitleSequences.presets = NULL; - gConfigTitleSequences.num_presets = 0; - - platform_get_openrct_data_path(dataPath, sizeof(dataPath)); - safe_strcat_path(dataPath, "title", MAX_PATH); - - // RCT1 title sequence - safe_strcpy(path, dataPath, MAX_PATH); - safe_strcat_path(path, "rct1.parkseq", MAX_PATH); - title_sequence_open(path, language_get_string(STR_TITLE_SEQUENCE_RCT1)); - - // RCT1 (AA) title sequence - safe_strcpy(path, dataPath, MAX_PATH); - safe_strcat_path(path, "rct1aa.parkseq", MAX_PATH); - title_sequence_open(path, language_get_string(STR_TITLE_SEQUENCE_RCT1_AA)); - - // RCT1 (AA + LL) title sequence - safe_strcpy(path, dataPath, MAX_PATH); - safe_strcat_path(path, "rct1aall.parkseq", MAX_PATH); - title_sequence_open(path, language_get_string(STR_TITLE_SEQUENCE_RCT1_AA_LL)); - - // RCT2 title sequence - safe_strcpy(path, dataPath, MAX_PATH); - safe_strcat_path(path, "rct2.parkseq", MAX_PATH); - title_sequence_open(path, language_get_string(STR_TITLE_SEQUENCE_RCT2)); - - // OpenRCT2 title sequence - safe_strcpy(path, dataPath, MAX_PATH); - safe_strcat_path(path, "openrct2.parkseq", MAX_PATH); - title_sequence_open(path, language_get_string(STR_TITLE_SEQUENCE_OPENRCT2)); -} - -void title_sequences_load_presets() -{ - utf8 path[MAX_PATH], titleDir[MAX_PATH]; - int dirEnumHandle, i; - - // Find all directories in the title sequences folder - platform_get_user_directory(path, "title sequences", sizeof(path)); - dirEnumHandle = platform_enumerate_directories_begin(path); - while (platform_enumerate_directories_next(dirEnumHandle, titleDir)) { - platform_get_user_directory(path, "title sequences", sizeof(path)); - safe_strcat(path, titleDir, sizeof(path)); - title_sequence_open(path, NULL); - } - platform_enumerate_directories_end(dirEnumHandle); - - // Check which title sequence is the current one - if (_stricmp(gConfigInterface.current_title_sequence_preset, "*RCT1") == 0) { - gCurrentTitleSequence = 0; - } - else if (_stricmp(gConfigInterface.current_title_sequence_preset, "*RCT1AA") == 0) { - gCurrentTitleSequence = 1; - } - else if (_stricmp(gConfigInterface.current_title_sequence_preset, "*RCT1AALL") == 0) { - gCurrentTitleSequence = 2; - } - else if (_stricmp(gConfigInterface.current_title_sequence_preset, "*RCT2") == 0) { - gCurrentTitleSequence = 3; - } - else if (_stricmp(gConfigInterface.current_title_sequence_preset, "*OPENRCT2") == 0) { - gCurrentTitleSequence = 4; - } - else { - for (i = TITLE_SEQUENCE_DEFAULT_PRESETS; i < gConfigTitleSequences.num_presets; i++) { - if (_stricmp(gConfigInterface.current_title_sequence_preset, gConfigTitleSequences.presets[i].name) == 0) { - gCurrentTitleSequence = i; - break; - } - } - if (i == gConfigTitleSequences.num_presets) { - gCurrentTitleSequence = 0; - } - } - gCurrentPreviewTitleSequence = gCurrentTitleSequence; -} - -#define ZIP_STATIC 1 -#include - -static void * get_zip_data(zip_t * zip, const char * name, size_t * outSize) -{ - void * data = NULL; - size_t dataSize = 0; - - zip_stat_t zipFileStat; - if (zip_stat(zip, name, 0, &zipFileStat) == ZIP_ER_OK) { - zip_file_t * zipFile = zip_fopen(zip, name, 0); - if (zipFile != NULL) { - if (zipFileStat.size < SIZE_MAX) { - dataSize = zipFileStat.size; - data = malloc(dataSize); - size_t readBytes = zip_fread(zipFile, data, dataSize); - if (readBytes != dataSize) { - free(data); - data = NULL; - dataSize = 0; - } - zip_fclose(zipFile); - } - } - } - - if (outSize != NULL) *outSize = dataSize; - return data; -} - -#include "title/TitleSequence.h" - -static void title_sequence_open(const char *path, const char *customName) -{ - utf8 titlePath[MAX_PATH]; - file_info fileInfo; - SDL_RWops *file; - int fileEnumHandle, i, preset; - char parts[3 * 128], *token, *part1, *part2; - - TitleSequence * seq = LoadTitleSequence(path); - FreeTitleSequence(seq); - - int error; - zip_t * zip = zip_open(path, ZIP_RDONLY, &error); - if (zip == NULL) { - // Unable to open zip - return; - } - - size_t scriptLength; - char * script = (char *)get_zip_data(zip, "script.txt", &scriptLength); - if (script == NULL) { - // Unable to open script - zip_close(zip); - return; - } - - zip_close(zip); - - // Check if the preset is already loaded - // No need to read the first two presets as they're hardcoded in - for (preset = 0; preset < gConfigTitleSequences.num_presets; preset++) { - if (_stricmp(path, gConfigTitleSequences.presets[preset].name) == 0) { - return; - } - } - // Otherwise allocate one - if (preset == gConfigTitleSequences.num_presets) { - gConfigTitleSequences.num_presets++; - gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); - - if (customName == NULL) { - char nameBuffer[MAX_PATH]; - safe_strcpy(nameBuffer, path, MAX_PATH); - // Get folder name - // First strip off the last folder separator - *strrchr(nameBuffer, *PATH_SEPARATOR) = '\0'; - // Then find the name of the folder - char *name = strrchr(nameBuffer, *PATH_SEPARATOR) + 1; - safe_strcpy(gConfigTitleSequences.presets[preset].name, name, TITLE_SEQUENCE_NAME_SIZE); - gConfigTitleSequences.presets[preset].path[0] = 0; - } - else { - safe_strcpy(gConfigTitleSequences.presets[preset].name, customName, TITLE_SEQUENCE_NAME_SIZE); - safe_strcpy(gConfigTitleSequences.presets[preset].path, path, MAX_PATH); - } - - gConfigTitleSequences.presets[preset].saves = NULL; - gConfigTitleSequences.presets[preset].commands = NULL; - gConfigTitleSequences.presets[preset].num_saves = 0; - gConfigTitleSequences.presets[preset].num_commands = 0; - } - - // Get the save file list - safe_strcpy(titlePath, path, sizeof(titlePath)); - safe_strcat_path(titlePath, "*.sv6", sizeof(titlePath)); - fileEnumHandle = platform_enumerate_files_begin(titlePath); - while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { - gConfigTitleSequences.presets[preset].num_saves++; - gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - safe_strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); - gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1][TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1] = '\0'; - } - platform_enumerate_files_end(fileEnumHandle); - safe_strcpy(titlePath, path, sizeof(titlePath)); - safe_strcat_path(titlePath, "*.sc6", sizeof(titlePath)); - fileEnumHandle = platform_enumerate_files_begin(titlePath); - while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { - gConfigTitleSequences.presets[preset].num_saves++; - gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - safe_strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); - gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1][TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1] = '\0'; - } - platform_enumerate_files_end(fileEnumHandle); - - // Load the script file - file = SDL_RWFromMem(script, (int)scriptLength); - do { - title_script_get_line(file, parts); - - token = &parts[0 * 128]; - part1 = &parts[1 * 128]; - part2 = &parts[2 * 128]; - title_command command = { 0 }; - command.command = 0xFF; - - if (token[0] != 0) { - if (_stricmp(token, "LOAD") == 0) { - command.command = TITLE_SCRIPT_LOAD; - command.saveIndex = 0xFF; - for (i = 0; i < gConfigTitleSequences.presets[preset].num_saves && command.saveIndex == 0xFF; i++) { - if (_stricmp(part1, gConfigTitleSequences.presets[preset].saves[i]) == 0) - command.saveIndex = i; - } - } else if (_stricmp(token, "LOCATION") == 0) { - command.command = TITLE_SCRIPT_LOCATION; - command.x = atoi(part1) & 0xFF; - command.y = atoi(part2) & 0xFF; - } else if (_stricmp(token, "ROTATE") == 0) { - command.command = TITLE_SCRIPT_ROTATE; - command.rotations = atoi(part1) & 0xFF; - } else if (_stricmp(token, "ZOOM") == 0) { - command.command = TITLE_SCRIPT_ZOOM; - command.zoom = atoi(part1) & 0xFF; - } else if (_stricmp(token, "SPEED") == 0) { - command.command = TITLE_SCRIPT_SPEED; - command.speed = max(1, min(4, atoi(part1) & 0xFF)); - } else if (_stricmp(token, "WAIT") == 0) { - command.command = TITLE_SCRIPT_WAIT; - command.seconds = atoi(part1) & 0xFF; - } else if (_stricmp(token, "RESTART") == 0) { - command.command = TITLE_SCRIPT_RESTART; - } else if (_stricmp(token, "END") == 0) { - command.command = TITLE_SCRIPT_END; - } else if (_stricmp(token, "LOADMM") == 0) { - command.command = TITLE_SCRIPT_LOADMM; - } else if (_stricmp(token, "LOADRCT1") == 0) { - command.command = TITLE_SCRIPT_LOADRCT1; - command.saveIndex = atoi(part1) & 0xFF; - } - } - if (command.command != 0xFF) { - gConfigTitleSequences.presets[preset].num_commands++; - gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)gConfigTitleSequences.presets[preset].num_commands); - gConfigTitleSequences.presets[preset].commands[gConfigTitleSequences.presets[preset].num_commands - 1] = command; - } - } while (SDL_RWtell(file) < (int)scriptLength); - SDL_RWclose(file); - - free(script); -} - -void title_sequence_save_preset_script(int preset) -{ - utf8 path[MAX_PATH]; - SDL_RWops *file; - int i; - - - platform_get_user_directory(path, "title sequences", sizeof(path)); - safe_strcat_path(path, gConfigTitleSequences.presets[preset].name, MAX_PATH); - safe_strcat_path(path, "script.txt", MAX_PATH); - - file = SDL_RWFromFile(path, "wb"); - if (file == NULL) { - log_error("Unable to write to script file."); - return; - } - - for (i = 0; i < gConfigTitleSequences.presets[preset].num_commands; i++) { - title_command *command = &gConfigTitleSequences.presets[preset].commands[i]; - switch (command->command) { - case TITLE_SCRIPT_LOAD: - if (command->saveIndex == 0xFF) - rwopsprintf(file, "LOAD "); - else - rwopsprintf(file, "LOAD %s", gConfigTitleSequences.presets[preset].saves[command->saveIndex]); - break; - case TITLE_SCRIPT_LOCATION: - rwopsprintf(file, "LOCATION %i %i", command->x, command->y); - break; - case TITLE_SCRIPT_ROTATE: - rwopsprintf(file, "ROTATE %i", command->rotations); - break; - case TITLE_SCRIPT_ZOOM: - rwopsprintf(file, "ZOOM %i", command->zoom); - break; - case TITLE_SCRIPT_SPEED: - rwopsprintf(file, "SPEED %i", command->speed); - break; - case TITLE_SCRIPT_WAIT: - rwopsprintf(file, "WAIT %i", command->seconds); - rwopswritenewline(file); - break; - case TITLE_SCRIPT_RESTART: - rwopsprintf(file, "RESTART"); - break; - case TITLE_SCRIPT_END: - rwopsprintf(file, "END"); - break; - } - rwopswritenewline(file); - } - - SDL_RWclose(file); -} - - #pragma endregion diff --git a/src/config.h b/src/config.h index 750e1692bd..07af8f7555 100644 --- a/src/config.h +++ b/src/config.h @@ -296,39 +296,6 @@ typedef struct theme_features { uint8 rct1_scenario_font; } theme_features; -#define TITLE_SEQUENCE_MAX_SAVE_LENGTH 51 - -typedef struct title_command { - uint8 command; - union { - uint8 saveIndex; // LOAD (this index is internal only) - uint8 x; // LOCATION - uint8 rotations; // ROTATE (counter-clockwise) - uint8 zoom; // ZOOM - uint8 speed; // SPEED - uint8 seconds; // WAIT - }; - uint8 y; // LOCATION -} title_command; - -#define TITLE_SEQUENCE_NAME_SIZE 256 - -typedef struct title_sequence { - char name[TITLE_SEQUENCE_NAME_SIZE]; - char path[MAX_PATH]; // Needed for non-modifiable presets - char (*saves)[TITLE_SEQUENCE_MAX_SAVE_LENGTH]; - title_command *commands; - uint8 num_saves; - uint16 num_commands; - -} title_sequence; - -typedef struct title_sequences_configuration { - title_sequence *presets; - uint16 num_presets; - -} title_sequences_configuration; - typedef struct shortcut_entry { uint8 key; uint8 modifier; @@ -341,7 +308,6 @@ extern twitch_configuration gConfigTwitch; extern network_configuration gConfigNetwork; extern notification_configuration gConfigNotifications; extern font_configuration gConfigFonts; -extern title_sequences_configuration gConfigTitleSequences; extern uint16 gShortcutKeys[SHORTCUT_COUNT]; diff --git a/src/interface/title_sequences.c b/src/interface/title_sequences.c index 0ccd075188..65bed449e6 100644 --- a/src/interface/title_sequences.c +++ b/src/interface/title_sequences.c @@ -18,6 +18,7 @@ #include "../rct2.h" #include "../title.h" #include "../title/TitleSequence.h" +#include "../title/TitleSequenceManager.h" #include "../util/util.h" #include "title_sequences.h" #include "window.h" @@ -26,16 +27,18 @@ uint16 gCurrentTitleSequence; uint16 gCurrentPreviewTitleSequence; -title_command TitleScriptMakeCommand(int command, int parameter1, int parameter2) +TitleCommand TitleScriptMakeCommand(int command, int parameter1, int parameter2) { - title_command titleCommand = { (uint8)command, (uint8)parameter1, (uint8)parameter2 }; + // TitleCommand titleCommand = { (uint8)command, (uint8)parameter1, (uint8)parameter2 }; + TitleCommand titleCommand = { 0 }; return titleCommand; } bool title_sequence_name_exists(const char *name) { - for (int i = 0; i < gConfigTitleSequences.num_presets; i++) { - if (_stricmp(gConfigTitleSequences.presets[i].name, name) == 0) + size_t count = title_sequence_manager_get_count(); + for (size_t i = 0; i < count; i++) { + if (_stricmp(title_sequence_manager_get_name(i), name) == 0) return true; } return false; @@ -43,6 +46,8 @@ bool title_sequence_name_exists(const char *name) bool title_sequence_save_exists(int preset, const char *name) { + return false; +#if 0 utf8 newName[MAX_PATH]; const char *extension = path_get_extension(name); safe_strcpy(newName, name, MAX_PATH); @@ -53,43 +58,29 @@ bool title_sequence_save_exists(int preset, const char *name) return true; } return false; +#endif } void title_sequence_change_preset(int preset) { - if (preset >= 0 && preset < gConfigTitleSequences.num_presets) { - SafeFree(gConfigInterface.current_title_sequence_preset); - switch (preset) { - case 0: - gConfigInterface.current_title_sequence_preset = _strdup("*RCT1"); - break; - case 1: - gConfigInterface.current_title_sequence_preset = _strdup("*RCT1AA"); - break; - case 2: - gConfigInterface.current_title_sequence_preset = _strdup("*RCT1AALL"); - break; - case 3: - gConfigInterface.current_title_sequence_preset = _strdup("*RCT2"); - break; - case 4: - gConfigInterface.current_title_sequence_preset = _strdup("*OPENRCT2"); - break; - default: - gConfigInterface.current_title_sequence_preset = _strdup(gConfigTitleSequences.presets[preset].name); - break; - } - gCurrentPreviewTitleSequence = preset; + int count = (int)title_sequence_manager_get_count(); + if (preset < 0 || preset >= count) { + return; } - window_invalidate_all(); - // Switch to (and restart) this title sequence if it's valid + const utf8 * configId = title_sequence_manager_get_config_id(preset); + SafeFree(gConfigInterface.current_title_sequence_preset); + gConfigInterface.current_title_sequence_preset = _strdup(configId); + + gCurrentPreviewTitleSequence = preset; title_refresh_sequence(); + window_invalidate_all(); } void title_sequence_create_preset(const char *name) { +#if 0 if (filename_valid_characters(name) && !title_sequence_name_exists(name)) { int preset = gConfigTitleSequences.num_presets; gConfigTitleSequences.num_presets++; @@ -112,10 +103,12 @@ void title_sequence_create_preset(const char *name) title_sequence_save_preset_script(preset); gCurrentTitleSequence = preset; } +#endif } void title_sequence_duplicate_preset(int duplicate, const char *name) { +#if 0 if (duplicate >= 0 && duplicate < gConfigTitleSequences.num_presets && filename_valid_characters(name) && !title_sequence_name_exists(name)) { int preset = gConfigTitleSequences.num_presets; gConfigTitleSequences.num_presets++; @@ -124,7 +117,7 @@ void title_sequence_duplicate_preset(int duplicate, const char *name) gConfigTitleSequences.presets[preset].path[0] = 0; size_t savesSize = sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * gConfigTitleSequences.presets[duplicate].num_saves; - size_t commandsSize = sizeof(title_command) * gConfigTitleSequences.presets[duplicate].num_commands; + size_t commandsSize = sizeof(TitleCommand) * gConfigTitleSequences.presets[duplicate].num_commands; gConfigTitleSequences.presets[preset].saves = malloc(savesSize); gConfigTitleSequences.presets[preset].commands = malloc(commandsSize); memcpy(gConfigTitleSequences.presets[preset].saves, gConfigTitleSequences.presets[duplicate].saves, savesSize); @@ -173,10 +166,12 @@ void title_sequence_duplicate_preset(int duplicate, const char *name) title_sequence_save_preset_script(preset); gCurrentTitleSequence = preset; } +#endif } void title_sequence_delete_preset(int preset) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets) { // Delete the folder utf8 path[MAX_PATH]; @@ -201,10 +196,12 @@ void title_sequence_delete_preset(int preset) else if (gCurrentPreviewTitleSequence == preset) title_sequence_change_preset(0); } +#endif } void title_sequence_rename_preset(int preset, const char *newName) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && filename_valid_characters(newName) && !title_sequence_name_exists(newName)) { // Rename the folder utf8 src[MAX_PATH], dest[MAX_PATH]; @@ -221,11 +218,13 @@ void title_sequence_rename_preset(int preset, const char *newName) gConfigInterface.current_title_sequence_preset = gConfigTitleSequences.presets[preset].name; } } +#endif } void title_sequence_add_save(int preset, const char *path, const char *newName) { +#if 0 utf8 newPath[MAX_PATH]; const char *extension = path_get_extension(newName); safe_strcpy(newPath, newName, MAX_PATH); @@ -249,10 +248,12 @@ void title_sequence_add_save(int preset, const char *path, const char *newName) if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) path_append_extension(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], ".sv6", TITLE_SEQUENCE_MAX_SAVE_LENGTH); } +#endif } void title_sequence_remove_save(int preset, int index) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index < gConfigTitleSequences.presets[preset].num_saves) { // Delete the save file utf8 path[MAX_PATH]; @@ -278,10 +279,12 @@ void title_sequence_remove_save(int preset, int index) gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); title_sequence_save_preset_script(preset); } +#endif } void title_sequence_rename_save(int preset, int index, const char *newName) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index < gConfigTitleSequences.presets[preset].num_saves && filename_valid_characters(newName) && !title_sequence_save_exists(preset, newName)) { @@ -305,22 +308,26 @@ void title_sequence_rename_save(int preset, int index, const char *newName) path_append_extension(gConfigTitleSequences.presets[preset].saves[index], ".sv6", TITLE_SEQUENCE_MAX_SAVE_LENGTH); title_sequence_save_preset_script(preset); } +#endif } -void title_sequence_add_command(int preset, title_command command) +void title_sequence_add_command(int preset, TitleCommand command) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets) { - gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)(gConfigTitleSequences.presets[preset].num_commands + 1)); + gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(TitleCommand) * (size_t)(gConfigTitleSequences.presets[preset].num_commands + 1)); gConfigTitleSequences.presets[preset].commands[gConfigTitleSequences.presets[preset].num_commands] = command; gConfigTitleSequences.presets[preset].num_commands++; title_sequence_save_preset_script(preset); } +#endif } -void title_sequence_insert_command(int preset, int index, title_command command) +void title_sequence_insert_command(int preset, int index, TitleCommand command) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index <= gConfigTitleSequences.presets[preset].num_commands) { - gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)(gConfigTitleSequences.presets[preset].num_commands + 1)); + gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(TitleCommand) * (size_t)(gConfigTitleSequences.presets[preset].num_commands + 1)); for (int i = gConfigTitleSequences.presets[preset].num_commands; i > index; i--) { gConfigTitleSequences.presets[preset].commands[i] = gConfigTitleSequences.presets[preset].commands[i - 1]; } @@ -328,36 +335,43 @@ void title_sequence_insert_command(int preset, int index, title_command command) gConfigTitleSequences.presets[preset].num_commands++; title_sequence_save_preset_script(preset); } +#endif } void title_sequence_delete_command(int preset, int index) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index < gConfigTitleSequences.presets[preset].num_commands) { for (int i = index; i < gConfigTitleSequences.presets[preset].num_commands - 1; i++) { gConfigTitleSequences.presets[preset].commands[i] = gConfigTitleSequences.presets[preset].commands[i + 1]; } gConfigTitleSequences.presets[preset].num_commands--; - gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)gConfigTitleSequences.presets[preset].num_commands); + gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(TitleCommand) * (size_t)gConfigTitleSequences.presets[preset].num_commands); title_sequence_save_preset_script(preset); } +#endif } void title_sequence_move_down_command(int preset, int index) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index + 1 < gConfigTitleSequences.presets[preset].num_commands) { - title_command command = gConfigTitleSequences.presets[preset].commands[index]; + TitleCommand command = gConfigTitleSequences.presets[preset].commands[index]; gConfigTitleSequences.presets[preset].commands[index] = gConfigTitleSequences.presets[preset].commands[index + 1]; gConfigTitleSequences.presets[preset].commands[index + 1] = command; title_sequence_save_preset_script(preset); } +#endif } void title_sequence_move_up_command(int preset, int index) { +#if 0 if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index > 0 && index < gConfigTitleSequences.presets[preset].num_commands) { - title_command command = gConfigTitleSequences.presets[preset].commands[index]; + TitleCommand command = gConfigTitleSequences.presets[preset].commands[index]; gConfigTitleSequences.presets[preset].commands[index] = gConfigTitleSequences.presets[preset].commands[index - 1]; gConfigTitleSequences.presets[preset].commands[index - 1] = command; title_sequence_save_preset_script(preset); } +#endif } diff --git a/src/interface/title_sequences.h b/src/interface/title_sequences.h index ad95f87350..54c209a117 100644 --- a/src/interface/title_sequences.h +++ b/src/interface/title_sequences.h @@ -21,10 +21,11 @@ #include "window.h" #include "../config.h" #include "../title.h" +#include "../title/TitleSequence.h" #define TITLE_SEQUENCE_DEFAULT_PRESETS 2 -title_command TitleScriptMakeCommand(int command, int parameter1, int parameter2); +TitleCommand TitleScriptMakeCommand(int command, int parameter1, int parameter2); #define TITLE_WAIT(t) TitleScriptMakeCommand(TITLE_SCRIPT_WAIT, t, 0) #define TITLE_LOADMM() TitleScriptMakeCommand(TITLE_SCRIPT_LOADMM, 0, 0) @@ -55,8 +56,8 @@ void title_sequence_remove_save(int preset, int index); void title_sequence_rename_save(int preset, int index, const char *newName); // Commands -void title_sequence_add_command(int preset, title_command command); -void title_sequence_insert_command(int preset, int index, title_command command); +void title_sequence_add_command(int preset, TitleCommand command); +void title_sequence_insert_command(int preset, int index, TitleCommand command); void title_sequence_delete_command(int preset, int index); void title_sequence_move_down_command(int preset, int index); void title_sequence_move_up_command(int preset, int index); diff --git a/src/title.c b/src/title.c index 113f0ddb34..638c8fd8be 100644 --- a/src/title.c +++ b/src/title.c @@ -24,6 +24,7 @@ #include "localisation/date.h" #include "localisation/localisation.h" #include "interface/screenshot.h" +#include "interface/title_sequences.h" #include "interface/viewport.h" #include "intro.h" #include "management/news_item.h" @@ -35,15 +36,15 @@ #include "scenario.h" #include "ScenarioRepository.h" #include "ScenarioSources.h" +#include "title.h" #include "title/TitleSequence.h" +#include "title/TitleSequenceManager.h" #include "util/util.h" #include "world/climate.h" #include "world/map.h" #include "world/park.h" #include "world/scenery.h" #include "world/sprite.h" -#include "title.h" -#include "interface/title_sequences.h" #include "windows/error.h" static const int gRandomShowcase = 0; @@ -87,6 +88,9 @@ static int _scriptNoLoadsSinceRestart; static int _scriptWaitCounter; static int _scriptCurrentPreset; +static int _loadedTitleSequenceId = -1; +static TitleSequence * _loadedTitleSequence = NULL; + static void title_init_showcase(); static void title_update_showcase(); @@ -94,8 +98,6 @@ static uint8 *generate_random_script(); #pragma endregion -static uint8 *title_script_load(); - /** * * rct2: 0x0068E8DA @@ -167,6 +169,14 @@ void title_create_windows() */ static void title_init_showcase() { + size_t seqId = title_sequence_manager_get_index_for_config_id(gConfigInterface.current_title_sequence_preset); + if (seqId == SIZE_MAX) { + seqId = title_sequence_manager_get_index_for_config_id("*OPENRCT2"); + if (seqId == SIZE_MAX) { + seqId = 0; + } + } + title_sequence_change_preset((int)seqId); title_refresh_sequence(); } @@ -378,18 +388,11 @@ static void title_do_next_script_opcode() } while (*(_currentScript - 1) != 0); // Construct full relative path - if (gConfigTitleSequences.presets[_scriptCurrentPreset].path[0]) { - safe_strcpy(path, gConfigTitleSequences.presets[_scriptCurrentPreset].path, MAX_PATH); - } - else { - platform_get_user_directory(path, "title sequences", sizeof(path)); - safe_strcat_path(path, gConfigTitleSequences.presets[_scriptCurrentPreset].name, sizeof(path)); - } - + safe_strcpy(path, _loadedTitleSequence->Path, sizeof(path)); safe_strcat_path(path, filename, sizeof(path)); if (title_load_park(path)) { _scriptNoLoadsSinceRestart = 0; - gTitleScriptSave = gConfigTitleSequences.presets[gCurrentPreviewTitleSequence].commands[gTitleScriptCommand].saveIndex; + gTitleScriptSave = _loadedTitleSequence->Commands[gTitleScriptCommand].SaveIndex; } else { log_error("Failed to load: \"%s\" for the title sequence.", path); script_opcode = *_currentScript; @@ -574,159 +577,39 @@ static uint8 *generate_random_script() return script; } -#pragma region Load script.txt - -void title_script_get_line(SDL_RWops *file, char *parts) -{ - int i, c, part, cindex, whitespace, comment, load; - - for (i = 0; i < 3; i++) - parts[i * 128] = 0; - - part = 0; - cindex = 0; - whitespace = 1; - comment = 0; - load = 0; - for (; part < 3;) { - c = 0; - if (SDL_RWread(file, &c, 1, 1) != 1) - c = EOF; - - if (c == '\n' || c == '\r' || c == EOF) { - parts[part * 128 + cindex] = 0; - return; - } else if (c == '#') { - parts[part * 128 + cindex] = 0; - comment = 1; - } else if (c == ' ' && !comment && !load) { - if (!whitespace) { - if (part == 0 && cindex == 4 && _strnicmp(parts, "LOAD", 4) == 0) - load = true; - parts[part * 128 + cindex] = 0; - part++; - cindex = 0; - } - } else if (!comment) { - whitespace = 0; - if (cindex < 127) { - parts[part * 128 + cindex] = c; - cindex++; - } - else { - parts[part * 128 + cindex] = 0; - part++; - cindex = 0; - } - } - } -} - -static uint8 *title_script_load() -{ - SDL_RWops *file; - char parts[3 * 128], *token, *part1, *part2, *src; - - utf8 path[MAX_PATH]; - - platform_get_openrct_data_path(path, sizeof(path)); - safe_strcat_path(path, "title", MAX_PATH); - safe_strcat_path(path, "script.txt", MAX_PATH); - log_verbose("loading title script, %s", path); - file = SDL_RWFromFile(path, "r"); - if (file == NULL) { - log_error("unable to load title script"); - return NULL; - } - sint64 fileSize = SDL_RWsize(file); - - uint8 *binaryScript = (uint8*)malloc(1024 * 8); - if (binaryScript == NULL) { - SDL_RWclose(file); - - log_error("unable to allocate memory for script"); - return NULL; - } - - uint8 *scriptPtr = binaryScript; - - do { - title_script_get_line(file, parts); - - token = &parts[0 * 128]; - part1 = &parts[1 * 128]; - part2 = &parts[2 * 128]; - - if (token[0] != 0) { - if (_stricmp(token, "LOAD") == 0) { - src = part1; - *scriptPtr++ = TITLE_SCRIPT_LOAD; - do { - *scriptPtr++ = *src++; - } while (*(src - 1) != 0); - } else if (_stricmp(token, "LOCATION") == 0) { - *scriptPtr++ = TITLE_SCRIPT_LOCATION; - *scriptPtr++ = atoi(part1) & 0xFF; - *scriptPtr++ = atoi(part2) & 0xFF; - } else if (_stricmp(token, "ROTATE") == 0) { - *scriptPtr++ = TITLE_SCRIPT_ROTATE; - *scriptPtr++ = atoi(part1) & 0xFF; - } else if (_stricmp(token, "ZOOM") == 0) { - *scriptPtr++ = TITLE_SCRIPT_ZOOM; - *scriptPtr++ = atoi(part1) & 0xFF; - } else if (_stricmp(token, "WAIT") == 0) { - *scriptPtr++ = TITLE_SCRIPT_WAIT; - *scriptPtr++ = atoi(part1) & 0xFF; - } else { - log_error("unknown token, %s", token); - SafeFree(binaryScript); - SDL_RWclose(file); - return NULL; - } - } - } while (SDL_RWtell(file) < fileSize); - SDL_RWclose(file); - - *scriptPtr++ = TITLE_SCRIPT_RESTART; - - int scriptLength = (int)(scriptPtr - binaryScript); - binaryScript = realloc(binaryScript, scriptLength); - if (binaryScript == NULL) { - log_error("unable to reallocate memory for script"); - return NULL; - } - - return binaryScript; -} - -#pragma endregion - bool title_refresh_sequence() { _scriptCurrentPreset = gCurrentPreviewTitleSequence; - title_sequence *title = &gConfigTitleSequences.presets[_scriptCurrentPreset]; + if (_loadedTitleSequenceId != _scriptCurrentPreset) { + FreeTitleSequence(_loadedTitleSequence); + + const utf8 * path = title_sequence_manager_get_path(_scriptCurrentPreset); + _loadedTitleSequence = LoadTitleSequence(path); + _loadedTitleSequenceId = _scriptCurrentPreset; + } + TitleSequence *title = _loadedTitleSequence; bool hasLoad = false, hasInvalidSave = false, hasWait = false, hasRestart = false; - for (int i = 0; i < title->num_commands && !hasInvalidSave; i++) { - if (title->commands[i].command == TITLE_SCRIPT_LOAD) { - if (title->commands[i].saveIndex == 0xFF) + for (int i = 0; i < title->NumCommands && !hasInvalidSave; i++) { + if (title->Commands[i].Type == TITLE_SCRIPT_LOAD) { + if (title->Commands[i].SaveIndex == 0xFF) hasInvalidSave = true; hasLoad = true; } - else if (title->commands[i].command == TITLE_SCRIPT_LOADRCT1) { + else if (title->Commands[i].Type == TITLE_SCRIPT_LOADRCT1) { hasLoad = true; } - else if (title->commands[i].command == TITLE_SCRIPT_LOADMM) { + else if (title->Commands[i].Type == TITLE_SCRIPT_LOADMM) { hasLoad = true; } - else if (title->commands[i].command == TITLE_SCRIPT_WAIT && title->commands[i].seconds >= 4) { + else if (title->Commands[i].Type == TITLE_SCRIPT_WAIT && title->Commands[i].Seconds >= 4) { hasWait = true; } - else if (title->commands[i].command == TITLE_SCRIPT_RESTART) { + else if (title->Commands[i].Type == TITLE_SCRIPT_RESTART) { hasRestart = true; break; } - else if (title->commands[i].command == TITLE_SCRIPT_END) { + else if (title->Commands[i].Type == TITLE_SCRIPT_END) { break; } } @@ -736,33 +619,33 @@ bool title_refresh_sequence() binaryScript = malloc(1024 * 8); scriptPtr = binaryScript; - for (int i = 0; i < title->num_commands; i++) { - *scriptPtr++ = title->commands[i].command; - switch (title->commands[i].command) { + for (int i = 0; i < title->NumCommands; i++) { + *scriptPtr++ = title->Commands[i].Type; + switch (title->Commands[i].Type) { case TITLE_SCRIPT_LOADRCT1: - *scriptPtr++ = title->commands[i].saveIndex; + *scriptPtr++ = title->Commands[i].SaveIndex; break; case TITLE_SCRIPT_LOAD: - src = title->saves[title->commands[i].saveIndex]; + src = title->Saves[title->Commands[i].SaveIndex]; do { *scriptPtr++ = *src++; } while (*(src - 1) != 0); break; case TITLE_SCRIPT_LOCATION: - *scriptPtr++ = title->commands[i].x; - *scriptPtr++ = title->commands[i].y; + *scriptPtr++ = title->Commands[i].X; + *scriptPtr++ = title->Commands[i].Y; break; case TITLE_SCRIPT_ROTATE: - *scriptPtr++ = title->commands[i].rotations; + *scriptPtr++ = title->Commands[i].Rotations; break; case TITLE_SCRIPT_ZOOM: - *scriptPtr++ = title->commands[i].zoom; + *scriptPtr++ = title->Commands[i].Zoom; break; case TITLE_SCRIPT_SPEED: - *scriptPtr++ = title->commands[i].speed; + *scriptPtr++ = title->Commands[i].Speed; break; case TITLE_SCRIPT_WAIT: - *scriptPtr++ = title->commands[i].seconds; + *scriptPtr++ = title->Commands[i].Seconds; break; } } diff --git a/src/title/TitleSequence.cpp b/src/title/TitleSequence.cpp index fafe93b9e7..76963020f9 100644 --- a/src/title/TitleSequence.cpp +++ b/src/title/TitleSequence.cpp @@ -65,14 +65,17 @@ extern "C" void FreeTitleSequence(TitleSequence * seq) { - Memory::Free(seq->Name); - Memory::Free(seq->Path); - Memory::Free(seq->Commands); - for (size_t i = 0; i < seq->NumSaves; i++) + if (seq != nullptr) { - Memory::Free(seq->Saves[i]); + Memory::Free(seq->Name); + Memory::Free(seq->Path); + Memory::Free(seq->Commands); + for (size_t i = 0; i < seq->NumSaves; i++) + { + Memory::Free(seq->Saves[i]); + } + Memory::Free(seq->Saves); } - Memory::Free(seq->Saves); } } @@ -265,3 +268,60 @@ static void * GetZipFileData(zip_t * zip, const char * name, size_t * outSize) if (outSize != NULL) *outSize = dataSize; return data; } + +/* +void title_sequence_save_preset_script(int preset) +{ + utf8 path[MAX_PATH]; + SDL_RWops *file; + int i; + + + platform_get_user_directory(path, "title sequences", sizeof(path)); + safe_strcat_path(path, gConfigTitleSequences.presets[preset].name, MAX_PATH); + safe_strcat_path(path, "script.txt", MAX_PATH); + + file = SDL_RWFromFile(path, "wb"); + if (file == NULL) { + log_error("Unable to write to script file."); + return; + } + + for (i = 0; i < gConfigTitleSequences.presets[preset].num_commands; i++) { + title_command *command = &gConfigTitleSequences.presets[preset].commands[i]; + switch (command->command) { + case TITLE_SCRIPT_LOAD: + if (command->saveIndex == 0xFF) + rwopsprintf(file, "LOAD "); + else + rwopsprintf(file, "LOAD %s", gConfigTitleSequences.presets[preset].saves[command->saveIndex]); + break; + case TITLE_SCRIPT_LOCATION: + rwopsprintf(file, "LOCATION %i %i", command->x, command->y); + break; + case TITLE_SCRIPT_ROTATE: + rwopsprintf(file, "ROTATE %i", command->rotations); + break; + case TITLE_SCRIPT_ZOOM: + rwopsprintf(file, "ZOOM %i", command->zoom); + break; + case TITLE_SCRIPT_SPEED: + rwopsprintf(file, "SPEED %i", command->speed); + break; + case TITLE_SCRIPT_WAIT: + rwopsprintf(file, "WAIT %i", command->seconds); + rwopswritenewline(file); + break; + case TITLE_SCRIPT_RESTART: + rwopsprintf(file, "RESTART"); + break; + case TITLE_SCRIPT_END: + rwopsprintf(file, "END"); + break; + } + rwopswritenewline(file); + } + + SDL_RWclose(file); +} +*/ diff --git a/src/title/TitleSequenceManager.cpp b/src/title/TitleSequenceManager.cpp new file mode 100644 index 0000000000..dba1b76325 --- /dev/null +++ b/src/title/TitleSequenceManager.cpp @@ -0,0 +1,154 @@ +#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers +/***************************************************************************** + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * OpenRCT2 is the work of many authors, a full list can be found in contributors.md + * For more information, visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * A full copy of the GNU General Public License can be found in licence.txt + *****************************************************************************/ +#pragma endregion + +#include +#include "../core/FileScanner.h" +#include "../core/Memory.hpp" +#include "../core/Path.hpp" +#include "../core/String.hpp" +#include "TitleSequenceManager.h" + +extern "C" +{ + #include "../localisation/localisation.h" + #include "../openrct2.h" +} + +namespace TitleSequenceManager +{ + struct PredefinedSequence + { + const utf8 * ConfigId; + const utf8 * Filename; + rct_string_id StringId; + }; + + const PredefinedSequence PredefinedSequences[] = + { + { "*RCT1", "rct1.parkseq", STR_TITLE_SEQUENCE_RCT1 }, + { "*RCT1AA", "rct1aa.parkseq", STR_TITLE_SEQUENCE_RCT1_AA }, + { "*RCT1AALL", "rct1aall.parkseq", STR_TITLE_SEQUENCE_RCT1_AA_LL }, + { "*RCT2", "rct2.parkseq", STR_TITLE_SEQUENCE_RCT2 }, + { "*OPENRCT2", "openrct2.parkseq", STR_TITLE_SEQUENCE_OPENRCT2 }, + }; + + std::vector _items; + + static std::string GetNameFromSequencePath(const utf8 * path); + + size_t GetCount() + { + return _items.size(); + } + + const TitleSequenceManagerItem * GetItem(size_t i) + { + return &_items[i]; + } + + void Scan() + { + utf8 path[MAX_PATH]; + platform_get_openrct_data_path(path, sizeof(path)); + Path::Append(path, sizeof(path), "title"); + Path::Append(path, sizeof(path), "*.parkseq"); + + IFileScanner * fileScanner = Path::ScanDirectory(path, true); + while (fileScanner->Next()) + { + const utf8 * path = fileScanner->GetPath(); + + TitleSequenceManagerItem item; + item.Name = GetNameFromSequencePath(path); + item.Path = std::string(path); + _items.push_back(item); + } + delete fileScanner; + } + + static std::string GetNameFromSequencePath(const utf8 * path) + { + const utf8 * filename = Path::GetFileName(path); + for (const auto &pseq : PredefinedSequences) + { + if (String::Equals(filename, pseq.Filename, true)) + { + return language_get_string(pseq.StringId); + } + } + + utf8 * name = Path::GetFileNameWithoutExtension(filename); + std::string result = std::string(name); + Memory::Free(name); + return result; + } +} + +extern "C" +{ + size_t title_sequence_manager_get_count() + { + return TitleSequenceManager::GetCount(); + } + + const utf8 * title_sequence_manager_get_name(size_t index) + { + auto item = TitleSequenceManager::GetItem(index); + const utf8 * name = item->Name.c_str(); + return name; + } + + const utf8 * title_sequence_manager_get_path(size_t index) + { + auto item = TitleSequenceManager::GetItem(index); + const utf8 * name = item->Path.c_str(); + return name; + } + + const utf8 * title_sequence_manager_get_config_id(size_t index) + { + auto item = TitleSequenceManager::GetItem(index); + const utf8 * name = item->Name.c_str(); + const utf8 * filename = Path::GetFileName(item->Path.c_str()); + for (const auto &pseq : TitleSequenceManager::PredefinedSequences) + { + if (String::Equals(filename, pseq.Filename, true)) + { + return pseq.ConfigId; + } + } + return name; + } + + size_t title_sequence_manager_get_index_for_config_id(const utf8 * configId) + { + size_t count = TitleSequenceManager::GetCount(); + for (size_t i = 0; i < count; i++) + { + const utf8 * cid = title_sequence_manager_get_config_id(i); + if (String::Equals(cid, configId)) + { + return i; + } + } + return SIZE_MAX; + } + + void title_sequence_manager_scan() + { + TitleSequenceManager::Scan(); + } +} diff --git a/src/title/TitleSequenceManager.h b/src/title/TitleSequenceManager.h new file mode 100644 index 0000000000..6964dc9ce1 --- /dev/null +++ b/src/title/TitleSequenceManager.h @@ -0,0 +1,46 @@ +#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers +/***************************************************************************** + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * OpenRCT2 is the work of many authors, a full list can be found in contributors.md + * For more information, visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * A full copy of the GNU General Public License can be found in licence.txt + *****************************************************************************/ +#pragma endregion + +#pragma once + +#include "../common.h" + +#ifdef __cplusplus + +#include + +struct TitleSequenceManagerItem +{ + std::string Name; + std::string Path; +}; + +namespace TitleSequenceManager +{ + size_t GetCount(); + const TitleSequenceManagerItem * GetItem(size_t i); +} + +#else + + size_t title_sequence_manager_get_count(); + const utf8 * title_sequence_manager_get_name(size_t index); + const utf8 * title_sequence_manager_get_path(size_t index); + const utf8 * title_sequence_manager_get_config_id(size_t index); + size_t title_sequence_manager_get_index_for_config_id(const utf8 * configId); + void title_sequence_manager_scan(); + +#endif diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 4f61604546..a8ff12ceb4 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -745,7 +745,7 @@ static void window_loadsave_select(rct_window *w, const char *path) 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); - window_text_input_open(w, WIDX_SCROLL, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_ERROR_EXISTING_NAME, STR_STRING, (uintptr_t)_listItems[w->selected_list_item].name, TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); + window_text_input_open(w, WIDX_SCROLL, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_ERROR_EXISTING_NAME, STR_STRING, (uintptr_t)_listItems[w->selected_list_item].name, 52 - 1); } else { title_sequence_add_save(gCurrentTitleSequence, path, newName); diff --git a/src/windows/options.c b/src/windows/options.c index 9f17664749..9ab1582cbf 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -38,6 +38,8 @@ #include "../rct2.h" #include "../sprites.h" #include "../title.h" +#include "../title/TitleSequence.h" +#include "../title/TitleSequenceManager.h" #include "dropdown.h" #include "error.h" #include "../util/util.h" @@ -1123,11 +1125,10 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* dropdown_set_checked(gConfigGeneral.autosave_frequency, true); break; case WIDX_TITLE_SEQUENCE_DROPDOWN: - num_items = gConfigTitleSequences.num_presets; - + num_items = (int)title_sequence_manager_get_count(); for (i = 0; i < num_items; i++) { gDropdownItemsFormat[i] = STR_OPTIONS_DROPDOWN_ITEM; - gDropdownItemsArgs[i] = (uintptr_t)&gConfigTitleSequences.presets[i].name; + gDropdownItemsArgs[i] = (uintptr_t)title_sequence_manager_get_name(i); } window_dropdown_show_text( @@ -1842,7 +1843,8 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) w->y + window_options_misc_widgets[WIDX_AUTOSAVE].top ); - set_format_arg(0, uintptr_t, (uintptr_t)&gConfigTitleSequences.presets[gCurrentPreviewTitleSequence].name); + const utf8 * name = title_sequence_manager_get_name(gCurrentPreviewTitleSequence); + set_format_arg(0, uintptr_t, (uintptr_t)name); gfx_draw_string_left(dpi, STR_TITLE_SEQUENCE, w, w->colours[1], w->x + 10, w->y + window_options_misc_widgets[WIDX_TITLE_SEQUENCE].top + 1); gfx_draw_string_left_clipped( dpi, diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 34b686eab6..99e786a762 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -30,6 +30,8 @@ #include "../util/util.h" #include "dropdown.h" +#if 0 + typedef struct TITLE_COMMAND_ORDER { uint8 command; rct_string_id nameStringId; @@ -192,8 +194,11 @@ static uint8 get_zoom() return zoom; } +#endif + void window_title_command_editor_open(int index, bool insert) { +#if 0 rct_window* window; // Check if window is already open @@ -246,8 +251,11 @@ void window_title_command_editor_open(int index, bool insert) snprintf(textbox1Buffer, BUF_SIZE, "%d", command.rotations); break; } +#endif } +#if 0 + static void window_title_command_editor_mouseup(rct_window *w, int widgetIndex) { rct_window *title_editor_w; @@ -579,3 +587,5 @@ static void window_title_command_editor_paint(rct_window *w, rct_drawpixelinfo * } } } + +#endif diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 94a6dffa6b..29f796d886 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -43,6 +43,8 @@ enum { WINDOW_TITLE_EDITOR_TAB_COUNT } WINDOW_TITLE_EDITOR_TAB; +#if 0 + static void window_title_editor_close(rct_window *w); static void window_title_editor_mouseup(rct_window *w, int widgetIndex); static void window_title_editor_resize(rct_window *w); @@ -223,8 +225,11 @@ static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_wind } } +#endif + void window_title_editor_open(int tab) { +#if 0 rct_window* window; // Check if window is already open @@ -278,9 +283,10 @@ void window_title_editor_open(int tab) window->min_height = WH; window->max_width = 500; window->max_height = 450; - +#endif } +#if 0 void window_title_editor_close(rct_window *w) { rct_window *command_editor_w, *load_save_w; @@ -991,3 +997,4 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int } } } +#endif