Skip to content

Commit

Permalink
Initial support for gamepad and keyboard input for Talk window (#943)
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Aug 10, 2023
1 parent 3063652 commit 30b97b1
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 3 deletions.
12 changes: 12 additions & 0 deletions src/xrEngine/xr_level_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,12 @@ game_action actions[] = {

{ "pda_filter_toggle", kPDA_FILTER_TOGGLE, _sp, EKeyContext::PDA },

// Talk:
{ "talk_switch_to_trade", kTALK_SWITCH_TO_TRADE, _sp, EKeyContext::Talk },
{ "talk_log_scroll", kTALK_LOG_SCROLL, _sp, EKeyContext::Talk },
{ "talk_log_scroll_up", kTALK_LOG_SCROLL_UP, _sp, EKeyContext::Talk },
{ "talk_log_scroll_down", kTALK_LOG_SCROLL_DOWN, _sp, EKeyContext::Talk },

{ nullptr, kLASTACTION, _both }
};

Expand Down Expand Up @@ -988,6 +994,12 @@ class CCC_DefControls : public CCC_UnBindAll

{ kPDA_FILTER_TOGGLE, { SDL_SCANCODE_B, SDL_SCANCODE_UNKNOWN, XR_CONTROLLER_BUTTON_Y } },

// Talk:
{ kTALK_SWITCH_TO_TRADE, { SDL_SCANCODE_X, SDL_SCANCODE_UNKNOWN, XR_CONTROLLER_BUTTON_X } },
{ kTALK_LOG_SCROLL, { SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, XR_CONTROLLER_AXIS_RIGHT } },
{ kTALK_LOG_SCROLL_UP, { SDL_SCANCODE_E, SDL_SCANCODE_PAGEUP, XR_CONTROLLER_AXIS_TRIGGER_LEFT } },
{ kTALK_LOG_SCROLL_DOWN, { SDL_SCANCODE_Q, SDL_SCANCODE_PAGEDOWN, XR_CONTROLLER_AXIS_TRIGGER_RIGHT } },

{ kEDITOR, { SDL_SCANCODE_F10, SDL_SCANCODE_UNKNOWN, XR_CONTROLLER_BUTTON_INVALID } },
};

Expand Down
7 changes: 7 additions & 0 deletions src/xrEngine/xr_level_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,12 @@ enum EGameActions : u32

kPDA_FILTER_TOGGLE,

// Talk:
kTALK_SWITCH_TO_TRADE, // _OR_UPGRADE
kTALK_LOG_SCROLL,
kTALK_LOG_SCROLL_UP,
kTALK_LOG_SCROLL_DOWN,

kLASTACTION,
kNOTBINDED
};
Expand All @@ -173,6 +179,7 @@ enum class EKeyContext
Undefined = 0, // default behaviour
UI, // UI overall
PDA,
Talk,
};

constexpr char GAME_ACTION_MARK = 27; // escape symbol
Expand Down
8 changes: 8 additions & 0 deletions src/xrGame/ui/UITalkDialogWnd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,14 @@ void CUITalkDialogWnd::UpdateButtonsLayout(bool b_disable_break, bool trade_enab
}
}

void CUITalkDialogWnd::TryScrollAnswersList(bool down)
{
if (down)
UIAnswersList->ScrollBar()->TryScrollDec();
else
UIAnswersList->ScrollBar()->TryScrollInc();
}

void CUIQuestionItem::SendMessage(CUIWindow* pWnd, s16 msg, void* pData) { CUIWndCallback::OnEvent(pWnd, msg, pData); }
CUIQuestionItem::CUIQuestionItem(CUIXml* xml_doc, LPCSTR path)
: CUIWindow("CUIQuestionItem")
Expand Down
2 changes: 2 additions & 0 deletions src/xrGame/ui/UITalkDialogWnd.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ class CUITalkDialogWnd final : public CUIWindow, public CUIWndCallback
void SetTradeMode();
void UpdateButtonsLayout(bool b_disable_break, bool trade_enabled);

void TryScrollAnswersList(bool down);

private:
// List of questions we can ask the character
CUIScrollView* UIQuestionsList;
Expand Down
34 changes: 31 additions & 3 deletions src/xrGame/ui/UITalkWnd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,16 +347,17 @@ bool CUITalkWnd::OnKeyboardAction(int dik, EUIMessages keyboard_action)
{
if (keyboard_action == WINDOW_KEY_PRESSED)
{
if (IsBinded(kUSE, dik) || IsBinded(kQUIT, dik))
if (IsBinded(kUSE, dik) || IsBinded(kQUIT, dik) || IsBinded(kUI_BACK, dik, EKeyContext::UI))
{
if (!b_disable_break)
{
HideDialog();
return true;
}
}
else if (IsBinded(kSPRINT_TOGGLE, dik))
switch (GetBindedAction(dik, EKeyContext::Talk))
{
case kTALK_SWITCH_TO_TRADE:
if (!m_pOthersInvOwner->NeedOsoznanieMode())
{
if (UITalkDialogWnd->mechanic_mode)
Expand All @@ -365,12 +366,39 @@ bool CUITalkWnd::OnKeyboardAction(int dik, EUIMessages keyboard_action)
SwitchToTrade();
return true;
}
break;
}
}
else if (keyboard_action == WINDOW_KEY_HOLD)
{
switch (GetBindedAction(dik, EKeyContext::Talk))
{
case kTALK_LOG_SCROLL_UP:
UITalkDialogWnd->TryScrollAnswersList(false);
break;
case kTALK_LOG_SCROLL_DOWN:
UITalkDialogWnd->TryScrollAnswersList(true);
break;
}
}

return inherited::OnKeyboardAction(dik, keyboard_action);
}

bool CUITalkWnd::OnControllerAction(int axis, float x, float y, EUIMessages controller_action)
{
if (controller_action == WINDOW_KEY_PRESSED)
{
switch (GetBindedAction(axis, EKeyContext::Trade))
{
default:
return OnKeyboardAction(axis, controller_action);
case kTALK_LOG_SCROLL:
return true;
}
}
return inherited::OnControllerAction(axis, x, y, controller_action);
}

void CUITalkWnd::PlaySnd(LPCSTR text)
{
u32 text_len = xr_strlen(text);
Expand Down
1 change: 1 addition & 0 deletions src/xrGame/ui/UITalkWnd.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class CUITalkWnd final : public CUIDialogWnd
//инициализации начального диалога собеседника
void InitOthersStartDialog();
virtual bool OnKeyboardAction(int dik, EUIMessages keyboard_action);
bool OnControllerAction(int axis, float x, float y, EUIMessages controller_action) override;
void SwitchToTrade();
void SwitchToUpgrade();
void AddIconedMessage(LPCSTR caption, LPCSTR text, LPCSTR texture_name, LPCSTR templ_name);
Expand Down

0 comments on commit 30b97b1

Please sign in to comment.