Browse Source

[controller] Hot spells via mod+A/B/X/Y, quest log/spellbook via mod+L2/R2

pull/897/head
Anders Jenbo 6 years ago
parent
commit
eb0f899c90
  1. 1
      CMake/retrofw_defs.cmake
  2. 1
      SourceX/controls/README.md
  3. 5
      SourceX/controls/devices/kbcontroller.cpp
  4. 106
      SourceX/controls/game_controls.cpp
  5. 2
      SourceX/controls/game_controls.h
  6. 24
      SourceX/controls/plrctrls.cpp
  7. 22
      SourceX/miniwin/misc_msg.cpp

1
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

1
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
```

5
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

106
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;

2
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,
};

24
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) {

22
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;

Loading…
Cancel
Save