Descriptive input: keyboard/gamepad split, improve display of directions

This commit is contained in:
Antonio Martinez 2024-09-13 21:13:49 -07:00 committed by AJ Martinez
parent 7bf63f5217
commit 1c50c3510d

View file

@ -79,14 +79,13 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw)
{"tan", 0x8F}, {"tan", 0x8F},
}; };
// What glyphs should be rewritten as gamecontrols?
static const std::unordered_map<char, gamecontrols_e> inputdefinition = { static const std::unordered_map<char, gamecontrols_e> inputdefinition = {
{0x00, gc_up}, {0x00, gc_up},
{0x01, gc_down}, {0x01, gc_down},
{0x02, gc_right}, {0x02, gc_right},
{0x03, gc_left}, {0x03, gc_left},
{0x04, gc_up},
{0x07, gc_r}, {0x07, gc_r},
{0x08, gc_l}, {0x08, gc_l},
{0x09, gc_start}, {0x09, gc_start},
@ -100,6 +99,22 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw)
{0x0F, gc_z}, {0x0F, gc_z},
}; };
// What physical binds should always be rewritten as glyphs anyway?
static const std::unordered_map<INT32, char> prettyinputs = {
{KEY_UPARROW, 0x00},
{KEY_DOWNARROW, 0x01},
{KEY_RIGHTARROW, 0x02},
{KEY_LEFTARROW, 0x03},
{KEY_JOY1+11, 0x00},
{KEY_JOY1+12, 0x01},
{KEY_JOY1+14, 0x02},
{KEY_JOY1+13, 0x03},
{KEY_AXIS1+0, 0x03}, // Left
{KEY_AXIS1+1, 0x02}, // Right
{KEY_AXIS1+2, 0x00}, // Up
{KEY_AXIS1+3, 0x01}, // Down
};
string_.clear(); string_.clear();
string_.reserve(raw.size()); string_.reserve(raw.size());
@ -134,7 +149,7 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw)
{ {
if (cv_descriptiveinput.value) // Should we do game control translation? if (cv_descriptiveinput.value) // Should we do game control translation?
{ {
if (auto id = inputdefinition.find(it->second & (~0xF0)); it != translation.end()) // This is a game control, do descriptive input translation! if (auto id = inputdefinition.find(it->second & (~0xF0)); id != inputdefinition.end()) // This is a game control, do descriptive input translation!
{ {
// Grab our local controls // Grab our local controls
UINT8 localplayer = stplyr - players; UINT8 localplayer = stplyr - players;
@ -149,9 +164,11 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw)
INT32 bestbind = -1; // Bind that matches our input device INT32 bestbind = -1; // Bind that matches our input device
INT32 anybind = -1; // Bind that doesn't match, but is at least for this control INT32 anybind = -1; // Bind that doesn't match, but is at least for this control
for (INT32 control = 3; control >= 0; control--) // Prefer earlier binds INT32 control = 3;
while (control >= 0) // Prefer earlier binds
{ {
INT32 possiblecontrol = ourProfile->controls[id->second][control]; INT32 possiblecontrol = ourProfile->controls[(INT32)id->second][control];
// if (device is gamepad) == (bound control is in gamepad range) - e.g. if bind matches device // if (device is gamepad) == (bound control is in gamepad range) - e.g. if bind matches device
if ((device != KEYBOARD_MOUSE_DEVICE) == (possiblecontrol >= KEY_JOY1 && possiblecontrol < JOYINPUTEND)) if ((device != KEYBOARD_MOUSE_DEVICE) == (possiblecontrol >= KEY_JOY1 && possiblecontrol < JOYINPUTEND))
@ -163,18 +180,27 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw)
{ {
anybind = possiblecontrol; anybind = possiblecontrol;
} }
control--;
} }
INT32 bind = (bestbind != -1) ? bestbind : anybind; // If we couldn't find a device-appropriate bind, try to at least use something INT32 bind = (bestbind != -1) ? bestbind : anybind; // If we couldn't find a device-appropriate bind, try to at least use something
string_.append("\x88"); if (auto pretty = prettyinputs.find(bind); pretty != prettyinputs.end()) // Gamepad direction or keyboard arrow, use something nice-looking
{
if (bind == -1) string_.push_back(0xB0 | pretty->second); // take high bits from glyph invoked and low bits from control
string_.append("[NOT BOUND]"); }
else else
string_.append((G_KeynumToString(bind))); {
string_.append("\x88");
string_.append("\x80"); if (bind == -1)
string_.append("[NOT BOUND]");
else
string_.append((G_KeynumToString(bind)));
string_.append("\x80");
}
} }
else // This is a color code or some other generic glyph, treat it as is. else // This is a color code or some other generic glyph, treat it as is.
{ {