diff --git a/CMake/Definitions.cmake b/CMake/Definitions.cmake index fdafb4aff..207815f27 100644 --- a/CMake/Definitions.cmake +++ b/CMake/Definitions.cmake @@ -3,6 +3,7 @@ foreach( def_name NOSOUND NONET + NOEXIT PREFILL_PLAYER_NAME DISABLE_TCP DISABLE_ZERO_TIER diff --git a/CMake/platforms/android.cmake b/CMake/platforms/android.cmake index d4a452905..e2a6299a7 100644 --- a/CMake/platforms/android.cmake +++ b/CMake/platforms/android.cmake @@ -23,6 +23,9 @@ set(DEVILUTIONX_ASSETS_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/android-pro set(ASAN OFF) set(UBSAN OFF) +# Disable in-game options to exit the game. +set(NOEXIT ON) + if(CMAKE_BUILD_TYPE STREQUAL "Release") # Work around a linker bug in clang: https://github.com/android/ndk/issues/721 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -flto=full") diff --git a/CMake/platforms/ios.cmake b/CMake/platforms/ios.cmake index 7443929c4..6c3cccbc2 100644 --- a/CMake/platforms/ios.cmake +++ b/CMake/platforms/ios.cmake @@ -11,6 +11,7 @@ set(DEVILUTIONX_SYSTEM_LIBPNG OFF) set(DEVILUTIONX_SYSTEM_LIBFMT OFF) set(DISABLE_ZERO_TIER ON) +set(NOEXIT ON) # Disable sanitizers. They're not supported out-of-the-box. set(ASAN OFF) diff --git a/CMake/platforms/n3ds.cmake b/CMake/platforms/n3ds.cmake index 05c8d384e..f6104ad32 100644 --- a/CMake/platforms/n3ds.cmake +++ b/CMake/platforms/n3ds.cmake @@ -10,6 +10,7 @@ set(DISABLE_ZERO_TIER ON) set(LIBMPQ_FILE_BUFFER_SIZE 32768) set(USE_SDL1 ON) set(PREFILL_PLAYER_NAME ON) +set(NOEXIT ON) # 3DS libraries and compile definitions list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/ctr") diff --git a/CMake/platforms/switch.cmake b/CMake/platforms/switch.cmake index b34d109b0..440f81111 100644 --- a/CMake/platforms/switch.cmake +++ b/CMake/platforms/switch.cmake @@ -8,6 +8,7 @@ set(DEVILUTIONX_SYSTEM_SDL_IMAGE OFF) set(DEVILUTIONX_SYSTEM_LIBSODIUM OFF) set(DISABLE_ZERO_TIER ON) set(PREFILL_PLAYER_NAME ON) +set(NOEXIT ON) set(JOY_BUTTON_DPAD_LEFT 16) set(JOY_BUTTON_DPAD_UP 17) diff --git a/CMake/platforms/vita.cmake b/CMake/platforms/vita.cmake index 278ae8056..01899005e 100644 --- a/CMake/platforms/vita.cmake +++ b/CMake/platforms/vita.cmake @@ -4,6 +4,7 @@ set(DEVILUTIONX_STATIC_CXX_STDLIB OFF) set(BUILD_TESTING OFF) set(DISABLE_ZERO_TIER ON) set(PREFILL_PLAYER_NAME ON) +set(NOEXIT ON) list(APPEND DEVILUTIONX_PLATFORM_SUBDIRECTORIES platform/vita) list(APPEND DEVILUTIONX_PLATFORM_LINK_LIBRARIES libdevilutionx_vita) diff --git a/Source/DiabloUI/mainmenu.cpp b/Source/DiabloUI/mainmenu.cpp index 848bda05e..a82d6b4dd 100644 --- a/Source/DiabloUI/mainmenu.cpp +++ b/Source/DiabloUI/mainmenu.cpp @@ -19,6 +19,7 @@ void UiMainMenuSelect(int value) MainMenuResult = (_mainmenu_selections)vecMenuItems[value]->m_value; } +#ifndef NOEXIT void MainmenuEsc() { std::size_t last = vecMenuItems.size() - 1; @@ -28,6 +29,7 @@ void MainmenuEsc() SelectedItem = last; } } +#endif void MainmenuLoad(const char *name, void (*fnSound)(const char *file)) { @@ -38,7 +40,9 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file)) 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) @@ -61,7 +65,11 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file)) 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() diff --git a/Source/diablo.cpp b/Source/diablo.cpp index f629b7932..ccef828bd 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -1455,12 +1455,14 @@ void InitKeymapActions() [] { gamemenu_load_game(false); }, nullptr, [&]() { return !gbIsMultiplayer && gbValidSaveFile && stextflag == STORE_NONE && IsGameRunning(); }); +#ifndef NOEXIT sgOptions.Keymapper.AddAction( "QuitGame", N_("Quit game"), N_("Closes the game."), DVL_VK_INVALID, [] { gamemenu_quit_game(false); }); +#endif sgOptions.Keymapper.AddAction( "StopHero", N_("Stop hero"), diff --git a/Source/gamemenu.cpp b/Source/gamemenu.cpp index 7ee28c1d6..98ebbc62d 100644 --- a/Source/gamemenu.cpp +++ b/Source/gamemenu.cpp @@ -36,7 +36,9 @@ TMenuItem sgSingleMenu[] = { { GMENU_ENABLED, N_("Options"), &GamemenuOptions }, { GMENU_ENABLED, N_("New Game"), &GamemenuNewGame }, { GMENU_ENABLED, N_("Load Game"), &gamemenu_load_game }, +#ifndef NOEXIT { GMENU_ENABLED, N_("Quit Game"), &gamemenu_quit_game }, +#endif { GMENU_ENABLED, nullptr, nullptr } // clang-format on }; @@ -47,7 +49,9 @@ TMenuItem sgMultiMenu[] = { { GMENU_ENABLED, N_("Options"), &GamemenuOptions }, { GMENU_ENABLED, N_("New Game"), &GamemenuNewGame }, { GMENU_ENABLED, N_("Restart In Town"), &GamemenuRestartTown }, +#ifndef NOEXIT { GMENU_ENABLED, N_("Quit Game"), &gamemenu_quit_game }, +#endif { GMENU_ENABLED, nullptr, nullptr }, // clang-format on }; @@ -290,11 +294,13 @@ void GamemenuSpeed(bool bActivate) } // namespace +#ifndef NOEXIT void gamemenu_quit_game(bool bActivate) { GamemenuNewGame(bActivate); gbRunGameResult = false; } +#endif void gamemenu_load_game(bool /*bActivate*/) { diff --git a/Source/gamemenu.h b/Source/gamemenu.h index 3aa63b89e..817f1429d 100644 --- a/Source/gamemenu.h +++ b/Source/gamemenu.h @@ -10,7 +10,9 @@ namespace devilution { void gamemenu_on(); void gamemenu_off(); void gamemenu_handle_previous(); +#ifndef NOEXIT void gamemenu_quit_game(bool bActivate); +#endif void gamemenu_load_game(bool bActivate); void gamemenu_save_game(bool bActivate);