diff --git a/src/g_input.c b/src/g_input.c index 5a4b6ded5..c4bf27afe 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -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; diff --git a/src/g_input.h b/src/g_input.h index 485ba2618..702a9c8f5 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -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); diff --git a/src/k_hud.cpp b/src/k_hud.cpp index dcb5f0772..2d6b2df03 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -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; +} \ No newline at end of file diff --git a/src/k_hud.h b/src/k_hud.h index 727115a35..2f8a6ddc8 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -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 diff --git a/src/k_menudraw.c b/src/k_menudraw.c index dce2b8c7b..1ab891115 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -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, " / ", 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, "", 2 ); } else diff --git a/src/v_draw.cpp b/src/v_draw.cpp index a33b89f83..2075a04ce 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -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"); }