#pragma once // Controller actions implementation #include #include #include #include "controls/controller.h" #include "controls/game_controls.h" #include "player.h" namespace devilution { typedef enum belt_item_type : uint8_t { BLT_HEALING, BLT_MANA, } belt_item_type; 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. // Handles menu movement. void plrctrls_every_frame(); // Run after every game logic iteration. // Handles player movement. void plrctrls_after_game_logic(); // Runs at the end of CheckCursMove() // Handles item, object, and monster auto-aim. void plrctrls_after_check_curs_move(); // Moves the map if active, the cursor otherwise. void HandleRightStickMotion(); // Whether we're in a dialog menu that the game handles natively with keyboard controls. bool InGameMenu(); void SetPointAndClick(bool value); bool IsPointAndClick(); bool IsMovementHandlerActive(); void DetectInputMethod(const SDL_Event &event, const ControllerButtonEvent &gamepadEvent); void ProcessGameAction(const GameAction &action); void UseBeltItem(int type); // Talk to towners, click on inv items, attack, etc. void PerformPrimaryAction(); // Open chests, doors, pickup items. void PerformSecondaryAction(); void UpdateSpellTarget(SpellID spell); bool TryDropItem(); void InvalidateInventorySlot(); void FocusOnInventory(); void PerformSpellAction(); void QuickCast(size_t slot); extern int speedspellcount; } // namespace devilution