Add new Extras menu with the possibility to switch game

This commit is contained in:
obligaron 2021-10-20 23:59:43 +02:00 committed by Anders Jenbo
commit 1d0f4cb13d
6 changed files with 111 additions and 14 deletions

View file

@ -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

View file

@ -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,

View 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

View file

@ -0,0 +1,9 @@
#pragma once
#include "DiabloUI/diabloui.h"
namespace devilution {
_mainmenu_selections UiExtrasMenu();
} // namespace devilution

View file

@ -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;

View file

@ -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);