diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 1d180c43f1..373c594271 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4464,7 +4464,7 @@ STR_6152 :Invalid response from master server (no JSON array) STR_6153 :Pay to enter park / Pay per ride STR_6154 :It is not recommended to run OpenRCT2 with elevated permissions. STR_6155 :Neither KDialog nor Zenity are installed. Please install one, or configure from the command line. - +STR_6156 :Name is reserved ############# # Scenarios # diff --git a/src/openrct2-ui/windows/TitleEditor.cpp b/src/openrct2-ui/windows/TitleEditor.cpp index 13306b3a92..76e056ef46 100644 --- a/src/openrct2-ui/windows/TitleEditor.cpp +++ b/src/openrct2-ui/windows/TitleEditor.cpp @@ -111,7 +111,7 @@ enum WINDOW_TITLE_EDITOR_WIDGET_IDX { WIDX_TITLE_EDITOR_NEW_BUTTON, WIDX_TITLE_EDITOR_DUPLICATE_BUTTON, WIDX_TITLE_EDITOR_DELETE_BUTTON, - WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON, + WIDX_TITLE_EDITOR_RENAME_BUTTON, // Saves Tab WIDX_TITLE_EDITOR_ADD_SAVE, @@ -237,7 +237,7 @@ void window_title_editor_open(sint32 tab) (1 << WIDX_TITLE_EDITOR_NEW_BUTTON) | (1 << WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) | (1 << WIDX_TITLE_EDITOR_DELETE_BUTTON) | - (1 << WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON) | + (1 << WIDX_TITLE_EDITOR_RENAME_BUTTON) | (1 << WIDX_TITLE_EDITOR_ADD_SAVE) | (1 << WIDX_TITLE_EDITOR_REMOVE_SAVE) | @@ -309,7 +309,7 @@ static void window_title_editor_mouseup(rct_window *w, rct_widgetindex widgetInd break; case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: if (!commandEditorOpen && _editingTitleSequence != nullptr) { - window_text_input_open(w, widgetIndex, STR_TITLE_EDITOR_ACTION_DUPLICATE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_editingTitleSequence->Name, 64); + window_text_input_open(w, widgetIndex, STR_TITLE_EDITOR_ACTION_DUPLICATE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_sequenceName, 64); } break; case WIDX_TITLE_EDITOR_DELETE_BUTTON: @@ -318,9 +318,9 @@ static void window_title_editor_mouseup(rct_window *w, rct_widgetindex widgetInd window_title_editor_load_sequence(0); } break; - case WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON: + case WIDX_TITLE_EDITOR_RENAME_BUTTON: if (window_title_editor_check_can_edit() && _editingTitleSequence != nullptr) { - window_text_input_open(w, widgetIndex, STR_TRACK_MANAGE_RENAME, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_editingTitleSequence->Name, 64); + window_text_input_open(w, widgetIndex, STR_TRACK_MANAGE_RENAME, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_sequenceName, 64); } break; @@ -617,21 +617,25 @@ static void window_title_editor_textinput(rct_window *w, rct_widgetindex widgetI switch (widgetIndex) { case WIDX_TITLE_EDITOR_NEW_BUTTON: case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: - case WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON: + case WIDX_TITLE_EDITOR_RENAME_BUTTON: if (filename_valid_characters(text)) { if (title_sequence_manager_get_index_for_name(text) == SIZE_MAX) { - if (widgetIndex == WIDX_TITLE_EDITOR_NEW_BUTTON) { - size_t newIndex = title_sequence_manager_create(text); - window_title_editor_load_sequence(newIndex); - } else if (widgetIndex == WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) { - size_t newIndex = title_sequence_manager_duplicate(_selectedTitleSequence, text); - window_title_editor_load_sequence(newIndex); + if (!title_sequence_manager_is_name_reserved(text)) { + if (widgetIndex == WIDX_TITLE_EDITOR_NEW_BUTTON) { + size_t newIndex = title_sequence_manager_create(text); + window_title_editor_load_sequence(newIndex); + } else if (widgetIndex == WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) { + size_t newIndex = title_sequence_manager_duplicate(_selectedTitleSequence, text); + window_title_editor_load_sequence(newIndex); + } else { + size_t newIndex = title_sequence_manager_rename(_selectedTitleSequence, text); + window_title_editor_load_sequence(newIndex); + } + config_save_default(); + window_invalidate(w); } else { - size_t newIndex = title_sequence_manager_rename(_selectedTitleSequence, text); - window_title_editor_load_sequence(newIndex); + context_show_error(STR_ERROR_RESERVED_NAME, STR_NONE); } - config_save_default(); - window_invalidate(w); } else { context_show_error(STR_ERROR_EXISTING_NAME, STR_NONE); } @@ -668,7 +672,7 @@ static void window_title_editor_invalidate(rct_window *w) window_title_editor_widgets[WIDX_TITLE_EDITOR_NEW_BUTTON].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_EMPTY; - window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_ADD_SAVE].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_REMOVE_SAVE].type = WWT_EMPTY; @@ -694,7 +698,7 @@ static void window_title_editor_invalidate(rct_window *w) window_title_editor_widgets[WIDX_TITLE_EDITOR_NEW_BUTTON].type = WWT_DROPDOWN_BUTTON; window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_DROPDOWN_BUTTON; window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_DROPDOWN_BUTTON; - window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_DROPDOWN_BUTTON; break; case WINDOW_TITLE_EDITOR_TAB_SAVES: window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].type = WWT_SCROLL; diff --git a/src/openrct2/localisation/string_ids.h b/src/openrct2/localisation/string_ids.h index f9d8a40e83..40ec22ccd0 100644 --- a/src/openrct2/localisation/string_ids.h +++ b/src/openrct2/localisation/string_ids.h @@ -3809,6 +3809,8 @@ enum { STR_ADMIN_NOT_RECOMMENDED = 6154, STR_MISSING_DIALOG_APPLICATION_ERROR = 6155, + STR_ERROR_RESERVED_NAME = 6156, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/openrct2/title/TitleSequenceManager.cpp b/src/openrct2/title/TitleSequenceManager.cpp index 5b4293b127..d1ed6aa033 100644 --- a/src/openrct2/title/TitleSequenceManager.cpp +++ b/src/openrct2/title/TitleSequenceManager.cpp @@ -57,6 +57,7 @@ namespace TitleSequenceManager static std::string GetNameFromSequencePath(const std::string &path); static void GetDataSequencesPath(utf8 * buffer, size_t bufferSize); static void GetUserSequencesPath(utf8 * buffer, size_t bufferSize); + static bool IsNameReserved(const std::string &name); size_t GetCount() { @@ -267,6 +268,12 @@ namespace TitleSequenceManager rct_string_id stringId = PredefinedSequences[item.PredefinedIndex].StringId; item.Name = language_get_string(stringId); } + else if (IsNameReserved(item.Name)) + { + // Reserved names are not allowed because they map to the + // actual predefined names and also prevent editing + return; + } item.IsZip = isZip; _items.push_back(item); } @@ -290,6 +297,21 @@ namespace TitleSequenceManager platform_get_user_directory(buffer, "title sequences", bufferSize); platform_ensure_directory_exists(buffer); } + + static bool IsNameReserved(const std::string &name) + { + for (const auto &pseq : TitleSequenceManager::PredefinedSequences) + { + const utf8 * predefinedName = Path::GetFileNameWithoutExtension(pseq.Filename); + std::string reservedName = std::string(predefinedName); + Memory::Free(predefinedName); + if (String::Equals(name, reservedName, true)) + { + return true; + } + } + return false; + } } extern "C" @@ -376,6 +398,11 @@ extern "C" return SIZE_MAX; } + bool title_sequence_manager_is_name_reserved(const utf8 * name) + { + return TitleSequenceManager::IsNameReserved(name); + } + void title_sequence_manager_scan() { TitleSequenceManager::Scan(); diff --git a/src/openrct2/title/TitleSequenceManager.h b/src/openrct2/title/TitleSequenceManager.h index cde9622683..86badb5dca 100644 --- a/src/openrct2/title/TitleSequenceManager.h +++ b/src/openrct2/title/TitleSequenceManager.h @@ -53,6 +53,7 @@ extern "C" { uint16 title_sequence_manager_get_predefined_index(size_t index); size_t title_sequence_manager_get_index_for_config_id(const utf8 * configId); size_t title_sequence_manager_get_index_for_name(const utf8 * name); + bool title_sequence_manager_is_name_reserved(const utf8 * name); void title_sequence_manager_scan(); void title_sequence_manager_delete(size_t i); size_t title_sequence_manager_rename(size_t i, const utf8 * name);