From 08e4e8c25400f09a7d7194a0cfb86e48550585ae Mon Sep 17 00:00:00 2001 From: staphen Date: Sun, 14 Nov 2021 18:08:48 -0500 Subject: [PATCH] Implement virtual gamepad activation/deactivation --- Source/controls/controller_motion.cpp | 8 ++-- Source/controls/touch/event_handlers.cpp | 2 +- Source/controls/touch/gamepad.cpp | 52 ++++++++++++++++++++++++ Source/controls/touch/gamepad.h | 10 +++++ Source/diablo.cpp | 5 +++ 5 files changed, 72 insertions(+), 5 deletions(-) diff --git a/Source/controls/controller_motion.cpp b/Source/controls/controller_motion.cpp index fe2a8384c..f065370f7 100644 --- a/Source/controls/controller_motion.cpp +++ b/Source/controls/controller_motion.cpp @@ -161,10 +161,10 @@ AxisDirection GetLeftStickOrDpadDirection(bool allowDpad) bool isRightPressed = stickX >= 0.5 || (allowDpad && IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_RIGHT)); #ifdef VIRTUAL_GAMEPAD - isUpPressed |= VirtualGamepadState.directionPad.isUpPressed; - isDownPressed |= VirtualGamepadState.directionPad.isDownPressed; - isLeftPressed |= VirtualGamepadState.directionPad.isLeftPressed; - isRightPressed |= VirtualGamepadState.directionPad.isRightPressed; + isUpPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isUpPressed; + isDownPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isDownPressed; + isLeftPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isLeftPressed; + isRightPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isRightPressed; #endif if (isUpPressed) { diff --git a/Source/controls/touch/event_handlers.cpp b/Source/controls/touch/event_handlers.cpp index 655116944..e1bbaa747 100644 --- a/Source/controls/touch/event_handlers.cpp +++ b/Source/controls/touch/event_handlers.cpp @@ -119,7 +119,7 @@ void HandleTouchEvent(const SDL_Event &event) bool VirtualGamepadEventHandler::Handle(const SDL_Event &event) { - if (!IsAnyOf(event.type, SDL_FINGERDOWN, SDL_FINGERUP, SDL_FINGERMOTION)) { + if (!VirtualGamepadState.isActive || !IsAnyOf(event.type, SDL_FINGERDOWN, SDL_FINGERUP, SDL_FINGERMOTION)) { VirtualGamepadState.primaryActionButton.didStateChange = false; VirtualGamepadState.secondaryActionButton.didStateChange = false; VirtualGamepadState.spellActionButton.didStateChange = false; diff --git a/Source/controls/touch/gamepad.cpp b/Source/controls/touch/gamepad.cpp index 04f7e6a78..caba75db6 100644 --- a/Source/controls/touch/gamepad.cpp +++ b/Source/controls/touch/gamepad.cpp @@ -166,6 +166,43 @@ void InitializeVirtualGamepad() manaButtonArea.position.y = directionPad.area.position.y - (directionPadSize + padButtonSize + padButtonSpacing) / 2; manaButtonArea.radius = padButtonSize / 2; manaButton.isUsable = []() { return !chrflag && !QuestLogIsOpen; }; + + VirtualGamepadState.isActive = false; +} + +void ActivateVirtualGamepad() +{ + VirtualGamepadState.isActive = true; +} + +void DeactivateVirtualGamepad() +{ + VirtualGamepadState.Deactivate(); +} + +void VirtualGamepad::Deactivate() +{ + isActive = false; + + menuPanel.Deactivate(); + directionPad.Deactivate(); + standButton.Deactivate(); + + primaryActionButton.Deactivate(); + secondaryActionButton.Deactivate(); + spellActionButton.Deactivate(); + cancelButton.Deactivate(); + + healthButton.Deactivate(); + manaButton.Deactivate(); +} + +void VirtualMenuPanel::Deactivate() +{ + charButton.Deactivate(); + questsButton.Deactivate(); + inventoryButton.Deactivate(); + mapButton.Deactivate(); } void VirtualDirectionPad::UpdatePosition(Point touchCoordinates) @@ -199,4 +236,19 @@ void VirtualDirectionPad::UpdatePosition(Point touchCoordinates) isRightPressed = PointsRight(angle); } +void VirtualDirectionPad::Deactivate() +{ + position = area.position; + isUpPressed = false; + isDownPressed = false; + isLeftPressed = false; + isRightPressed = false; +} + +void VirtualButton::Deactivate() +{ + isHeld = false; + didStateChange = false; +} + } // namespace devilution diff --git a/Source/controls/touch/gamepad.h b/Source/controls/touch/gamepad.h index 3e3f87bab..c48979e68 100644 --- a/Source/controls/touch/gamepad.h +++ b/Source/controls/touch/gamepad.h @@ -30,6 +30,7 @@ struct VirtualDirectionPad { } void UpdatePosition(Point touchCoordinates); + void Deactivate(); }; struct VirtualButton { @@ -45,6 +46,7 @@ struct VirtualButton { } virtual bool Contains(Point point) = 0; + void Deactivate(); }; struct VirtualMenuButton : VirtualButton { @@ -86,6 +88,8 @@ struct VirtualMenuPanel { : area({ { 0, 0 }, { 0, 0 } }) { } + + void Deactivate(); }; struct VirtualGamepad { @@ -101,12 +105,18 @@ struct VirtualGamepad { VirtualPadButton healthButton; VirtualPadButton manaButton; + bool isActive; + VirtualGamepad() { } + + void Deactivate(); }; void InitializeVirtualGamepad(); +void ActivateVirtualGamepad(); +void DeactivateVirtualGamepad(); extern VirtualGamepad VirtualGamepadState; diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 88d8ad87f..0913c4a37 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -1521,6 +1521,7 @@ void FreeGameMem() FreeMonsterSnd(); FreeTownerGFX(); #ifdef VIRTUAL_GAMEPAD + DeactivateVirtualGamepad(); FreeVirtualGamepadGFX(); #endif } @@ -2042,6 +2043,10 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) } } +#ifdef VIRTUAL_GAMEPAD + ActivateVirtualGamepad(); +#endif + if (currlevel >= 17) music_start(currlevel > 20 ? TMUSIC_L5 : TMUSIC_L6); else