diff --git a/Source/DiabloUI/diabloui.cpp b/Source/DiabloUI/diabloui.cpp index bce9199ba..98f69ed1e 100644 --- a/Source/DiabloUI/diabloui.cpp +++ b/Source/DiabloUI/diabloui.cpp @@ -85,9 +85,9 @@ struct ScrollBarState { } // namespace -void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector> &items, bool itemsWraps, bool (*fnYesNo)()) +void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector> &items, bool itemsWraps, bool (*fnYesNo)(), size_t selectedItem /*= 0*/) { - SelectedItem = 0; + SelectedItem = selectedItem; SelectedItemMax = std::max(count - 1, 0); ListViewportSize = count; gfnListFocus = fnFocus; @@ -100,7 +100,7 @@ void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int valu UiItemsWraps = itemsWraps; ListOffset = nullptr; if (fnFocus != nullptr) - fnFocus(0); + fnFocus(selectedItem); #ifndef __SWITCH__ SDL_StopTextInput(); // input is enabled by default diff --git a/Source/DiabloUI/diabloui.h b/Source/DiabloUI/diabloui.h index 29a8eaf2a..02f7fe0f7 100644 --- a/Source/DiabloUI/diabloui.h +++ b/Source/DiabloUI/diabloui.h @@ -119,7 +119,7 @@ void UiAddLogo(std::vector> *vecDialog, int size = L void UiFocusNavigationSelect(); void UiFocusNavigationEsc(); void UiFocusNavigationYesNo(); -void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector> &items, bool wraps = false, bool (*fnYesNo)() = NULL); +void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector> &items, bool wraps = false, bool (*fnYesNo)() = NULL, size_t selectedItem = 0); void UiInitScrollBar(UiScrollbar *uiSb, std::size_t viewportSize, const std::size_t *currentOffset); void UiClearScreen(); void UiPollAndRender(); diff --git a/Source/DiabloUI/selhero.cpp b/Source/DiabloUI/selhero.cpp index 95a87620d..06458301b 100644 --- a/Source/DiabloUI/selhero.cpp +++ b/Source/DiabloUI/selhero.cpp @@ -16,6 +16,7 @@ #include "options.h" #include "pfile.h" #include "utils/language.h" +#include namespace devilution { @@ -502,6 +503,7 @@ void selhero_Init() void selhero_List_Init() { listOffset = 0; + size_t selectedItem = 0; vecSelDlgItems.clear(); SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; @@ -512,6 +514,15 @@ void selhero_List_Init() for (std::size_t i = 0; i < numViewportHeroes; i++) { vecSelHeroDlgItems.push_back(std::make_unique("", -1)); } + // Adjust list to last selected hero + for (size_t i = 0; i < selhero_SaveCount; i++) { + if (selhero_heros[i].saveNumber == selhero_heroInfo.saveNumber) { + selectedItem = i; + if (i > (MaxViewportItems - 1)) + listOffset = i - (MaxViewportItems - 1); + break; + } + } SelheroUpdateViewportItems(); vecSelDlgItems.push_back(std::make_unique(vecSelHeroDlgItems, PANEL_LEFT + 265, (UI_OFFSET_Y + 256), 320, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); @@ -532,7 +543,7 @@ void selhero_List_Init() SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 489), (Sint16)(UI_OFFSET_Y + 429), 120, 35 }; vecSelDlgItems.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect5, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo); + UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo, selectedItem); UiInitScrollBar(scrollBar, MaxViewportItems, &listOffset); if (selhero_isMultiPlayer) { title = _("Multi Player Characters"); @@ -560,6 +571,14 @@ static void UiSelHeroDialog( selhero_Init(); if (selhero_SaveCount != 0) { + selhero_heroInfo = {}; + // Search last used save and remember it as selected item + for (size_t i = 0; i < selhero_SaveCount; i++) { + if (selhero_heros[i].saveNumber == *saveNumber) { + memcpy(&selhero_heroInfo, &selhero_heros[i], sizeof(selhero_heroInfo)); + break; + } + } selhero_List_Init(); } else { SelheroListSelect(selhero_SaveCount);