diff --git a/Source/menu.cpp b/Source/menu.cpp index 5a0e15298..f0e6fe19d 100644 --- a/Source/menu.cpp +++ b/Source/menu.cpp @@ -86,11 +86,14 @@ bool DummyGetHeroInfo(_uiheroinfo * /*pInfo*/) bool mainmenu_select_hero_dialog(GameData *gameData) { + uint32_t *pSaveNumberFromOptions = nullptr; _selhero_selections dlgresult = SELHERO_NEW_DUNGEON; if (demo::IsRunning()) { pfile_ui_set_hero_infos(DummyGetHeroInfo); gbLoadGame = true; } else if (!gbIsMultiplayer) { + pSaveNumberFromOptions = gbIsHellfire ? &sgOptions.Hellfire.lastSinglePlayerHero : &sgOptions.Diablo.lastSinglePlayerHero; + gSaveNumber = *pSaveNumberFromOptions; UiSelHeroSingDialog( pfile_ui_set_hero_infos, pfile_ui_save_create, @@ -102,6 +105,8 @@ bool mainmenu_select_hero_dialog(GameData *gameData) gbLoadGame = (dlgresult == SELHERO_CONTINUE); } else { + pSaveNumberFromOptions = gbIsHellfire ? &sgOptions.Hellfire.lastMultiplayerHero : &sgOptions.Diablo.lastMultiplayerHero; + gSaveNumber = *pSaveNumberFromOptions; UiSelHeroMultDialog( pfile_ui_set_hero_infos, pfile_ui_save_create, @@ -115,6 +120,9 @@ bool mainmenu_select_hero_dialog(GameData *gameData) return false; } + if (pSaveNumberFromOptions != nullptr) + *pSaveNumberFromOptions = gSaveNumber; + pfile_read_player_from_save(gSaveNumber, Players[MyPlayerId]); return true; diff --git a/Source/options.cpp b/Source/options.cpp index 0e0c6855d..876f68689 100644 --- a/Source/options.cpp +++ b/Source/options.cpp @@ -209,7 +209,11 @@ bool sbWasOptionsLoaded = false; void LoadOptions() { sgOptions.Diablo.bIntro = GetIniBool("Diablo", "Intro", true); + sgOptions.Diablo.lastSinglePlayerHero = GetIniInt("Diablo", "LastSinglePlayerHero", 0); + sgOptions.Diablo.lastMultiplayerHero = GetIniInt("Diablo", "LastMultiplayerHero", 0); sgOptions.Hellfire.bIntro = GetIniBool("Hellfire", "Intro", true); + sgOptions.Hellfire.lastSinglePlayerHero = GetIniInt("Hellfire", "LastSinglePlayerHero", 0); + sgOptions.Hellfire.lastMultiplayerHero = GetIniInt("Hellfire", "LastMultiplayerHero", 0); GetIniValue("Hellfire", "SItem", sgOptions.Hellfire.szItem, sizeof(sgOptions.Hellfire.szItem), ""); sgOptions.Audio.nSoundVolume = GetIniInt("Audio", "Sound Volume", VOLUME_MAX); @@ -359,8 +363,12 @@ void LoadOptions() void SaveOptions() { SetIniValue("Diablo", "Intro", sgOptions.Diablo.bIntro); + SetIniValue("Diablo", "LastSinglePlayerHero", sgOptions.Diablo.lastSinglePlayerHero); + SetIniValue("Diablo", "LastMultiplayerHero", sgOptions.Diablo.lastMultiplayerHero); SetIniValue("Hellfire", "Intro", sgOptions.Hellfire.bIntro); SetIniValue("Hellfire", "SItem", sgOptions.Hellfire.szItem); + SetIniValue("Hellfire", "LastSinglePlayerHero", sgOptions.Hellfire.lastSinglePlayerHero); + SetIniValue("Hellfire", "LastMultiplayerHero", sgOptions.Hellfire.lastMultiplayerHero); SetIniValue("Audio", "Sound Volume", sgOptions.Audio.nSoundVolume); SetIniValue("Audio", "Music Volume", sgOptions.Audio.nMusicVolume); diff --git a/Source/options.h b/Source/options.h index c8121dfb5..2c768fdb1 100644 --- a/Source/options.h +++ b/Source/options.h @@ -11,6 +11,10 @@ namespace devilution { struct DiabloOptions { /** @brief Play game intro video on startup. */ bool bIntro; + /** @brief Remembers what singleplayer hero/save was last used. */ + std::uint32_t lastSinglePlayerHero; + /** @brief Remembers what multiplayer hero/save was last used. */ + std::uint32_t lastMultiplayerHero; }; struct HellfireOptions { @@ -18,6 +22,10 @@ struct HellfireOptions { bool bIntro; /** @brief Cornerstone of the world item. */ char szItem[sizeof(ItemPack) * 2 + 1]; + /** @brief Remembers what singleplayer hero/save was last used. */ + std::uint32_t lastSinglePlayerHero; + /** @brief Remembers what multiplayer hero/save was last used. */ + std::uint32_t lastMultiplayerHero; }; struct AudioOptions {