diff --git a/CMake/retrofw_defs.cmake b/CMake/retrofw_defs.cmake index 08e0d4222..ccb830eca 100644 --- a/CMake/retrofw_defs.cmake +++ b/CMake/retrofw_defs.cmake @@ -14,5 +14,6 @@ set(KBCTRL_BUTTON_RIGHTSHOULDER SDLK_BACKSPACE) set(KBCTRL_BUTTON_LEFTSHOULDER SDLK_TAB) set(KBCTRL_BUTTON_START SDLK_RETURN) set(KBCTRL_BUTTON_LEFTSTICK SDLK_END) # Suspend +set(KBCTRL_BUTTON_BACK SDLK_ESCAPE) # Select set(KBCTRL_MODIFIER_KEY SDLK_ESCAPE) # Select set(KBCTRL_IGNORE_1 SDLK_3) # Backlight diff --git a/SourceX/controls/README.md b/SourceX/controls/README.md index 770854e03..de110cbff 100644 --- a/SourceX/controls/README.md +++ b/SourceX/controls/README.md @@ -35,5 +35,6 @@ cmake .. -DUSE_SDL1=ON -DHAS_KBCTRL=1 -DPREFILL_PLAYER_NAME=ON \ -DKBCTRL_BUTTON_LEFTSHOULDER=SDLK_LEFTBRACKET \ -DKBCTRL_BUTTON_LEFTSTICK=SDLK_TAB \ -DKBCTRL_BUTTON_START=SDLK_RETURN \ +-DKBCTRL_BUTTON_BACK=SDLK_LSHIFT -DKBCTRL_MODIFIER_KEY=SDLK_LSHIFT ``` diff --git a/SourceX/controls/devices/kbcontroller.cpp b/SourceX/controls/devices/kbcontroller.cpp index 3fb40e5e0..8d0d47a04 100644 --- a/SourceX/controls/devices/kbcontroller.cpp +++ b/SourceX/controls/devices/kbcontroller.cpp @@ -42,14 +42,10 @@ ControllerButton KbCtrlToControllerButton(const SDL_Event &event) #endif #ifdef KBCTRL_BUTTON_B case KBCTRL_BUTTON_B: // Right button - if (IsModifierKey()) - return ControllerButton::BUTTON_RIGHTSTICK; return ControllerButton::BUTTON_B; #endif #ifdef KBCTRL_BUTTON_X case KBCTRL_BUTTON_X: // Left button - if (IsModifierKey()) - return ControllerButton::BUTTON_BACK; return ControllerButton::BUTTON_X; #endif #ifdef KBCTRL_BUTTON_Y @@ -234,6 +230,5 @@ bool ProcessKbCtrlAxisMotion(const SDL_Event &event) return true; } - } // namespace dvl #endif diff --git a/SourceX/controls/game_controls.cpp b/SourceX/controls/game_controls.cpp index af10532d0..c56f5682c 100644 --- a/SourceX/controls/game_controls.cpp +++ b/SourceX/controls/game_controls.cpp @@ -26,8 +26,6 @@ DWORD translate_controller_button_to_key(ControllerButton controller_button) return DVL_VK_TAB; // Map case ControllerButton::BUTTON_START: return DVL_VK_ESCAPE; - case ControllerButton::BUTTON_BACK: - return 'Q'; // Quest log case ControllerButton::BUTTON_DPAD_LEFT: return DVL_VK_LEFT; case ControllerButton::BUTTON_DPAD_RIGHT: @@ -48,57 +46,79 @@ bool GetGameAction(const SDL_Event &event, GameAction *action) const ControllerButtonEvent ctrl_event = ToControllerButtonEvent(event); if (!InGameMenu()) { switch (ctrl_event.button) { - case ControllerButton::IGNORE: - return true; case ControllerButton::AXIS_TRIGGERLEFT: // ZL (aka L2) if (!ctrl_event.up) - *action = GameAction(GameActionType::TOGGLE_CHARACTER_INFO); + if (IsControllerButtonPressed(ControllerButton::BUTTON_BACK)) + *action = GameAction(GameActionType::TOGGLE_QUEST_LOG); + else + *action = GameAction(GameActionType::TOGGLE_CHARACTER_INFO); return true; case ControllerButton::AXIS_TRIGGERRIGHT: // ZR (aka R2) if (!ctrl_event.up) - *action = GameAction(GameActionType::TOGGLE_INVENTORY); - return true; - case ControllerButton::BUTTON_B: // Right button - if (!ctrl_event.up) - *action = GameAction(GameActionType::PRIMARY_ACTION); - return true; - case ControllerButton::BUTTON_Y: // Top button - if (!ctrl_event.up) - *action = GameAction(GameActionType::SECONDARY_ACTION); - return true; - case ControllerButton::BUTTON_X: // Left button - if (!ctrl_event.up) - *action = GameAction(GameActionType::CAST_SPELL); + if (IsControllerButtonPressed(ControllerButton::BUTTON_BACK)) + *action = GameAction(GameActionType::TOGGLE_SPELL_BOOK); + else + *action = GameAction(GameActionType::TOGGLE_INVENTORY); return true; - case ControllerButton::BUTTON_A: // Bottom button - if (!ctrl_event.up) - *action = GameAction(GameActionType::TOGGLE_QUICK_SPELL_MENU); - return true; - case ControllerButton::BUTTON_LEFTSHOULDER: - if (!stextflag && !ctrl_event.up) - *action = GameAction(GameActionType::USE_HEALTH_POTION); - return true; - case ControllerButton::BUTTON_RIGHTSHOULDER: - if (!stextflag && !ctrl_event.up) - *action = GameAction(GameActionType::USE_MANA_POTION); - return true; - case ControllerButton::BUTTON_DPAD_UP: - case ControllerButton::BUTTON_DPAD_DOWN: - case ControllerButton::BUTTON_DPAD_LEFT: - case ControllerButton::BUTTON_DPAD_RIGHT: - // The rest is handled in charMovement() on every game_logic() call. - return true; - case ControllerButton::BUTTON_RIGHTSTICK: - *action = GameActionSendMouseClick { GameActionSendMouseClick::LEFT, ctrl_event.up }; - return true; - default: - break; + } + if (!questlog && !sbookflag) { + switch (ctrl_event.button) { + case ControllerButton::IGNORE: + return true; + case ControllerButton::BUTTON_B: // Right button + if (!ctrl_event.up) + if (IsControllerButtonPressed(ControllerButton::BUTTON_BACK)) + *action = GameActionSendKey { DVL_VK_F8, ctrl_event.up }; + else + *action = GameAction(GameActionType::PRIMARY_ACTION); + return true; + case ControllerButton::BUTTON_Y: // Top button + if (!ctrl_event.up) + if (IsControllerButtonPressed(ControllerButton::BUTTON_BACK)) + *action = GameActionSendKey { DVL_VK_F6, ctrl_event.up }; + else + *action = GameAction(GameActionType::SECONDARY_ACTION); + return true; + case ControllerButton::BUTTON_X: // Left button + if (!ctrl_event.up) + if (IsControllerButtonPressed(ControllerButton::BUTTON_BACK)) + *action = GameActionSendKey { DVL_VK_F5, ctrl_event.up }; + else + *action = GameAction(GameActionType::CAST_SPELL); + return true; + case ControllerButton::BUTTON_A: // Bottom button + if (!ctrl_event.up) + if (IsControllerButtonPressed(ControllerButton::BUTTON_BACK)) + *action = GameActionSendKey { DVL_VK_F7, ctrl_event.up }; + else + *action = GameAction(GameActionType::TOGGLE_QUICK_SPELL_MENU); + return true; + case ControllerButton::BUTTON_LEFTSHOULDER: + if (!stextflag && !ctrl_event.up) + *action = GameAction(GameActionType::USE_HEALTH_POTION); + return true; + case ControllerButton::BUTTON_RIGHTSHOULDER: + if (!stextflag && !ctrl_event.up) + *action = GameAction(GameActionType::USE_MANA_POTION); + return true; + case ControllerButton::BUTTON_DPAD_UP: + case ControllerButton::BUTTON_DPAD_DOWN: + case ControllerButton::BUTTON_DPAD_LEFT: + case ControllerButton::BUTTON_DPAD_RIGHT: + // The rest is handled in charMovement() on every game_logic() call. + return true; + case ControllerButton::BUTTON_RIGHTSTICK: + *action = GameActionSendMouseClick { GameActionSendMouseClick::LEFT, ctrl_event.up }; + return true; + default: + break; + } } } // By default, map to a keyboard key. if (ctrl_event.button != ControllerButton::NONE) { - *action = GameActionSendKey{ translate_controller_button_to_key(ctrl_event.button), + *action = GameActionSendKey { translate_controller_button_to_key(ctrl_event.button), ctrl_event.up }; return true; } @@ -121,7 +141,7 @@ MoveDirection GetMoveDirection() { const float stickX = leftStickX; const float stickY = leftStickY; - MoveDirection result{ MoveDirectionX::NONE, MoveDirectionY::NONE }; + MoveDirection result { MoveDirectionX::NONE, MoveDirectionY::NONE }; if (stickY >= 0.5 || IsControllerButtonPressed(ControllerButton::BUTTON_DPAD_UP)) { result.y = MoveDirectionY::UP; diff --git a/SourceX/controls/game_controls.h b/SourceX/controls/game_controls.h index bcad974f9..b5fdcf4a3 100644 --- a/SourceX/controls/game_controls.h +++ b/SourceX/controls/game_controls.h @@ -14,6 +14,8 @@ enum class GameActionType { TOGGLE_INVENTORY, TOGGLE_CHARACTER_INFO, TOGGLE_QUICK_SPELL_MENU, + TOGGLE_SPELL_BOOK, + TOGGLE_QUEST_LOG, SEND_KEY, SEND_MOUSE_CLICK, }; diff --git a/SourceX/controls/plrctrls.cpp b/SourceX/controls/plrctrls.cpp index 1931178df..c4414a333 100644 --- a/SourceX/controls/plrctrls.cpp +++ b/SourceX/controls/plrctrls.cpp @@ -18,7 +18,6 @@ int speedspellcount = 0; bool InGameMenu() { return stextflag > 0 - || questlog || helpflag || talkflag || qtextflag @@ -719,6 +718,23 @@ void HotSpellMove(MoveDirection dir) } } +void SpellBookMove(MoveDirection dir) +{ + DWORD ticks = GetTickCount(); + if (ticks - invmove < repeatRate) { + return; + } + invmove = ticks; + + if (dir.x == MoveDirectionX::LEFT) { + if (sbooktab > 0) + sbooktab--; + } else if (dir.x == MoveDirectionX::RIGHT) { + if (sbooktab < 3) + sbooktab++; + } +} + static const direction kFaceDir[3][3] = { // NONE UP DOWN { DIR_OMNI, DIR_N, DIR_S }, // NONE @@ -806,7 +822,7 @@ void WalkInDir(MoveDirection dir) void Movement() { - if (InGameMenu()) + if (InGameMenu() || questlog) return; MoveDirection move_dir = GetMoveDirection(); @@ -820,6 +836,8 @@ void Movement() AttrIncBtnSnap(move_dir.y); } else if (spselflag) { HotSpellMove(move_dir); + } else if (sbookflag) { + SpellBookMove(move_dir); } else { WalkInDir(move_dir); } @@ -1015,7 +1033,7 @@ bool TryDropItem() void PerformSpellAction() { - if (InGameMenu()) + if (InGameMenu() || questlog || sbookflag) return; if (invflag) { diff --git a/SourceX/miniwin/misc_msg.cpp b/SourceX/miniwin/misc_msg.cpp index 52878e931..3bf025a45 100644 --- a/SourceX/miniwin/misc_msg.cpp +++ b/SourceX/miniwin/misc_msg.cpp @@ -423,8 +423,10 @@ WINBOOL PeekMessageA(LPMSG lpMsg) break; case GameActionType::TOGGLE_QUICK_SPELL_MENU: if (!invflag || BlurInventory()) { - lpMsg->message = DVL_WM_KEYDOWN; - lpMsg->wParam = 'S'; + if (!spselflag) + DoSpeedBook(); + else + spselflag = false; chrflag = false; questlog = false; sbookflag = false; @@ -441,6 +443,15 @@ WINBOOL PeekMessageA(LPMSG lpMsg) FocusOnCharInfo(); } break; + case GameActionType::TOGGLE_QUEST_LOG: + if (!questlog) { + StartQuestlog(); + chrflag = false; + spselflag = false; + } else { + questlog = false; + } + break; case GameActionType::TOGGLE_INVENTORY: if (invflag) { BlurInventory(); @@ -453,6 +464,13 @@ WINBOOL PeekMessageA(LPMSG lpMsg) FocusOnInventory(); } break; + case GameActionType::TOGGLE_SPELL_BOOK: + if (BlurInventory()) { + invflag = false; + spselflag = false; + sbookflag = !sbookflag; + } + break; case GameActionType::SEND_KEY: lpMsg->message = action.send_key.up ? DVL_WM_KEYUP : DVL_WM_KEYDOWN; lpMsg->wParam = action.send_key.vk_code;