#include "DiabloUI/diabloui.h" #include "DiabloUI/selok.h" #include "control.h" #include "engine/load_clx.hpp" #include "utils/language.h" namespace devilution { namespace { int mainmenu_attract_time_out; // seconds uint32_t dwAttractTicks; std::vector> vecMainMenuDialog; std::vector> vecMenuItems; _mainmenu_selections MainMenuResult; void UiMainMenuSelect(int value) { MainMenuResult = (_mainmenu_selections)vecMenuItems[value]->m_value; } #ifndef NOEXIT void MainmenuEsc() { std::size_t last = vecMenuItems.size() - 1; if (SelectedItem == last) { UiMainMenuSelect(last); } else { SelectedItem = last; } } #endif void MainmenuLoad(const char *name) { vecMenuItems.push_back(std::make_unique(_("Single Player"), MAINMENU_SINGLE_PLAYER)); vecMenuItems.push_back(std::make_unique(_("Multi Player"), MAINMENU_MULTIPLAYER)); vecMenuItems.push_back(std::make_unique(_("Settings"), MAINMENU_SETTINGS)); vecMenuItems.push_back(std::make_unique(_("Support"), MAINMENU_SHOW_SUPPORT)); vecMenuItems.push_back(std::make_unique(_("Show Credits"), MAINMENU_SHOW_CREDITS)); #ifndef NOEXIT vecMenuItems.push_back(std::make_unique(gbIsHellfire ? _("Exit Hellfire") : _("Exit Diablo"), MAINMENU_EXIT_DIABLO)); #endif if (!gbIsSpawn || gbIsHellfire) { if (gbIsHellfire) ArtBackgroundWidescreen = LoadOptionalClx("ui_art\\mainmenuw.clx"); LoadBackgroundArt("ui_art\\mainmenu"); } else { LoadBackgroundArt("ui_art\\swmmenu"); } UiAddBackground(&vecMainMenuDialog); UiAddLogo(&vecMainMenuDialog); const Point uiPosition = GetUIRectangle().position; if (gbIsSpawn && gbIsHellfire) { SDL_Rect rect1 = { (Sint16)(uiPosition.x), (Sint16)(uiPosition.y + 145), 640, 30 }; vecMainMenuDialog.push_back(std::make_unique(_("Shareware").data(), rect1, UiFlags::FontSize30 | UiFlags::ColorUiSilver | UiFlags::AlignCenter, 8)); } vecMainMenuDialog.push_back(std::make_unique(vecMenuItems, vecMenuItems.size(), uiPosition.x + 64, (uiPosition.y + 192), 510, 43, UiFlags::FontSize42 | UiFlags::ColorUiGold | UiFlags::AlignCenter, 5)); SDL_Rect rect2 = { 17, (Sint16)(gnScreenHeight - 36), 605, 21 }; vecMainMenuDialog.push_back(std::make_unique(name, rect2, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); #ifndef NOEXIT UiInitList(nullptr, UiMainMenuSelect, MainmenuEsc, vecMainMenuDialog, true); #else UiInitList(nullptr, UiMainMenuSelect, nullptr, vecMainMenuDialog, true); #endif } void MainmenuFree() { ArtBackgroundWidescreen = std::nullopt; ArtBackground = std::nullopt; vecMainMenuDialog.clear(); vecMenuItems.clear(); } } // namespace void mainmenu_restart_repintro() { dwAttractTicks = SDL_GetTicks() + mainmenu_attract_time_out * 1000; } bool UiMainMenuDialog(const char *name, _mainmenu_selections *pdwResult, int attractTimeOut) { MainMenuResult = MAINMENU_NONE; while (MainMenuResult == MAINMENU_NONE) { mainmenu_attract_time_out = attractTimeOut; MainmenuLoad(name); mainmenu_restart_repintro(); // for automatic starts while (MainMenuResult == MAINMENU_NONE) { UiClearScreen(); UiPollAndRender(); if (SDL_GetTicks() >= dwAttractTicks && (HaveDiabdat() || HaveHellfire())) { MainMenuResult = MAINMENU_ATTRACT_MODE; } } MainmenuFree(); } *pdwResult = MainMenuResult; return true; } } // namespace devilution