Browse Source

🐞 Fix controller modifier hints

Fixes a regression introduced in #1897

Reverts the layout calculation changes from that PR and simply adapts
the previous code to the `DrawString` API
pull/1957/head
Gleb Mazovetskiy 5 years ago committed by Anders Jenbo
parent
commit
4cd1fd9b72
  1. 79
      Source/controls/modifier_hints.cpp

79
Source/controls/modifier_hints.cpp

@ -13,47 +13,82 @@ namespace devilution {
namespace { namespace {
int SpaceWidth()
{
static const int Result = GetLineWidth(" ");
return Result;
}
/** The number of spaces between left and right hints. */
constexpr int MidSpaces = 5;
/** Vertical distance between text lines. */
constexpr int LineHeight = 25;
/** Horizontal margin of the hints circle from panel edge. */
constexpr int CircleMarginX = 16;
/** Distance between the panel top and the circle top. */
constexpr int CircleTop = 76;
struct CircleMenuHint { struct CircleMenuHint {
CircleMenuHint(bool isDpad, const char *top, const char *right, const char *bottom, const char *left) CircleMenuHint(bool isDpad, const char *top, const char *right, const char *bottom, const char *left)
: is_dpad(isDpad) : isDpad(isDpad)
, top(top) , top(top)
, topW(GetLineWidth(top))
, right(right) , right(right)
, rightW(GetLineWidth(right))
, bottom(bottom) , bottom(bottom)
, bottomW(GetLineWidth(bottom))
, left(left) , left(left)
, leftW(GetLineWidth(left))
, xMid(leftW + SpaceWidth() * MidSpaces / 2)
{ {
} }
bool is_dpad;
int Width() const
{
return 2 * xMid;
}
bool isDpad;
const char *top; const char *top;
int topW;
const char *right; const char *right;
int rightW;
const char *bottom; const char *bottom;
int bottomW;
const char *left; const char *left;
int leftW;
int xMid;
}; };
bool IsTopActive(const CircleMenuHint &hint) bool IsTopActive(const CircleMenuHint &hint)
{ {
if (hint.is_dpad) if (hint.isDpad)
return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_UP); return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_UP);
return IsControllerButtonPressed(ControllerButton_BUTTON_Y); return IsControllerButtonPressed(ControllerButton_BUTTON_Y);
} }
bool IsRightActive(const CircleMenuHint &hint) bool IsRightActive(const CircleMenuHint &hint)
{ {
if (hint.is_dpad) if (hint.isDpad)
return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_RIGHT); return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_RIGHT);
return IsControllerButtonPressed(ControllerButton_BUTTON_B); return IsControllerButtonPressed(ControllerButton_BUTTON_B);
} }
bool IsBottomActive(const CircleMenuHint &hint) bool IsBottomActive(const CircleMenuHint &hint)
{ {
if (hint.is_dpad) if (hint.isDpad)
return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_DOWN); return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_DOWN);
return IsControllerButtonPressed(ControllerButton_BUTTON_A); return IsControllerButtonPressed(ControllerButton_BUTTON_A);
} }
bool IsLeftActive(const CircleMenuHint &hint) bool IsLeftActive(const CircleMenuHint &hint)
{ {
if (hint.is_dpad) if (hint.isDpad)
return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_LEFT); return IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_LEFT);
return IsControllerButtonPressed(ControllerButton_BUTTON_X); return IsControllerButtonPressed(ControllerButton_BUTTON_X);
} }
@ -63,30 +98,26 @@ uint16_t CircleMenuHintTextColor(bool active)
return active ? UIS_BLUE : UIS_GOLD; return active ? UIS_BLUE : UIS_GOLD;
} }
const int CircleSpacing = 40;
const int CircleMarginX = 16 + CircleSpacing * 2;
const int CirclesTop = 16 + CircleSpacing * 2;
void DrawCircleMenuHint(const CelOutputBuffer &out, const CircleMenuHint &hint, int x, int y) void DrawCircleMenuHint(const CelOutputBuffer &out, const CircleMenuHint &hint, int x, int y)
{ {
DrawString(out, hint.top, { x, y, CircleSpacing, 0 }, CircleMenuHintTextColor(IsTopActive(hint)) | UIS_CENTER); DrawString(out, hint.top, { x + hint.xMid - hint.topW / 2, y, 0, 0 }, CircleMenuHintTextColor(IsTopActive(hint)));
y += CircleSpacing; y += LineHeight;
DrawString(out, hint.left, { x + CircleSpacing, y, CircleSpacing, 0 }, CircleMenuHintTextColor(IsLeftActive(hint)) | UIS_CENTER); DrawString(out, hint.left, { x, y, 0, 0 }, CircleMenuHintTextColor(IsLeftActive(hint)));
DrawString(out, hint.right, { x - CircleSpacing, y, CircleSpacing, 0 }, CircleMenuHintTextColor(IsRightActive(hint)) | UIS_CENTER); DrawString(out, hint.right, { x + hint.leftW + MidSpaces * SpaceWidth(), y, 0, 0 }, CircleMenuHintTextColor(IsRightActive(hint)));
y += CircleSpacing; y += LineHeight;
DrawString(out, hint.bottom, { x, y, CircleSpacing, 0 }, CircleMenuHintTextColor(IsBottomActive(hint)) | UIS_CENTER); DrawString(out, hint.bottom, { x + hint.xMid - hint.bottomW / 2, y, 0, 0 }, CircleMenuHintTextColor(IsBottomActive(hint)));
} }
void DrawStartModifierMenu(const CelOutputBuffer &out) void DrawStartModifierMenu(const CelOutputBuffer &out)
{ {
if (!start_modifier_active) if (!start_modifier_active)
return; return;
static const CircleMenuHint dPad(/*is_dpad=*/true, /*top=*/_("Menu"), /*right=*/_("Inv"), /*bottom=*/_("Map"), /*left=*/_("Char")); static const CircleMenuHint DPad(/*isDpad=*/true, /*top=*/_("Menu"), /*right=*/_("Inv"), /*bottom=*/_("Map"), /*left=*/_("Char"));
static const CircleMenuHint buttons(/*is_dpad=*/false, /*top=*/"", /*right=*/"", /*bottom=*/_("Spells"), /*left=*/_("Quests")); static const CircleMenuHint Buttons(/*isDpad=*/false, /*top=*/"", /*right=*/"", /*bottom=*/_("Spells"), /*left=*/_("Quests"));
DrawCircleMenuHint(out, dPad, PANEL_LEFT + CircleMarginX, PANEL_TOP - CirclesTop); DrawCircleMenuHint(out, DPad, PANEL_LEFT + CircleMarginX, PANEL_TOP - CircleTop);
DrawCircleMenuHint(out, buttons, PANEL_LEFT + PANEL_WIDTH - CircleMarginX, PANEL_TOP - CirclesTop); DrawCircleMenuHint(out, Buttons, PANEL_LEFT + PANEL_WIDTH - Buttons.Width() - CircleMarginX, PANEL_TOP - CircleTop);
} }
void DrawSelectModifierMenu(const CelOutputBuffer &out) void DrawSelectModifierMenu(const CelOutputBuffer &out)
@ -94,11 +125,11 @@ void DrawSelectModifierMenu(const CelOutputBuffer &out)
if (!select_modifier_active) if (!select_modifier_active)
return; return;
if (sgOptions.Controller.bDpadHotkeys) { if (sgOptions.Controller.bDpadHotkeys) {
static const CircleMenuHint dPad(/*is_dpad=*/true, /*top=*/"F6", /*right=*/"F8", /*bottom=*/"F7", /*left=*/"F5"); static const CircleMenuHint DPad(/*isDpad=*/true, /*top=*/"F6", /*right=*/"F8", /*bottom=*/"F7", /*left=*/"F5");
DrawCircleMenuHint(out, dPad, PANEL_LEFT + CircleMarginX, PANEL_TOP - CirclesTop); DrawCircleMenuHint(out, DPad, PANEL_LEFT + CircleMarginX, PANEL_TOP - CircleTop);
} }
static const CircleMenuHint spells(/*is_dpad=*/false, "F6", "F8", "F7", "F5"); static const CircleMenuHint Spells(/*isDpad=*/false, "F6", "F8", "F7", "F5");
DrawCircleMenuHint(out, spells, PANEL_LEFT + PANEL_WIDTH - CircleMarginX, PANEL_TOP - CirclesTop); DrawCircleMenuHint(out, Spells, PANEL_LEFT + PANEL_WIDTH - Spells.Width() - CircleMarginX, PANEL_TOP - CircleTop);
} }
} // namespace } // namespace

Loading…
Cancel
Save