diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index e995fc7a9..719733c9b 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -220,6 +220,13 @@ target_link_dependencies(libdevilutionx_controller_buttons DevilutionX::SDL ) +add_devilutionx_object_library(libdevilutionx_control_mode + controls/control_mode.cpp +) +target_link_dependencies(libdevilutionx_control_mode PUBLIC + libdevilutionx_controller_buttons +) + add_devilutionx_object_library(libdevilutionx_padmapper controls/padmapper.cpp ) @@ -428,6 +435,7 @@ target_link_dependencies(libdevilutionx_options PUBLIC fmt::fmt tl libdevilutionx_controller_buttons + libdevilutionx_control_mode libdevilutionx_logged_fstream libdevilutionx_quick_messages libdevilutionx_strings @@ -654,6 +662,7 @@ target_link_dependencies(libdevilutionx PUBLIC libdevilutionx_codec libdevilutionx_config libdevilutionx_controller_buttons + libdevilutionx_control_mode libdevilutionx_crawl libdevilutionx_direction libdevilutionx_surface diff --git a/Source/DiabloUI/diabloui.cpp b/Source/DiabloUI/diabloui.cpp index c12c69a37..3191f6b01 100644 --- a/Source/DiabloUI/diabloui.cpp +++ b/Source/DiabloUI/diabloui.cpp @@ -10,6 +10,7 @@ #include "DiabloUI/dialogs.h" #include "DiabloUI/scrollbar.h" #include "DiabloUI/text_input.hpp" +#include "controls/control_mode.hpp" #include "controls/controller.h" #include "controls/input.h" #include "controls/menu_controls.h" diff --git a/Source/DiabloUI/hero/selhero.cpp b/Source/DiabloUI/hero/selhero.cpp index b2c7be7af..456a9bb64 100644 --- a/Source/DiabloUI/hero/selhero.cpp +++ b/Source/DiabloUI/hero/selhero.cpp @@ -14,6 +14,7 @@ #include "DiabloUI/selok.h" #include "DiabloUI/selyesno.h" #include "control.h" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "engine/assets.hpp" #include "game_mode.hpp" diff --git a/Source/control.cpp b/Source/control.cpp index 429bdb63c..d41ebaa33 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -17,6 +17,7 @@ #include "DiabloUI/text_input.hpp" #include "automap.h" +#include "controls/control_mode.hpp" #include "controls/modifier_hints.h" #include "controls/plrctrls.h" #include "cursor.h" diff --git a/Source/controls/control_mode.cpp b/Source/controls/control_mode.cpp new file mode 100644 index 000000000..a81220d8e --- /dev/null +++ b/Source/controls/control_mode.cpp @@ -0,0 +1,16 @@ +#include "controls/control_mode.hpp" + +namespace devilution { + +ControlTypes ControlMode = ControlTypes::None; +ControlTypes ControlDevice = ControlTypes::None; + +GamepadLayout GamepadType = +#if defined(DEVILUTIONX_GAMEPAD_TYPE) + GamepadLayout:: + DEVILUTIONX_GAMEPAD_TYPE; +#else + GamepadLayout::Generic; +#endif + +} // namespace devilution diff --git a/Source/controls/control_mode.hpp b/Source/controls/control_mode.hpp new file mode 100644 index 000000000..6363c5195 --- /dev/null +++ b/Source/controls/control_mode.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include "controls/controller_buttons.h" + +namespace devilution { + +enum class ControlTypes : uint8_t { + None, + KeyboardAndMouse, + Gamepad, + VirtualGamepad, +}; + +extern ControlTypes ControlMode; + +/** + * @brief Controlling device type. + * + * While simulating a mouse, `ControlMode` is set to `KeyboardAndMouse`, + * even though a gamepad is used to control it. + * + * This value is always set to the actual active device type. + */ +extern ControlTypes ControlDevice; + +extern GamepadLayout GamepadType; + +} // namespace devilution diff --git a/Source/controls/controller_buttons.cpp b/Source/controls/controller_buttons.cpp index 20133aa73..db9e24977 100644 --- a/Source/controls/controller_buttons.cpp +++ b/Source/controls/controller_buttons.cpp @@ -1,7 +1,5 @@ #include "controller_buttons.h" -#include "controls/game_controls.h" - namespace devilution { namespace { namespace controller_button_icon { @@ -280,13 +278,9 @@ std::string_view ToXboxIcon(ControllerButton button) } // namespace -// Defined in `plrctrls.cpp`. -// Declared here to avoid having to depend on it in tests. -extern GamepadLayout GamepadType; - -std::string_view ToString(ControllerButton button) +std::string_view ToString(GamepadLayout gamepadType, ControllerButton button) { - switch (GamepadType) { + switch (gamepadType) { case GamepadLayout::PlayStation: return ToPlayStationIcon(button); case GamepadLayout::Nintendo: diff --git a/Source/controls/controller_buttons.h b/Source/controls/controller_buttons.h index b27894a8b..c75263154 100644 --- a/Source/controls/controller_buttons.h +++ b/Source/controls/controller_buttons.h @@ -74,6 +74,13 @@ inline bool IsDPadButton(ControllerButton button) || button == ControllerButton_BUTTON_DPAD_RIGHT; } -std::string_view ToString(ControllerButton button); +enum class GamepadLayout : uint8_t { + Generic, + Nintendo, + PlayStation, + Xbox, +}; + +[[nodiscard]] std::string_view ToString(GamepadLayout gamepadType, ControllerButton button); } // namespace devilution diff --git a/Source/controls/controller_motion.cpp b/Source/controls/controller_motion.cpp index 3ef886fd5..1175be855 100644 --- a/Source/controls/controller_motion.cpp +++ b/Source/controls/controller_motion.cpp @@ -3,6 +3,7 @@ #include #include "control.h" +#include "controls/control_mode.hpp" #include "controls/controller.h" #ifndef USE_SDL1 #include "controls/devices/game_controller.h" diff --git a/Source/controls/game_controls.cpp b/Source/controls/game_controls.cpp index 21fafcde8..2849a9d51 100644 --- a/Source/controls/game_controls.cpp +++ b/Source/controls/game_controls.cpp @@ -2,6 +2,7 @@ #include +#include "controls/control_mode.hpp" #include "controls/controller_motion.h" #ifndef USE_SDL1 #include "controls/devices/game_controller.h" diff --git a/Source/controls/game_controls.h b/Source/controls/game_controls.h index 5288d5ca3..e8589e26b 100644 --- a/Source/controls/game_controls.h +++ b/Source/controls/game_controls.h @@ -8,13 +8,6 @@ namespace devilution { -enum class GamepadLayout : uint8_t { - Generic, - Nintendo, - PlayStation, - Xbox, -}; - enum GameActionType : uint8_t { GameActionType_NONE, GameActionType_USE_HEALTH_POTION, diff --git a/Source/controls/menu_controls.cpp b/Source/controls/menu_controls.cpp index 732525e84..7153f16e2 100644 --- a/Source/controls/menu_controls.cpp +++ b/Source/controls/menu_controls.cpp @@ -2,6 +2,7 @@ #include "DiabloUI/diabloui.h" #include "controls/axis_direction.h" +#include "controls/control_mode.hpp" #include "controls/controller.h" #include "controls/controller_motion.h" #include "controls/plrctrls.h" diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 0edfdfbc0..8ce42dae3 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -15,6 +15,7 @@ #ifndef USE_SDL1 #include "controls/devices/game_controller.h" #endif +#include "controls/control_mode.hpp" #include "controls/game_controls.h" #include "controls/touch/gamepad.h" #include "cursor.h" @@ -44,16 +45,7 @@ namespace devilution { -ControlTypes ControlMode = ControlTypes::None; -ControlTypes ControlDevice = ControlTypes::None; GameActionType ControllerActionHeld = GameActionType_NONE; -GamepadLayout GamepadType = -#if defined(DEVILUTIONX_GAMEPAD_TYPE) - GamepadLayout:: - DEVILUTIONX_GAMEPAD_TYPE; -#else - GamepadLayout::Generic; -#endif bool StandToggle = false; diff --git a/Source/controls/plrctrls.h b/Source/controls/plrctrls.h index bc220c2e8..c02689c44 100644 --- a/Source/controls/plrctrls.h +++ b/Source/controls/plrctrls.h @@ -17,29 +17,7 @@ enum class BeltItemType : uint8_t { Mana, }; -enum class ControlTypes : uint8_t { - None, - KeyboardAndMouse, - Gamepad, - VirtualGamepad, -}; - -extern ControlTypes ControlMode; - -/** - * @brief Controlling device type. - * - * While simulating a mouse, `ControlMode` is set to `KeyboardAndMouse`, - * even though a gamepad is used to control it. - * - * This value is always set to the actual active device type. - */ -extern ControlTypes ControlDevice; - extern GameActionType ControllerActionHeld; - -extern GamepadLayout GamepadType; - extern bool StandToggle; // Runs every frame. diff --git a/Source/cursor.cpp b/Source/cursor.cpp index 5655896df..a877e083a 100644 --- a/Source/cursor.cpp +++ b/Source/cursor.cpp @@ -15,6 +15,7 @@ #include "DiabloUI/diabloui.h" #include "control.h" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "doom.h" #include "engine/backbuffer_state.hpp" diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 3d06e40d0..48ff1d6b1 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -22,6 +22,7 @@ #include "debug.h" #endif #include "DiabloUI/diabloui.h" +#include "controls/control_mode.hpp" #include "controls/keymapper.hpp" #include "controls/plrctrls.h" #include "controls/remap_keyboard.h" diff --git a/Source/engine/demomode.cpp b/Source/engine/demomode.cpp index 31f085fad..21cb4de8b 100644 --- a/Source/engine/demomode.cpp +++ b/Source/engine/demomode.cpp @@ -11,6 +11,7 @@ #include "utils/sdl2_to_1_2_backports.h" #endif +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "engine/events.hpp" #include "gmenu.h" diff --git a/Source/engine/dx.cpp b/Source/engine/dx.cpp index e3cbe5e25..37bac7d06 100644 --- a/Source/engine/dx.cpp +++ b/Source/engine/dx.cpp @@ -8,6 +8,7 @@ #include #include +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "engine/render/primitive_render.hpp" #include "headless_mode.hpp" diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index 2f1d50e3d..d8f3bfcad 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -13,6 +13,7 @@ #include "DiabloUI/ui_flags.hpp" #include "automap.h" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "cursor.h" #include "dead.h" diff --git a/Source/inv.cpp b/Source/inv.cpp index bb07acf8f..e64b82066 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -12,6 +12,7 @@ #include #include "DiabloUI/ui_flags.hpp" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "cursor.h" #include "engine/backbuffer_state.hpp" diff --git a/Source/items.cpp b/Source/items.cpp index bb817163d..46f955cde 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -16,6 +16,7 @@ #include #include "DiabloUI/ui_flags.hpp" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "cursor.h" #include "doom.h" @@ -1800,8 +1801,8 @@ void printItemMiscGamepad(const Item &item, bool isOil, bool isCastOnTarget) printItemMiscGenericGamepad(item, isOil, isCastOnTarget); return; } - const std::string_view activateButton = ToString(ControllerButton_BUTTON_Y); - const std::string_view castButton = ToString(ControllerButton_BUTTON_X); + const std::string_view activateButton = ToString(GamepadType, ControllerButton_BUTTON_Y); + const std::string_view castButton = ToString(GamepadType, ControllerButton_BUTTON_X); if (item._iMiscId == IMISC_MAPOFDOOM) { AddInfoBoxString(fmt::format(fmt::runtime(_("{} to view")), activateButton)); diff --git a/Source/levels/trigs.cpp b/Source/levels/trigs.cpp index c51edec19..51235e428 100644 --- a/Source/levels/trigs.cpp +++ b/Source/levels/trigs.cpp @@ -11,6 +11,7 @@ #include #include "control.h" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "cursor.h" #include "diablo_msg.hpp" diff --git a/Source/missiles.cpp b/Source/missiles.cpp index d693e7363..9b17f9ddb 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -10,6 +10,7 @@ #include #include "control.h" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "crawl.hpp" #include "cursor.h" diff --git a/Source/movie.cpp b/Source/movie.cpp index fa93e6c9d..4cf094dcb 100644 --- a/Source/movie.cpp +++ b/Source/movie.cpp @@ -6,6 +6,7 @@ #include +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "diablo.h" #include "effects.h" diff --git a/Source/options.cpp b/Source/options.cpp index 13e6a1c06..8dc1fe9b9 100644 --- a/Source/options.cpp +++ b/Source/options.cpp @@ -21,11 +21,8 @@ #include #include "appfat.h" -#include "control.h" -#include "controls/controller.h" +#include "controls/control_mode.hpp" #include "controls/controller_buttons.h" -#include "controls/game_controls.h" -#include "controls/plrctrls.h" #include "engine/assets.hpp" #include "engine/sound_defs.hpp" #include "platform/locale.hpp" @@ -33,7 +30,6 @@ #include "utils/algorithm/container.hpp" #include "utils/file_util.h" #include "utils/ini.hpp" -#include "utils/is_of.hpp" #include "utils/language.h" #include "utils/log.hpp" #include "utils/logged_fstream.hpp" @@ -1444,13 +1440,13 @@ void PadmapperOptions::Action::UpdateValueDescription() const boundInputShortDescription = ""; return; } - std::string_view buttonName = ToString(boundInput.button); + std::string_view buttonName = ToString(GamepadType, boundInput.button); if (boundInput.modifier == ControllerButton_NONE) { boundInputDescription = std::string(buttonName); boundInputShortDescription = std::string(Shorten(buttonName)); return; } - std::string_view modifierName = ToString(boundInput.modifier); + std::string_view modifierName = ToString(GamepadType, boundInput.modifier); boundInputDescription = StrCat(modifierName, "+", buttonName); boundInputShortDescription = StrCat(Shorten(modifierName), "+", Shorten(buttonName)); } diff --git a/Source/panels/spell_list.cpp b/Source/panels/spell_list.cpp index c29d5a804..217ca8089 100644 --- a/Source/panels/spell_list.cpp +++ b/Source/panels/spell_list.cpp @@ -5,6 +5,7 @@ #include #include "control.h" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "engine/backbuffer_state.hpp" #include "engine/palette.h" diff --git a/Source/player.cpp b/Source/player.cpp index 871a32181..d0b2edb93 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -10,6 +10,7 @@ #include #include "control.h" +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "cursor.h" #include "dead.h" diff --git a/Source/stores.cpp b/Source/stores.cpp index 24c922a8d..47341b9d1 100644 --- a/Source/stores.cpp +++ b/Source/stores.cpp @@ -11,6 +11,7 @@ #include +#include "controls/control_mode.hpp" #include "controls/plrctrls.h" #include "cursor.h" #include "engine/backbuffer_state.hpp" diff --git a/Source/track.cpp b/Source/track.cpp index 9ec9fca6c..12fe591aa 100644 --- a/Source/track.cpp +++ b/Source/track.cpp @@ -7,6 +7,7 @@ #include +#include "controls/control_mode.hpp" #include "controls/game_controls.h" #include "controls/plrctrls.h" #include "cursor.h"