Descriptive input: K_DrawGameControl rich text wrapper (WIP)

This commit is contained in:
Antonio Martinez 2024-09-14 05:23:17 -07:00 committed by AJ Martinez
parent 0b9c5c7415
commit dbd43859fe
6 changed files with 176 additions and 19 deletions

View file

@ -759,6 +759,129 @@ static keyname_t keynames[] =
{KEY_AXIS1+9, "R TRIGGER"},
};
static keyname_t shortkeynames[] =
{
{KEY_SPACE, "SPC"},
{KEY_CAPSLOCK, "CAPS"},
{KEY_ENTER, "ENTER"},
{KEY_TAB, "TAB"},
{KEY_ESCAPE, "ESC"},
{KEY_BACKSPACE, "BSPC"},
{KEY_NUMLOCK, "NUMLOCK"},
{KEY_SCROLLLOCK, "SCRLOCK"},
// bill gates keys
{KEY_LEFTWIN, "LWIN"},
{KEY_RIGHTWIN, "RWIN"},
{KEY_MENU, "MENU"},
{KEY_LSHIFT, "LSHIFT"},
{KEY_RSHIFT, "RSHIFT"},
{KEY_LSHIFT, "SHIFT"},
{KEY_LCTRL, "LCTRL"},
{KEY_RCTRL, "RCTRL"},
{KEY_LCTRL, "CTRL"},
{KEY_LALT, "LALT"},
{KEY_RALT, "RALT"},
{KEY_LALT, "ALT"},
// keypad keys
{KEY_KPADSLASH, "NUM/"},
{KEY_KEYPAD7, "NUM7"},
{KEY_KEYPAD8, "NUM8"},
{KEY_KEYPAD9, "NUM9"},
{KEY_MINUSPAD, "NUM-"},
{KEY_KEYPAD4, "NUM4"},
{KEY_KEYPAD5, "NUM5"},
{KEY_KEYPAD6, "NUM6"},
{KEY_PLUSPAD, "NUM+"},
{KEY_KEYPAD1, "NUM1"},
{KEY_KEYPAD2, "NUM2"},
{KEY_KEYPAD3, "NUM3"},
{KEY_KEYPAD0, "NUM0"},
{KEY_KPADDEL, "NUM ."},
// extended keys (not keypad)
{KEY_HOME, "HOME"},
{KEY_UPARROW, "UP"},
{KEY_PGUP, "PGUP"},
{KEY_LEFTARROW, "LEFT"},
{KEY_RIGHTARROW, "RIGHT"},
{KEY_END, "END"},
{KEY_DOWNARROW, "DOWN"},
{KEY_PGDN, "PGDN"},
{KEY_INS, "INS"},
{KEY_DEL, "DEL"},
// other keys
{KEY_F1, "F1"},
{KEY_F2, "F2"},
{KEY_F3, "F3"},
{KEY_F4, "F4"},
{KEY_F5, "F5"},
{KEY_F6, "F6"},
{KEY_F7, "F7"},
{KEY_F8, "F8"},
{KEY_F9, "F9"},
{KEY_F10, "F10"},
{KEY_F11, "F11"},
{KEY_F12, "F12"},
// KEY_CONSOLE has an exception in the keyname code
{'`', "TILDE"},
{KEY_PAUSE, "PAUSE/BREAK"},
// virtual keys for mouse buttons and joystick buttons
{KEY_MOUSE1+0,"M1"},
{KEY_MOUSE1+1,"M2"},
{KEY_MOUSE1+2,"M3"},
{KEY_MOUSE1+3,"M4"},
{KEY_MOUSE1+4,"M5"},
{KEY_MOUSE1+5,"M6"},
{KEY_MOUSE1+6,"M7"},
{KEY_MOUSE1+7,"M8"},
{KEY_MOUSEMOVE+0,"Mouse Up"},
{KEY_MOUSEMOVE+1,"Mouse Down"},
{KEY_MOUSEMOVE+2,"Mouse Left"},
{KEY_MOUSEMOVE+3,"Mouse Right"},
{KEY_MOUSEWHEELUP, "Wheel Up"},
{KEY_MOUSEWHEELDOWN, "Wheel Down"},
{KEY_JOY1+0, "A"},
{KEY_JOY1+1, "B"},
{KEY_JOY1+2, "X"},
{KEY_JOY1+3, "Y"},
{KEY_JOY1+4, "BACK"},
{KEY_JOY1+5, "GUIDE"},
{KEY_JOY1+6, "START"},
{KEY_JOY1+7, "LS"},
{KEY_JOY1+8, "RS"},
{KEY_JOY1+9, "LB"},
{KEY_JOY1+10, "RB"},
{KEY_JOY1+11, "D-UP"},
{KEY_JOY1+12, "D-DOWN"},
{KEY_JOY1+13, "D-LEFT"},
{KEY_JOY1+14, "D-RIGHT"},
{KEY_JOY1+15, "MISC."},
{KEY_JOY1+16, "PADDLE1"},
{KEY_JOY1+17, "PADDLE2"},
{KEY_JOY1+18, "PADDLE3"},
{KEY_JOY1+19, "PADDLE4"},
{KEY_JOY1+20, "TOUCHPAD"},
{KEY_AXIS1+0, "LS LEFT"},
{KEY_AXIS1+1, "LS RIGHT"},
{KEY_AXIS1+2, "LS UP"},
{KEY_AXIS1+3, "LS DOWN"},
{KEY_AXIS1+4, "RS LEFT"},
{KEY_AXIS1+5, "RS RIGHT"},
{KEY_AXIS1+6, "RS UP"},
{KEY_AXIS1+7, "RS DOWN"},
{KEY_AXIS1+8, "LT"},
{KEY_AXIS1+9, "RT"},
};
static const char *gamecontrolname[num_gamecontrols] =
{
"null", // a key/button mapped to gc_null has no effect
@ -894,6 +1017,30 @@ const char *G_KeynumToString(INT32 keynum)
return keynamestr;
}
const char *G_KeynumToShortString(INT32 keynum)
{
static char keynamestr[8];
UINT32 j;
// return a string with the ascii char if displayable
if (keynum > ' ' && keynum <= 'z' && keynum != KEY_CONSOLE)
{
keynamestr[0] = (char)(keynum - 32); // Uppercase looks better!
keynamestr[1] = '\0';
return keynamestr;
}
// find a description for special keys
for (j = 0; j < NUMKEYNAMES; j++)
if (shortkeynames[j].keynum == keynum)
return shortkeynames[j].name;
// create a name for unknown keys
sprintf(keynamestr, "KEY%d", keynum);
return keynamestr;
}
INT32 G_KeyStringtoNum(const char *keystr)
{
UINT32 j;

View file

@ -187,6 +187,7 @@ void G_MapEventsToControls(event_t *ev);
// returns the name of a key
const char *G_KeynumToString(INT32 keynum);
const char *G_KeynumToShortString(INT32 keynum);
INT32 G_KeyStringtoNum(const char *keystr);
boolean G_KeyBindIsNecessary(INT32 gc);

View file

@ -6854,3 +6854,21 @@ void K_DrawMarginSticker(INT32 x, INT32 y, INT32 width, INT32 flags, boolean isS
if (!leftedge)
V_DrawFixedPatch((x + width)*FRACUNIT, y*FRACUNIT, FRACUNIT, flags|V_FLIP, stickerEnd, NULL);
}
INT32 K_DrawGameControl(UINT16 x, UINT16 y, UINT8 player, const char *str, UINT8 alignment)
{
using srb2::Draw;
// FIXME: SUPER BAD HACK.
// Need a way to parse messages as a given player instead.
player_t *oldstplyr = stplyr;
stplyr = &players[player];
Draw::TextElement text = Draw::TextElement().parse(str).font(Draw::Font::kMenu);
stplyr = oldstplyr;
INT32 width = text.width();
Draw(x, y).align((srb2::Draw::Align)alignment).text(text);
return width;
}

View file

@ -133,6 +133,8 @@ INT32 K_GetMinimapTransFlags(const boolean usingProgressBar);
INT32 K_GetMinimapSplitFlags(const boolean usingProgressBar);
position_t K_GetKartObjectPosToMinimapPos(fixed_t objx, fixed_t objy);
INT32 K_DrawGameControl(UINT16 x, UINT16 y, UINT8 player, const char *str, UINT8 alignment);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -832,18 +832,9 @@ void M_DrawMenuMessage(void)
if (standardbuttons)
{
workx -= SHORT(kp_button_x[1][0]->width);
K_drawButton(
workx * FRACUNIT, worky * FRACUNIT,
0, kp_button_x[1],
push
);
workx -= SHORT(kp_button_b[1][0]->width);
K_drawButton(
workx * FRACUNIT, worky * FRACUNIT,
0, kp_button_b[1],
push
workx -= K_DrawGameControl(
workx, worky,
0, "<b> / <x>", 2
);
}
else
@ -871,11 +862,9 @@ void M_DrawMenuMessage(void)
if (standardbuttons)
{
workx -= SHORT(kp_button_a[1][0]->width);
K_drawButton(
workx * FRACUNIT, worky * FRACUNIT,
0, kp_button_a[1],
push
workx -= K_DrawGameControl(
workx, worky,
0, "<a>", 2
);
}
else

View file

@ -162,12 +162,12 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw)
}
else
{
string_.append("\x88");
string_.append("\x8D");
if (bind == -1)
string_.append("[NOT BOUND]");
else
string_.append((G_KeynumToString(bind)));
string_.append((G_KeynumToShortString(bind)));
string_.append("\x80");
}