From e3d1626ba8857d477e5d08bf7c47fd8c298b0df8 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 1 Mar 2026 19:18:51 -0500 Subject: [PATCH] Fixed a bug that disallowed overwriting equipment quick slots with inventory quick slots. --- draugnorak.nvgt | 42 ++++++++++++++++++++++++++++++-- lang/af.ini | 1 + lang/en.ini | 1 + lang/en.template.ini | 1 + lang/es.ini | 1 + scripts/generate_i18n_catalog.py | 1 + src/i18n.nvgt | 4 ++- src/inventory_items.nvgt | 28 +++++++++++++++++++++ src/menus/equipment_menu.nvgt | 5 +--- src/menus/inventory_core.nvgt | 2 +- 10 files changed, 78 insertions(+), 8 deletions(-) diff --git a/draugnorak.nvgt b/draugnorak.nvgt index 10a43de..d47bab9 100644 --- a/draugnorak.nvgt +++ b/draugnorak.nvgt @@ -56,8 +56,9 @@ music_manager mainMenuMusic; const int MAIN_MENU_NEW_GAME = 0; const int MAIN_MENU_LOAD_GAME = 1; const int MAIN_MENU_STORY = 2; -const int MAIN_MENU_LEARN_SOUNDS = 3; -const int MAIN_MENU_EXIT = 4; +const int MAIN_MENU_LANGUAGE = 3; +const int MAIN_MENU_LEARN_SOUNDS = 4; +const int MAIN_MENU_EXIT = 5; void start_main_menu_music() { menu_music_resume_or_play(mainMenuMusic, MAIN_MENU_MUSIC_TRACK, MAIN_MENU_MUSIC_FADE_IN_MS); @@ -67,6 +68,35 @@ void stop_main_menu_music() { menu_music_pause(mainMenuMusic, MAIN_MENU_MUSIC_FADE_OUT_MS); } +void choose_main_menu_language() { + string[] languageCodes; + string[] languageLabels; + i18n_get_available_languages(languageCodes, languageLabels); + int currentIndex = i18n_find_language_index(languageCodes, activeLanguageCode); + if (currentIndex < 0) { + currentIndex = i18n_find_language_index(languageCodes, I18N_DEFAULT_LANGUAGE_CODE); + } + if (currentIndex < 0) + currentIndex = 0; + + int selectedIndex = i18n_run_language_selection_menu(languageCodes, languageLabels, currentIndex, true); + if (selectedIndex < 0 || selectedIndex >= int(languageCodes.length())) + return; + + string selectedCode = languageCodes[selectedIndex]; + if (!i18n_load_language(selectedCode)) + return; + + i18n_save_language_preference(selectedCode); + string localizedWindowTitle = tr("system.ui.window_title"); + show_window(localizedWindowTitle); + ui_set_default_window_title(localizedWindowTitle); + + dictionary args; + args.set("language", languageLabels[selectedIndex]); + speak_with_history(trf("system.language.selected", args), true); +} + int run_main_menu() { start_main_menu_music(); speak_with_history(tr("system.main_menu.prompt"), true); @@ -93,6 +123,11 @@ int run_main_menu() { entry_types.insert_last(0); action_ids.insert_last(MAIN_MENU_STORY); + options.insert_last(tr("system.menu.main.language")); + entry_paths.insert_last(""); + entry_types.insert_last(0); + action_ids.insert_last(MAIN_MENU_LANGUAGE); + options.insert_last(i18n_text("Learn Sounds")); entry_paths.insert_last(""); entry_types.insert_last(0); @@ -210,6 +245,9 @@ void run_game() { } else if (selection == MAIN_MENU_STORY) { run_story_dialog(); continue; + } else if (selection == MAIN_MENU_LANGUAGE) { + choose_main_menu_language(); + continue; } else if (selection == MAIN_MENU_LEARN_SOUNDS) { run_learn_sounds_menu(); continue; diff --git a/lang/af.ini b/lang/af.ini index 702c6e6..a4e715d 100644 --- a/lang/af.ini +++ b/lang/af.ini @@ -25,6 +25,7 @@ direction.west=wes direction.east=oos inventory.cant_carry_any_more_item=Jy kan nie meer {item} dra nie. menu.main.story=Die storie +menu.main.language=Taal story.voice.format={speaker}: {line} story.god.fallback='n god story.god.odin=Odin diff --git a/lang/en.ini b/lang/en.ini index 478cdc4..ba5cca2 100644 --- a/lang/en.ini +++ b/lang/en.ini @@ -40,6 +40,7 @@ menu.canceled=Canceled. menu.no_options=No options. menu.no_matches=No matches for {arg1}. menu.main.story=The story +menu.main.language=Language option.no=No option.yes=Yes inventory.cant_carry_any_more_item=You can't carry any more {item}. diff --git a/lang/en.template.ini b/lang/en.template.ini index 478cdc4..ba5cca2 100644 --- a/lang/en.template.ini +++ b/lang/en.template.ini @@ -40,6 +40,7 @@ menu.canceled=Canceled. menu.no_options=No options. menu.no_matches=No matches for {arg1}. menu.main.story=The story +menu.main.language=Language option.no=No option.yes=Yes inventory.cant_carry_any_more_item=You can't carry any more {item}. diff --git a/lang/es.ini b/lang/es.ini index 1720f42..b0089a7 100644 --- a/lang/es.ini +++ b/lang/es.ini @@ -25,6 +25,7 @@ direction.west=oeste direction.east=este inventory.cant_carry_any_more_item=No puedes llevar mas {item}. menu.main.story=La historia +menu.main.language=Idioma story.voice.format={speaker}: {line} story.god.fallback=Un dios story.god.odin=Odin diff --git a/scripts/generate_i18n_catalog.py b/scripts/generate_i18n_catalog.py index a1c8162..e500661 100644 --- a/scripts/generate_i18n_catalog.py +++ b/scripts/generate_i18n_catalog.py @@ -531,6 +531,7 @@ def write_catalog(entries: Dict[str, Dict[str, object]], output_path: Path) -> N ("system.menu.no_options", "No options."), ("system.menu.no_matches", "No matches for {arg1}."), ("system.menu.main.story", "The story"), + ("system.menu.main.language", "Language"), ("system.option.no", "No"), ("system.option.yes", "Yes"), ("system.inventory.cant_carry_any_more_item", "You can't carry any more {item}."), diff --git a/src/i18n.nvgt b/src/i18n.nvgt index 8275cc4..08d7206 100644 --- a/src/i18n.nvgt +++ b/src/i18n.nvgt @@ -659,7 +659,7 @@ int i18n_find_language_index(const string[] @languageCodes, const string& in lan } int i18n_run_language_selection_menu(const string[] @languageCodes, const string[] @languageLabels, - int defaultIndex = 0) { + int defaultIndex = 0, bool allowCancel = false) { if (@languageCodes is null || @languageLabels is null) return -1; if (languageCodes.length() == 0 || languageLabels.length() == 0) @@ -705,6 +705,8 @@ int i18n_run_language_selection_menu(const string[] @languageCodes, const string } if (key_pressed(KEY_ESCAPE)) { + if (allowCancel) + return -1; exit(); } } diff --git a/src/inventory_items.nvgt b/src/inventory_items.nvgt index d0c6e4a..f4725c3 100644 --- a/src/inventory_items.nvgt +++ b/src/inventory_items.nvgt @@ -59,6 +59,34 @@ void reset_quick_slots() { } } +void bind_equipment_to_quick_slot(int slot_index, int equip_type, int rune_type) { + if (slot_index < 0 || slot_index >= int(quick_slots.length())) { + return; + } + + quick_slots[slot_index] = equip_type; + if (slot_index >= 0 && slot_index < int(quick_slot_runes.length())) { + quick_slot_runes[slot_index] = rune_type; + } + if (slot_index >= 0 && slot_index < int(item_count_slots.length())) { + item_count_slots[slot_index] = -1; + } +} + +void bind_item_count_to_quick_slot(int slot_index, int item_type) { + if (slot_index < 0 || slot_index >= int(item_count_slots.length())) { + return; + } + + item_count_slots[slot_index] = item_type; + if (slot_index >= 0 && slot_index < int(quick_slots.length())) { + quick_slots[slot_index] = -1; + } + if (slot_index >= 0 && slot_index < int(quick_slot_runes.length())) { + quick_slot_runes[slot_index] = RUNE_NONE; + } +} + int get_personal_stack_limit() { int limit = MAX_ITEM_STACK; if (equipped_arms == EQUIP_POUCH) { diff --git a/src/menus/equipment_menu.nvgt b/src/menus/equipment_menu.nvgt index a2fb2e4..ef6851a 100644 --- a/src/menus/equipment_menu.nvgt +++ b/src/menus/equipment_menu.nvgt @@ -220,10 +220,7 @@ void run_equipment_menu() { if (slot_index != -1 && filtered_indices.length() > 0) { int equip_type = equipment_types[filtered_indices[selection]]; int rune_type = rune_types[filtered_indices[selection]]; - quick_slots[slot_index] = equip_type; - if (slot_index >= 0 && slot_index < int(quick_slot_runes.length())) { - quick_slot_runes[slot_index] = rune_type; - } + bind_equipment_to_quick_slot(slot_index, equip_type, rune_type); string name = get_full_equipment_name(equip_type, rune_type); dictionary args; args.set("name", name); diff --git a/src/menus/inventory_core.nvgt b/src/menus/inventory_core.nvgt index 48653c1..bd0d105 100644 --- a/src/menus/inventory_core.nvgt +++ b/src/menus/inventory_core.nvgt @@ -194,7 +194,7 @@ void run_inventory_menu(bool allow_deposit) { if (slot_index != -1 && filtered_indices.length() > 0) { int item_type = item_types[filtered_indices[selection]]; if (slot_index >= 0 && slot_index < int(item_count_slots.length())) { - item_count_slots[slot_index] = item_type; + bind_item_count_to_quick_slot(slot_index, item_type); string name = get_item_count_binding_name(item_type); dictionary args; args.set("name", name);