Add new Extras menu with the possibility to switch game
This commit is contained in:
parent
95b7380ae9
commit
1d0f4cb13d
6 changed files with 111 additions and 14 deletions
|
|
@ -458,6 +458,7 @@ set(libdevilutionx_SRCS
|
|||
Source/DiabloUI/diabloui.cpp
|
||||
Source/DiabloUI/dialogs.cpp
|
||||
Source/DiabloUI/errorart.cpp
|
||||
Source/DiabloUI/extrasmenu.cpp
|
||||
Source/DiabloUI/mainmenu.cpp
|
||||
Source/DiabloUI/progress.cpp
|
||||
Source/DiabloUI/scrollbar.cpp
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@ enum _mainmenu_selections : uint8_t {
|
|||
MAINMENU_MULTIPLAYER,
|
||||
MAINMENU_REPLAY_INTRO,
|
||||
MAINMENU_SHOW_SUPPORT,
|
||||
MAINMENU_EXTRAS,
|
||||
MAINMENU_SWITCHGAME,
|
||||
MAINMENU_SHOW_CREDITS,
|
||||
MAINMENU_EXIT_DIABLO,
|
||||
MAINMENU_ATTRACT_MODE,
|
||||
|
|
|
|||
65
Source/DiabloUI/extrasmenu.cpp
Normal file
65
Source/DiabloUI/extrasmenu.cpp
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
#include "selstart.h"
|
||||
|
||||
#include "control.h"
|
||||
#include "DiabloUI/diabloui.h"
|
||||
#include "options.h"
|
||||
#include "utils/language.h"
|
||||
|
||||
namespace devilution {
|
||||
namespace {
|
||||
|
||||
bool endMenu;
|
||||
|
||||
std::vector<std::unique_ptr<UiListItem>> vecDialogItems;
|
||||
std::vector<std::unique_ptr<UiItemBase>> vecDialog;
|
||||
|
||||
Art artLogo;
|
||||
|
||||
_mainmenu_selections selectionExtrasMenu;
|
||||
|
||||
void ItemSelected(int value)
|
||||
{
|
||||
selectionExtrasMenu = static_cast<_mainmenu_selections>(vecDialogItems[value]->m_value);
|
||||
endMenu = true;
|
||||
}
|
||||
|
||||
void EscPressed()
|
||||
{
|
||||
endMenu = true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
_mainmenu_selections UiExtrasMenu()
|
||||
{
|
||||
constexpr int MessageWidth = 560;
|
||||
|
||||
LoadBackgroundArt("ui_art\\black.pcx");
|
||||
UiAddBackground(&vecDialog);
|
||||
UiAddLogo(&vecDialog);
|
||||
|
||||
if (!gbIsSpawn && diabdat_mpq != nullptr && hellfire_mpq != nullptr)
|
||||
vecDialogItems.push_back(std::make_unique<UiListItem>(gbIsHellfire ? _("Switch to Diablo") : _("Switch to Hellfire"), MAINMENU_SWITCHGAME));
|
||||
vecDialogItems.push_back(std::make_unique<UiListItem>(_("Replay Intro"), MAINMENU_REPLAY_INTRO));
|
||||
vecDialogItems.push_back(std::make_unique<UiListItem>(_("Support"), MAINMENU_SHOW_SUPPORT));
|
||||
vecDialogItems.push_back(std::make_unique<UiListItem>(_("Previous Menu"), MAINMENU_NONE));
|
||||
vecDialog.push_back(std::make_unique<UiList>(vecDialogItems, PANEL_LEFT + 64, (UI_OFFSET_Y + 240), 510, 43, UiFlags::AlignCenter | UiFlags::FontSize42 | UiFlags::ColorUiGold, 5));
|
||||
|
||||
UiInitList(vecDialogItems.size(), nullptr, ItemSelected, EscPressed, vecDialog, true);
|
||||
|
||||
endMenu = false;
|
||||
while (!endMenu) {
|
||||
UiClearScreen();
|
||||
UiRenderItems(vecDialog);
|
||||
UiPollAndRender();
|
||||
}
|
||||
|
||||
ArtBackground.Unload();
|
||||
ArtBackgroundWidescreen.Unload();
|
||||
vecDialogItems.clear();
|
||||
vecDialog.clear();
|
||||
|
||||
return selectionExtrasMenu;
|
||||
}
|
||||
|
||||
} // namespace devilution
|
||||
9
Source/DiabloUI/extrasmenu.h
Normal file
9
Source/DiabloUI/extrasmenu.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#pragma once
|
||||
|
||||
#include "DiabloUI/diabloui.h"
|
||||
|
||||
namespace devilution {
|
||||
|
||||
_mainmenu_selections UiExtrasMenu();
|
||||
|
||||
} // namespace devilution
|
||||
|
|
@ -35,8 +35,7 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file))
|
|||
|
||||
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Single Player"), MAINMENU_SINGLE_PLAYER));
|
||||
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Multi Player"), MAINMENU_MULTIPLAYER));
|
||||
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Replay Intro"), MAINMENU_REPLAY_INTRO));
|
||||
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Support"), MAINMENU_SHOW_SUPPORT));
|
||||
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Extras"), MAINMENU_EXTRAS));
|
||||
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Show Credits"), MAINMENU_SHOW_CREDITS));
|
||||
vecMenuItems.push_back(std::make_unique<UiListItem>(gbIsHellfire ? _("Exit Hellfire") : _("Exit Diablo"), MAINMENU_EXIT_DIABLO));
|
||||
|
||||
|
|
@ -94,11 +93,6 @@ bool UiMainMenuDialog(const char *name, _mainmenu_selections *pdwResult, void (*
|
|||
}
|
||||
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
*/
|
||||
|
||||
#include "DiabloUI/diabloui.h"
|
||||
#include "DiabloUI/extrasmenu.h"
|
||||
#include "DiabloUI/selok.h"
|
||||
#include "engine/demomode.h"
|
||||
#include "init.h"
|
||||
#include "movie.h"
|
||||
|
|
@ -131,17 +133,18 @@ bool mainmenu_select_hero_dialog(GameData *gameData)
|
|||
void mainmenu_loop()
|
||||
{
|
||||
bool done;
|
||||
_mainmenu_selections menu;
|
||||
_mainmenu_selections menu = MAINMENU_NONE;
|
||||
|
||||
RefreshMusic();
|
||||
done = false;
|
||||
|
||||
do {
|
||||
menu = MAINMENU_NONE;
|
||||
if (demo::IsRunning())
|
||||
menu = MAINMENU_SINGLE_PLAYER;
|
||||
else if (!UiMainMenuDialog(gszProductName, &menu, effects_play_sound, 30))
|
||||
app_fatal("%s", _("Unable to display mainmenu"));
|
||||
if (menu == MAINMENU_NONE) {
|
||||
if (demo::IsRunning())
|
||||
menu = MAINMENU_SINGLE_PLAYER;
|
||||
else if (!UiMainMenuDialog(gszProductName, &menu, effects_play_sound, 30))
|
||||
app_fatal("%s", _("Unable to display mainmenu"));
|
||||
}
|
||||
|
||||
switch (menu) {
|
||||
case MAINMENU_NONE:
|
||||
|
|
@ -149,27 +152,50 @@ void mainmenu_loop()
|
|||
case MAINMENU_SINGLE_PLAYER:
|
||||
if (!InitSinglePlayerMenu())
|
||||
done = true;
|
||||
menu = MAINMENU_NONE;
|
||||
break;
|
||||
case MAINMENU_MULTIPLAYER:
|
||||
if (!InitMultiPlayerMenu())
|
||||
done = true;
|
||||
menu = MAINMENU_NONE;
|
||||
break;
|
||||
case MAINMENU_ATTRACT_MODE:
|
||||
case MAINMENU_REPLAY_INTRO:
|
||||
if (gbIsSpawn && !gbIsHellfire)
|
||||
done = false;
|
||||
else if (gbActive)
|
||||
PlayIntro();
|
||||
menu = MAINMENU_NONE;
|
||||
break;
|
||||
case MAINMENU_REPLAY_INTRO:
|
||||
if (gbIsSpawn && !gbIsHellfire) {
|
||||
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);
|
||||
} else if (gbActive)
|
||||
PlayIntro();
|
||||
menu = MAINMENU_EXTRAS;
|
||||
break;
|
||||
case MAINMENU_SHOW_CREDITS:
|
||||
UiCreditsDialog();
|
||||
menu = MAINMENU_EXTRAS;
|
||||
break;
|
||||
case MAINMENU_SHOW_SUPPORT:
|
||||
UiSupportDialog();
|
||||
menu = MAINMENU_EXTRAS;
|
||||
break;
|
||||
case MAINMENU_EXIT_DIABLO:
|
||||
done = true;
|
||||
break;
|
||||
case MAINMENU_EXTRAS:
|
||||
menu = UiExtrasMenu();
|
||||
break;
|
||||
case MAINMENU_SWITCHGAME:
|
||||
gbIsHellfire = !gbIsHellfire;
|
||||
sgOptions.Hellfire.startUpGameOption = gbIsHellfire ? StartUpGameOption::Hellfire : StartUpGameOption::Diablo;
|
||||
UiInitialize();
|
||||
FreeItemGFX();
|
||||
InitItemGFX();
|
||||
RefreshMusic();
|
||||
menu = MAINMENU_NONE;
|
||||
break;
|
||||
}
|
||||
} while (!done);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue