#include "control.h" #include "DiabloUI/diabloui.h" #include "DiabloUI/selok.h" #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; } void MainmenuEsc() { std::size_t last = vecMenuItems.size() - 1; if (SelectedItem == last) { UiMainMenuSelect(last); } else { SelectedItem = last; } } void MainmenuLoad(const char *name, void (*fnSound)(const char *file)) { gfnSoundFunction = fnSound; 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(_("Replay Intro"), MAINMENU_REPLAY_INTRO)); vecMenuItems.push_back(std::make_unique(_("Support"), MAINMENU_SHOW_SUPPORT)); if (gbIsHellfire) { vecMenuItems.push_back(std::make_unique(_("Credits"), MAINMENU_SHOW_CREDITS)); vecMenuItems.push_back(std::make_unique(_("Exit Hellfire"), MAINMENU_EXIT_DIABLO)); } else { vecMenuItems.push_back(std::make_unique(_("Show Credits"), MAINMENU_SHOW_CREDITS)); vecMenuItems.push_back(std::make_unique(_("Exit Diablo"), MAINMENU_EXIT_DIABLO)); } if (!gbSpawned || gbIsHellfire) { if (gbIsHellfire) LoadArt("ui_art\\mainmenuw.pcx", &ArtBackgroundWidescreen); LoadBackgroundArt("ui_art\\mainmenu.pcx"); } else { LoadBackgroundArt("ui_art\\swmmenu.pcx"); } UiAddBackground(&vecMainMenuDialog); UiAddLogo(&vecMainMenuDialog); vecMainMenuDialog.push_back(std::make_unique(vecMenuItems, PANEL_LEFT + 64, (UI_OFFSET_Y + 192), 510, 43, UiFlags::FontHuge | UiFlags::ColorGold | UiFlags::AlignCenter)); SDL_Rect rect = { 17, (Sint16)(gnScreenHeight - 36), 605, 21 }; vecMainMenuDialog.push_back(std::make_unique(name, rect, UiFlags::FontSmall)); UiInitList(vecMenuItems.size(), nullptr, UiMainMenuSelect, MainmenuEsc, vecMainMenuDialog, true); } void MainmenuFree() { ArtBackgroundWidescreen.Unload(); ArtBackground.Unload(); 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, void (*fnSound)(const char *file), int attractTimeOut) { MainMenuResult = MAINMENU_NONE; while (MainMenuResult == MAINMENU_NONE) { mainmenu_attract_time_out = attractTimeOut; MainmenuLoad(name, fnSound); mainmenu_restart_repintro(); // for automatic starts while (MainMenuResult == MAINMENU_NONE) { UiClearScreen(); UiPollAndRender(); if (!gbSpawned && SDL_GetTicks() >= dwAttractTicks) { MainMenuResult = MAINMENU_ATTRACT_MODE; } } MainmenuFree(); if (gbSpawned && !gbIsHellfire && MainMenuResult == MAINMENU_REPLAY_INTRO) { UiSelOkDialog(nullptr, _(/* TRANSLATORS: Error Message when a Shareware User clicks on "Replay Intro" in the Main Menu */ "The Diablo introduction cinematic is only available in the full retail version of Diablo. Visit https://www.gog.com/game/diablo to purchase."), true); MainMenuResult = MAINMENU_NONE; } } *pdwResult = MainMenuResult; return true; } } // namespace devilution