view Keyboard.cpp @ 83:2d5d13376e91

Merge
author Nomad
date Mon, 29 Oct 2012 00:49:33 +0200
parents 8b0c4d626477
children af624eaf2fc5
line wrap: on
line source

#include "OSAPI.h"

#include "Keyboard.h"
#include "GUIWindow.h"
#include "Game.h"
#include "OSInfo.h"

#include "mm7_data.h"






struct KeyboardActionMapping *pKeyActionMap;
struct AsyncKeyboard *pAsyncKeyboard;





//----- (00459C68) --------------------------------------------------------
void KeyboardActionMapping::SetKeyMapping(int uAction, int vKey, KeyToggleType type)
{
  pVirtualKeyCodesMapping[uAction] = vKey;
  pToggleTypes[uAction] = type;
}

//----- (00459C82) --------------------------------------------------------
unsigned int KeyboardActionMapping::GetActionVKey(enum InputAction eAction)
{
  return this->pVirtualKeyCodesMapping[eAction];
}

//----- (00459C8D) --------------------------------------------------------
KeyboardActionMapping::KeyboardActionMapping()
{
  uLastKeyPressed = 0;

  SetDefaultMapping();
  ReadMappings();

  ResetKeys();

  dword_506E68 = -1;
}
// 506E68: using guessed type int dword_506E68;

//----- (00459CC4) --------------------------------------------------------
void KeyboardActionMapping::SetDefaultMapping()
{
  pVirtualKeyCodesMapping[0] = VK_UP;
  pToggleTypes[0] = TOGGLE_Continuously;
  pVirtualKeyCodesMapping[1] = VK_DOWN;
  pToggleTypes[1] = TOGGLE_Continuously;
  pVirtualKeyCodesMapping[2] = VK_LEFT;
  pToggleTypes[2] = TOGGLE_Continuously;
  pVirtualKeyCodesMapping[3] = VK_RIGHT;
  pToggleTypes[3] = TOGGLE_Continuously;
  pVirtualKeyCodesMapping[8] = 'A';
  pToggleTypes[8] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[7] = 'S';
  pToggleTypes[7] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[4] = 'Y';
  pToggleTypes[4] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[5] = 'X';
  pToggleTypes[5] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[6] = VK_RETURN;
  pToggleTypes[6] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[9] = VK_SPACE;
  pToggleTypes[9] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[10] = 'C';
  pToggleTypes[10] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[11] = 'B';
  pToggleTypes[11] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[12] = VK_TAB;
  pToggleTypes[12] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[13] = 'Q';
  pToggleTypes[13] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[14] = 'Z';
  pToggleTypes[14] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[15] = 'R';
  pToggleTypes[15] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[16] = 'T';
  pToggleTypes[16] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[17] = 'N';
  pToggleTypes[17] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[18] = 'M';
  pToggleTypes[18] = TOGGLE_OneTimePress;
  pVirtualKeyCodesMapping[20] = VK_NEXT;
  pToggleTypes[20] = TOGGLE_Continuously;
  pVirtualKeyCodesMapping[21] = VK_DELETE;
  pToggleTypes[21] = TOGGLE_Continuously;

  SetKeyMapping(INPUT_CenterView, VK_END, TOGGLE_Continuously);
  SetKeyMapping(INPUT_ZoomIn, VK_ADD, TOGGLE_OneTimePress);
  SetKeyMapping(INPUT_ZoomOut, VK_SUBTRACT, TOGGLE_OneTimePress);
  SetKeyMapping(INPUT_FlyUp, VK_PRIOR, TOGGLE_Continuously);
  SetKeyMapping(INPUT_FlyDown, VK_INSERT, TOGGLE_Continuously);
  SetKeyMapping(INPUT_Land, VK_HOME, TOGGLE_OneTimePress);
  SetKeyMapping(INPUT_AlwaysRun, 'U', TOGGLE_OneTimePress);
  SetKeyMapping(INPUT_StrafeLeft, VK_OEM_4, TOGGLE_Continuously);
  SetKeyMapping(INPUT_StrafeRight, VK_OEM_6, TOGGLE_Continuously);
}

//----- (00459E3F) --------------------------------------------------------
void KeyboardActionMapping::ResetKeys()
{
  for (uint i = 0; i < 30; ++i)
    GetAsyncKeyState(pVirtualKeyCodesMapping[i]);
}

//----- (00459E5A) --------------------------------------------------------
void KeyboardActionMapping::_459E5A(int a2, int a3, GUIWindow *pWindow)
{
  KeyboardActionMapping *v4; // esi@1

  v4 = this;
  memset(this->pPressedKeysBuffer, 0, 0x101u);
  v4->uNumKeysPressed = 0;
  if ( a2 )
    v4->field_204 = 2;
  else
    v4->field_204 = 1;
  v4->field_FC = a3;
  v4->pWindow = pWindow;
  pWindow->field_40 = 1;
  if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) )
  {
    if ( pAsyncKeyboard )
      pAsyncKeyboard->Suspend();
  }
}

//----- (00459ED1) --------------------------------------------------------
void KeyboardActionMapping::_459ED1(int a2)
{
  KeyboardActionMapping *v2; // esi@1
  GUIWindow *v3; // esi@4

  v2 = this;
  if (pGame->pKeyboardInstance->bUsingAsynKeyboard && pAsyncKeyboard)
    pAsyncKeyboard->Resume();
  v2->field_204 = 0;
  v3 = v2->pWindow;
  if ( v3 )
    v3->field_40 = a2;
}

//----- (00459F10) --------------------------------------------------------
bool KeyboardActionMapping::_459F10(unsigned int a2)
{
  int v3; // [sp-4h] [bp-4h]@3

  pKeyActionMap->uLastKeyPressed = a2;
  if ( dword_506E68 == -1 )
  {
    if ( pKeyActionMap->field_204 == 1 )
    {
      if ( a2 != 8 )
      {
        if ( a2 == 9 )
          return 1;
        if ( a2 == 13 )
          goto LABEL_3;
        if ( a2 == 27 )
          goto LABEL_15;
        if ( this->uNumKeysPressed >= this->field_FC )
          return 1;
        pKeyActionMap->pPressedKeysBuffer[pKeyActionMap->uNumKeysPressed] = a2;
        ++pKeyActionMap->uNumKeysPressed;
LABEL_24:
        pKeyActionMap->pPressedKeysBuffer[pKeyActionMap->uNumKeysPressed] = 0;
        return 1;
      }
    }
    else
    {
      if ( pKeyActionMap->field_204 != 2 )
        return 0;
      if ( a2 != 8 )
      {
        if ( a2 == 13 )
          goto LABEL_3;
        if ( a2 != 27 )
        {
          if ( (signed int)a2 >= 48 && (signed int)a2 <= 57 )
          {
            if ( pKeyActionMap->uNumKeysPressed < this->field_FC )
            {
              pKeyActionMap->pPressedKeysBuffer[pKeyActionMap->uNumKeysPressed] = a2;
              ++pKeyActionMap->uNumKeysPressed;
            }
          }
          return 1;
        }
LABEL_15:
        v3 = 3;
        goto LABEL_4;
      }
    }
    if ( !pKeyActionMap->uNumKeysPressed )
      return 1;
    --pKeyActionMap->uNumKeysPressed;
    goto LABEL_24;
  }
  pKeyActionMap->pPressedKeysBuffer[pKeyActionMap->uNumKeysPressed] = a2;
  ++pKeyActionMap->uNumKeysPressed;
  pKeyActionMap->pPressedKeysBuffer[pKeyActionMap->uNumKeysPressed] = 0;
LABEL_3:
  v3 = 2;
LABEL_4:
  pKeyActionMap->_459ED1(v3);
  return 1;
}
// 506E68: using guessed type int dword_506E68;

//----- (00459FFC) --------------------------------------------------------
void KeyboardActionMapping::ReadMappings()
{
  //KeyboardActionMapping *v1; // esi@1
  int v2; // eax@2
  unsigned int v3; // eax@3
  int v4; // eax@6
  unsigned int v5; // eax@7
  int v6; // eax@10
  unsigned int v7; // eax@11
  int v8; // eax@14
  unsigned int v9; // eax@15
  int v10; // eax@18
  unsigned int v11; // eax@19
  int v12; // eax@22
  //unsigned int v13; // eax@23
  int v14; // eax@26
  //unsigned int v15; // eax@27
  int v16; // eax@30
  //unsigned int v17; // eax@31
  int v18; // eax@34
  //unsigned int v19; // eax@35
  int v20; // eax@38
  //unsigned int v21; // eax@39
  int v22; // eax@42
  //unsigned int v23; // eax@43
  int v24; // eax@46
  //unsigned int v25; // eax@47
  int v26; // eax@50
  //unsigned int v27; // eax@51
  int v28; // eax@54
  //unsigned int v29; // eax@55
  int v30; // eax@58
  //unsigned int v31; // eax@59
  int v32; // eax@62
  //unsigned int v33; // eax@63
  int v34; // eax@66
  //unsigned int v35; // eax@67
  int v36; // eax@70
  //unsigned int v37; // eax@71
  int v38; // eax@74
  //unsigned int v39; // eax@75
  int v40; // eax@78
  //unsigned int v41; // eax@79
  int v42; // eax@82
  //unsigned int v43; // eax@83
  int v44; // eax@86
  //unsigned int v45; // eax@87
  int v46; // eax@90
  //unsigned int v47; // eax@91
  int v48; // eax@94
  //unsigned int v49; // eax@95
  int v50; // eax@98
  //unsigned int v51; // eax@99
  int v52; // eax@102
  //unsigned int v53; // eax@103
  int v54; // eax@106
  //unsigned int v55; // eax@107
  int v56; // eax@110
  unsigned int v57; // eax@111
  int v58; // eax@114
  unsigned int v59; // eax@115
  int v60; // eax@118
  unsigned int v61; // eax@119
  //char str[32]; // [sp+Ch] [bp-20h]@1

  char str[32];

  ReadWindowsRegistryString("KEY_FORWARD", str, 32, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v2) = GetActionDefaultVKey(str), v2 != -1) )
  {
    pVirtualKeyCodesMapping[0] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[0] = VK_UP;
  }
  pToggleTypes[0] = TOGGLE_Continuously;
  ReadWindowsRegistryString("KEY_BACKWARD", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v4) = GetActionDefaultVKey(str), v4 != -1) )
  {
    pVirtualKeyCodesMapping[1] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[1] = VK_DOWN;
  }
  pToggleTypes[1] = TOGGLE_Continuously;

  ReadWindowsRegistryString("KEY_LEFT", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v6) = GetActionDefaultVKey(str), v6 != -1) )
  {
    pVirtualKeyCodesMapping[2] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[2] = VK_LEFT;
  }
  pToggleTypes[2] = TOGGLE_Continuously;

  ReadWindowsRegistryString("KEY_RIGHT", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v8) = GetActionDefaultVKey(str), v8 != -1) )
  {
    pVirtualKeyCodesMapping[3] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[3] = VK_RIGHT;
  }
  pToggleTypes[3] = TOGGLE_Continuously;

  ReadWindowsRegistryString("KEY_ATTACK", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v10) = GetActionDefaultVKey(str), v10 != -1) )
  {
    pVirtualKeyCodesMapping[8] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[8] = 'A';
  }
  pToggleTypes[8] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_CASTREADY", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v12) = GetActionDefaultVKey(str), v12 != -1) )
  {
    pVirtualKeyCodesMapping[7] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[7] = 'S';
  }
  pToggleTypes[7] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_YELL", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v14) = GetActionDefaultVKey(str), v14 != -1) )
  {
    pVirtualKeyCodesMapping[4] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[4] = 'Y';
  }
  pToggleTypes[4] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_JUMP", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v16) = GetActionDefaultVKey(str), v16 != -1) )
  {
    pVirtualKeyCodesMapping[5] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[5] = 'X';
  }
  pToggleTypes[5] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_COMBAT", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v18) = GetActionDefaultVKey(str), v18 != -1) )
  {
    pVirtualKeyCodesMapping[6] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[6] = VK_RETURN;
  }
  pToggleTypes[6] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_EVENTTRIGGER", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v20) = GetActionDefaultVKey(str), v20 != -1) )
  {
    pVirtualKeyCodesMapping[9] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[9] = VK_SPACE;
  }
  pToggleTypes[9] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_CAST", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v22) = GetActionDefaultVKey(str), v22 != -1) )
  {
    pVirtualKeyCodesMapping[10] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[10] = 'C';
  }
  pToggleTypes[10] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_PASS", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v24) = GetActionDefaultVKey(str), v24 != -1) )
  {
    pVirtualKeyCodesMapping[11] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[11] = 'B';
  }
  pToggleTypes[11] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_CHARCYCLE", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v26) = GetActionDefaultVKey(str), v26 != -1) )
  {
    pVirtualKeyCodesMapping[12] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[12] = VK_TAB;
  }
  pToggleTypes[12] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_QUEST", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v28) = GetActionDefaultVKey(str), v28 != -1) )
  {
    pVirtualKeyCodesMapping[13] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[13] = 'Q';
  }
  pToggleTypes[13] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_QUICKREF", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v30) = GetActionDefaultVKey(str), v30 != -1) )
  {
    pVirtualKeyCodesMapping[14] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[14] = 'Z';
  }
  pToggleTypes[14] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_REST", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v32) = GetActionDefaultVKey(str), v32 != -1) )
  {
    pVirtualKeyCodesMapping[15] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[15] = 'R';
  }
  pToggleTypes[15] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_TIMECAL", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v34) = GetActionDefaultVKey(str), v34 != -1) )
  {
    pVirtualKeyCodesMapping[16] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[16] = 'T';
  }
  pToggleTypes[16] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_AUTONOTES", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v36) = GetActionDefaultVKey(str), v36 != -1) )
  {
    pVirtualKeyCodesMapping[17] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[17] = 'N';
  }
  pToggleTypes[17] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_MAPBOOK", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v38) = GetActionDefaultVKey(str), v38 != -1) )
  {
    pVirtualKeyCodesMapping[18] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[18] = 'M';
  }
  pToggleTypes[18] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_LOOKUP", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v40) = GetActionDefaultVKey(str), v40 != -1) )
  {
    pVirtualKeyCodesMapping[20] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[20] = VK_NEXT;
  }
  pToggleTypes[20] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_LOOKDOWN", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v42) = GetActionDefaultVKey(str), v42 != -1) )
  {
    pVirtualKeyCodesMapping[21] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[21] = VK_DELETE;
  }
  pToggleTypes[21] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_CENTERVIEWPT", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v44) = GetActionDefaultVKey(str), v44 != -1) )
  {
    pVirtualKeyCodesMapping[22] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[22] = VK_END;
  }
  pToggleTypes[22] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_ZOOMIN", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v46) = GetActionDefaultVKey(str), v46 != -1) )
  {
    pVirtualKeyCodesMapping[23] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[23] = VK_ADD;
  }
  pToggleTypes[23] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_ZOOMOUT", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v48) = GetActionDefaultVKey(str), v48 != -1) )
  {
    pVirtualKeyCodesMapping[24] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[24] = VK_SUBTRACT;
  }
  pToggleTypes[24] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_FLYUP", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v50) = GetActionDefaultVKey(str), v50 != -1) )
  {
    pVirtualKeyCodesMapping[25] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[25] = VK_PRIOR;
  }
  pToggleTypes[25] = TOGGLE_Continuously;

  ReadWindowsRegistryString("KEY_FLYDOWN", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v52) = GetActionDefaultVKey(str), v52 != -1) )
  {
    pVirtualKeyCodesMapping[26] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[26] = VK_INSERT;
  }
  pToggleTypes[26] = TOGGLE_Continuously;

  ReadWindowsRegistryString("KEY_LAND", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v54) = GetActionDefaultVKey(str), v54 != -1) )
  {
    pVirtualKeyCodesMapping[27] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[27] = VK_HOME;
  }
  pToggleTypes[27] = TOGGLE_OneTimePress;

  ReadWindowsRegistryString("KEY_ALWAYSRUN", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v56) = GetActionDefaultVKey(str), v56 != -1) )
  {
    pVirtualKeyCodesMapping[19] = GetActionDefaultVKey(str);
  }
  else
  {
    pVirtualKeyCodesMapping[19] = 'U';
  }
  pToggleTypes[19] = TOGGLE_OneTimePress;

  bAlwaysRun = ReadWindowsRegistryInt("valAlwaysRun", 0) != 0;
  bFlipOnExit = ReadWindowsRegistryInt("FlipOnExit", 0) != 0;
  ReadWindowsRegistryString("KEY_STEPLEFT", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v58) = GetActionDefaultVKey(str), v58 != -1) )
  {
    pVirtualKeyCodesMapping[28] = GetActionDefaultVKey(str);
    pToggleTypes[28] = TOGGLE_OneTimePress;
  }
  else
  {
    pToggleTypes[28] = TOGGLE_Continuously;
    pVirtualKeyCodesMapping[28] = VK_OEM_4;
  }

  ReadWindowsRegistryString("KEY_STEPRIGHT", str, 0x20u, "DEFAULT");
  if ( strcmp(str, "DEFAULT") && (LOBYTE(v60) = GetActionDefaultVKey(str), v60 != -1) )
  {
    pVirtualKeyCodesMapping[29] = GetActionDefaultVKey(str);
    pToggleTypes[29] = TOGGLE_OneTimePress;
  }
  else
  {
    pToggleTypes[29] = TOGGLE_Continuously;
    pVirtualKeyCodesMapping[29] = VK_OEM_6;
  }
}

//----- (0045A960) --------------------------------------------------------
void KeyboardActionMapping::StoreMappings()
{
  const char *v2; // eax@1
  const char *v3; // eax@1
  const char *v4; // eax@1
  const char *v5; // eax@1
  const char *v6; // eax@1
  const char *v7; // eax@1
  const char *v8; // eax@1
  const char *v9; // eax@1
  const char *v10; // eax@1
  const char *v11; // eax@1
  const char *v12; // eax@1
  const char *v13; // eax@1
  const char *v14; // eax@1
  const char *v15; // eax@1
  const char *v16; // eax@1
  const char *v17; // eax@1
  const char *v18; // eax@1
  const char *v19; // eax@1
  const char *v20; // eax@1
  const char *v21; // eax@1
  const char *v22; // eax@1
  const char *v23; // eax@1
  const char *v24; // eax@1
  const char *v25; // eax@1
  const char *v26; // eax@1
  const char *v27; // eax@1
  const char *v28; // eax@1
  const char *v29; // eax@1

  v2 = GetVKeyDisplayName(this->pVirtualKeyCodesMapping[0]);
  WriteWindowsRegistryString("KEY_FORWARD", v2);
  v3 = GetVKeyDisplayName(pVirtualKeyCodesMapping[1]);
  WriteWindowsRegistryString("KEY_BACKWARD", v3);
  v4 = GetVKeyDisplayName(pVirtualKeyCodesMapping[2]);
  WriteWindowsRegistryString("KEY_LEFT", v4);
  v5 = GetVKeyDisplayName(pVirtualKeyCodesMapping[3]);
  WriteWindowsRegistryString("KEY_RIGHT", v5);
  v6 = GetVKeyDisplayName(pVirtualKeyCodesMapping[8]);
  WriteWindowsRegistryString("KEY_ATTACK", v6);
  v7 = GetVKeyDisplayName(pVirtualKeyCodesMapping[7]);
  WriteWindowsRegistryString("KEY_CASTREADY", v7);
  v8 = GetVKeyDisplayName(pVirtualKeyCodesMapping[4]);
  WriteWindowsRegistryString("KEY_YELL", v8);
  v9 = GetVKeyDisplayName(pVirtualKeyCodesMapping[5]);
  WriteWindowsRegistryString("KEY_JUMP", v9);
  v10 = GetVKeyDisplayName(pVirtualKeyCodesMapping[6]);
  WriteWindowsRegistryString("KEY_COMBAT", v10);
  v11 = GetVKeyDisplayName(pVirtualKeyCodesMapping[9]);
  WriteWindowsRegistryString("KEY_EVENTTRIGGER", v11);
  v12 = GetVKeyDisplayName(pVirtualKeyCodesMapping[10]);
  WriteWindowsRegistryString("KEY_CAST", v12);
  v13 = GetVKeyDisplayName(pVirtualKeyCodesMapping[11]);
  WriteWindowsRegistryString("KEY_PASS", v13);
  v14 = GetVKeyDisplayName(pVirtualKeyCodesMapping[12]);
  WriteWindowsRegistryString("KEY_CHARCYCLE", v14);
  v15 = GetVKeyDisplayName(pVirtualKeyCodesMapping[13]);
  WriteWindowsRegistryString("KEY_QUEST", v15);
  v16 = GetVKeyDisplayName(pVirtualKeyCodesMapping[14]);
  WriteWindowsRegistryString("KEY_QUICKREF", v16);
  v17 = GetVKeyDisplayName(pVirtualKeyCodesMapping[15]);
  WriteWindowsRegistryString("KEY_REST", v17);
  v18 = GetVKeyDisplayName(pVirtualKeyCodesMapping[16]);
  WriteWindowsRegistryString("KEY_TIMECAL", v18);
  v19 = GetVKeyDisplayName(pVirtualKeyCodesMapping[17]);
  WriteWindowsRegistryString("KEY_AUTONOTES", v19);
  v20 = GetVKeyDisplayName(pVirtualKeyCodesMapping[18]);
  WriteWindowsRegistryString("KEY_MAPBOOK", v20);
  v21 = GetVKeyDisplayName(pVirtualKeyCodesMapping[20]);
  WriteWindowsRegistryString("KEY_LOOKUP", v21);
  v22 = GetVKeyDisplayName(pVirtualKeyCodesMapping[21]);
  WriteWindowsRegistryString("KEY_LOOKDOWN", v22);
  v23 = GetVKeyDisplayName(pVirtualKeyCodesMapping[22]);
  WriteWindowsRegistryString("KEY_CENTERVIEWPT", v23);
  v24 = GetVKeyDisplayName(pVirtualKeyCodesMapping[23]);
  WriteWindowsRegistryString("KEY_ZOOMIN", v24);
  v25 = GetVKeyDisplayName(pVirtualKeyCodesMapping[24]);
  WriteWindowsRegistryString("KEY_ZOOMOUT", v25);
  v26 = GetVKeyDisplayName(pVirtualKeyCodesMapping[25]);
  WriteWindowsRegistryString("KEY_FLYUP", v26);
  v27 = GetVKeyDisplayName(pVirtualKeyCodesMapping[26]);
  WriteWindowsRegistryString("KEY_FLYDOWN", v27);
  v28 = GetVKeyDisplayName(pVirtualKeyCodesMapping[27]);
  WriteWindowsRegistryString("KEY_LAND", v28);
  v29 = GetVKeyDisplayName(pVirtualKeyCodesMapping[19]);
  WriteWindowsRegistryString("KEY_ALWAYSRUN", v29);
}

//----- (0045ABCA) --------------------------------------------------------
const unsigned __int8 KeyboardActionMapping::GetActionDefaultVKey(const char *Str)
{
  unsigned __int8 result; // al@3

  if ( !strcmp(Str, "UP") )
    return VK_UP;
  if ( !strcmp(Str, "DOWN") )
    return VK_DOWN;
  if (!strcmp(Str, "бкебн") || !strcmp(Str, "LEFT"))
    return VK_LEFT;
  if (!strcmp(Str, "бопюбн") || !strcmp(Str, "RIGHT"))
    return VK_RIGHT;
  if ( !strcmp(Str, "RETURN") )
    return VK_RETURN;
  if ( !strcmp(Str, "SPACE") )
    return VK_SPACE;
  if ( !strcmp(Str, "PAGE_DOWN") )
    return VK_NEXT;
  if ( !strcmp(Str, "PAGE_UP") )
    return VK_PRIOR;
  if ( !strcmp(Str, "TAB") )
    return VK_TAB;
  if ( !strcmp(Str, "SUBTRACT") )
    return VK_SUBTRACT;
  if ( !strcmp(Str, "ADD") )
    return VK_ADD;
  if ( !strcmp(Str, "END") )
    return VK_END;
  if ( !strcmp(Str, "DELETE") )
    return VK_DELETE;
  if ( !strcmp(Str, "HOME") )
    return VK_HOME;
  if ( !strcmp(Str, "INSERT") )
    return VK_INSERT;
  if ( strcmp(Str, "COMMA") )
  {
    if ( !strcmp(Str, "DECIMAL") )
      return VK_DECIMAL;
    if ( strcmp(Str, "SEMICOLON") )
    {
      if ( strcmp(Str, "PERIOD") )
      {
        if ( strcmp(Str, "SLASH") )
        {
          if ( strcmp(Str, "SQUOTE") )
          {
            if ( strcmp(Str, "BACKSLASH") )
            {
              if ( !strcmp(Str, "BACKSPACE") )
                return VK_BACK;
              if ( !strcmp(Str, "CONTROL") )
                return VK_CONTROL;
              if ( strlen(Str) != 1 || (result = *Str, (unsigned __int8)*Str < 0x41u) || result > 0x5Au )
                result = -1;
            }
            else
            {
              result = -36;
            }
          }
          else
          {
            result = -34;
          }
        }
        else
        {
          result = -65;
        }
      }
      else
      {
        result = -66;
      }
    }
    else
    {
      result = -70;
    }
  }
  else
  {
    result = -68;
  }
  return result;
}

//----- (0045AE2C) --------------------------------------------------------
const char *KeyboardActionMapping::GetVKeyDisplayName(signed int a1)
{
  char *v3; // [sp-4h] [bp-8h]@2

  static char static_sub_45AE2C_string_69ADE0[32];

  if ( a1 == VK_UP )
  {
    v3 = "UP";
LABEL_53:
    strcpy(static_sub_45AE2C_string_69ADE0, v3);
    return static_sub_45AE2C_string_69ADE0;
  }
  if ( a1 == VK_DOWN )
  {
    v3 = "DOWN";
    goto LABEL_53;
  }
  if ( a1 == VK_LEFT )
  {
    v3 = ascii_4E2D48;
    goto LABEL_53;
  }
  if ( a1 == VK_RIGHT )
  {
    v3 = ascii_4E2D40;
    goto LABEL_53;
  }
  if ( a1 == VK_RETURN )
  {
    v3 = "RETURN";
    goto LABEL_53;
  }
  if ( a1 == VK_SPACE )
  {
    v3 = "SPACE";
    goto LABEL_53;
  }
  if ( a1 == VK_NEXT )
  {
    v3 = "PAGE_DOWN";
    goto LABEL_53;
  }
  if ( a1 == VK_PRIOR )
  {
    v3 = "PAGE_UP";
    goto LABEL_53;
  }
  if ( a1 == VK_TAB )
  {
    v3 = "TAB";
    goto LABEL_53;
  }
  if ( a1 == 'm' )
  {
    v3 = "SUBTRACT";
    goto LABEL_53;
  }
  if ( a1 == 'k' )
  {
    v3 = "ADD";
    goto LABEL_53;
  }
  if ( a1 == VK_END )
  {
    v3 = "END";
    goto LABEL_53;
  }
  if ( a1 == VK_DELETE )
  {
    v3 = "DELETE";
    goto LABEL_53;
  }
  if ( a1 == VK_HOME )
  {
    v3 = "HOME";
    goto LABEL_53;
  }
  if ( a1 == VK_INSERT )
  {
    v3 = "INSERT";
    goto LABEL_53;
  }
  if ( a1 == VK_DECIMAL )
  {
    v3 = "DECIMAL";
    goto LABEL_53;
  }
  if ( a1 == VK_OEM_COMMA )
  {
    v3 = "COMMA";
    goto LABEL_53;
  }
  if ( a1 == VK_OEM_1 )
  {
    v3 = "SEMICOLON";
    goto LABEL_53;
  }
  if ( a1 == VK_OEM_PERIOD )
  {
    v3 = "PERIOD";
    goto LABEL_53;
  }
  if ( a1 == VK_OEM_2 )
  {
    v3 = "SLASH";
    goto LABEL_53;
  }
  if ( a1 == VK_OEM_7 )
  {
    v3 = "SQUOTE";
    goto LABEL_53;
  }
  if ( a1 == VK_OEM_5 )
  {
    v3 = "BACKSLASH";
    goto LABEL_53;
  }
  if ( a1 == VK_CONTROL )
  {
    v3 = "CONTROL";
    goto LABEL_53;
  }
  if ( a1 == VK_BACK )
  {
    v3 = "BACKSPACE";
    goto LABEL_53;
  }
  if ( a1 < 65 || a1 > 90 )
  {
    v3 = "-мер -";
    goto LABEL_53;
  }
  *(unsigned short *)static_sub_45AE2C_string_69ADE0 = (unsigned __int8)a1;
  return static_sub_45AE2C_string_69ADE0;
}

//----- (0045AFD9) --------------------------------------------------------
Keyboard::Keyboard()
{
  bUsingAsynKeyboard = false;

  if (pVersion->pVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
      pVersion->pVersionInfo.dwMajorVersion == 4)
    bUsingAsynKeyboard = false;
}

//----- (0045B019) --------------------------------------------------------
void Keyboard::EnterCriticalSection()
{
  if (bUsingAsynKeyboard)
    AsyncKeyboard::EnterCriticalSection();
}

//----- (0045B06E) --------------------------------------------------------
bool Keyboard::IsShiftHeld()
{
  bool result; // eax@2
  char v2; // zf@3

  if (bUsingAsynKeyboard)
  {
    if ( pAsyncKeyboard->_45B4EC(0x2Au) )
    {
LABEL_6:
      LOBYTE(result) = 1;
      return result;
    }
    v2 = pAsyncKeyboard->_45B4EC(0x36u) == 0;
  }
  else
  {
    LOWORD(result) = GetAsyncKeyState(VK_SHIFT);
    v2 = result == 0;
  }
  if ( !v2 )
    goto LABEL_6;
  LOBYTE(result) = 0;
  return result;
}

//----- (0045B0A9) --------------------------------------------------------
bool Keyboard::IsKeyBeingHeld(int vKey)
{
  void *v2; // esi@2
  char v3; // bl@2

  if (bUsingAsynKeyboard)
  {
    __debugbreak();
    /*
    v2 = pAsyncKeyboard;
    EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
    v3 = *((unsigned char *)v2 + (unsigned __int8)AsyncKeyboard::map_key(v2, vKey) + 265) >> 7;
    LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
    return v3;*/
  }
  else
    return (GetAsyncKeyState(vKey) & 0x8001) != 0;
}

//----- (0045B0CE) --------------------------------------------------------
bool Keyboard::WasKeyPressed(int vKey)
{
  void *v2; // esi@2
  char v3; // bl@2
  bool result; // eax@2

  if ( LOBYTE(this->bUsingAsynKeyboard) )
  {
    __debugbreak();
    /*v2 = pAsyncKeyboard;
    EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
    v3 = *((unsigned char *)v2 + (unsigned __int8)AsyncKeyboard::map_key(v2, vKey) + 521) >> 7;
    LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
    LOBYTE(result) = v3;*/
  }
  else
  {
    LOWORD(result) = GetAsyncKeyState(vKey);
    LOBYTE(result) = result & 1;
  }
  return result;
}

//----- (0045B10A) --------------------------------------------------------
AsyncKeyboard::AsyncKeyboard()
{
  *(unsigned int *)(this + 4) = 0;
  *(unsigned char *)(this + 8) = 0;

  if (!Initialize())
    MessageBoxW(nullptr, L"Could not initialize asynchronos keyboard object", nullptr, 0);
}
// 4D86B8: using guessed type int (__stdcall *AsyncKeyboard_pvdtor)(char);
// 4DBD94: using guessed type int dword_4DBD94;


//----- (0045B15E) --------------------------------------------------------
AsyncKeyboard::~AsyncKeyboard()
{
  __debugbreak();
  /*
  void *v1; // esi@1
  char *v2; // edi@1
  int v3; // ecx@1

  v1 = this;
  v2 = (char *)this + 1804;
  v3 = *((unsigned int *)this + 451);
  if ( v3 )
    (**(void (__stdcall ***)(unsigned int))v3)(1);
  *(unsigned int *)v2 = 0;
  return TerminateThread(*((HANDLE *)v1 + 1), 0x1F4u);*/
}
// 4D86B8: using guessed type int (__stdcall *AsyncKeyboard_pvdtor)(char);

//----- (0045B18E) --------------------------------------------------------
bool AsyncKeyboard::Initialize()
{
  _45B1B1();
  if (_45B229())
    return CreateDirectInputKeyboard() != 0;
  return false;
}

//----- (0045B1B1) --------------------------------------------------------
void AsyncKeyboard::_45B1B1()
{
  void *v1; // esi@1

  v1 = this;
  memset((char *)this + 9, 0, 0x100u);
  memset((char *)v1 + 265, 0, 0x100u);
  memset((char *)v1 + 521, 0, 0x100u);
  memset((char *)v1 + 780, 0, 0x400u);
}

//----- (0045B1FD) --------------------------------------------------------
void AsyncKeyboard::EnterCriticalSection()
{
  __debugbreak();
  //EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
}

//----- (0045B213) --------------------------------------------------------
void AsyncKeyboard::LeaveCriticalSection()
{
  __debugbreak();
  //LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
}

//----- (0045B229) --------------------------------------------------------
char AsyncKeyboard::_45B229()
{
  __debugbreak();
  return 0;
  /*void *v1; // esi@1
  HANDLE v2; // eax@1
  char result; // al@2
  DWORD ThreadId; // [sp+0h] [bp-4h]@1

  ThreadId = (DWORD)this;
  v1 = this;
  v2 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)AsyncKeyboardThread, this, 4u, &ThreadId);
  *((unsigned int *)v1 + 1) = v2;
  if ( v2 )
    result = SetThreadPriority(v2, 15) != 0;
  else
    result = 0;
  return result;*/
}

//----- (0045B260) --------------------------------------------------------
char AsyncKeyboard::CreateDirectInputKeyboard()
{
  __debugbreak();
  return 0;
  /*v1 = this;
  v2 = new DirectInputKeyboard;
  *((void **)v1 + 451) = v2;

  return v2 != 0;*/
}

//----- (0045B2A7) --------------------------------------------------------
void AsyncKeyboard::Resume()
{
  __debugbreak();
  /*void *v1; // esi@1
  std::string v2; // [sp-18h] [bp-24h]@2
  const char *v3; // [sp-8h] [bp-14h]@2
  int v4; // [sp-4h] [bp-10h]@2
  std::string *v5; // [sp+4h] [bp-8h]@2
  int a3; // [sp+Bh] [bp-1h]@2

  v1 = this;
  if ( *((unsigned int *)this + 451) )
  {
    EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
    _45B1B1();
    DirectInputKeyboard::set_acquire(*((DirectInputKeyboard **)v1 + 451), (int *)1);
    ResumeThread(*((HANDLE *)v1 + 1));
    LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
  }
  else
  {
    MessageBoxW(nullptr, L"Invalid DI_Keyboard, bailing out of resume()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\KeyboardAsync.cpp:97", 0);
  }*/
}

//----- (0045B329) --------------------------------------------------------
void AsyncKeyboard::Suspend()
{
  __debugbreak();
  /*void *v1; // esi@1
  std::string v2; // [sp-18h] [bp-24h]@2
  const char *v3; // [sp-8h] [bp-14h]@2
  int v4; // [sp-4h] [bp-10h]@2
  std::string *v5; // [sp+4h] [bp-8h]@2
  int a3; // [sp+Bh] [bp-1h]@2

  v1 = this;
  if ( *((unsigned int *)this + 451) )
  {
    EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
    SuspendThread(*((HANDLE *)v1 + 1));
    DirectInputKeyboard::set_acquire(*((DirectInputKeyboard **)v1 + 451), 0);
    LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
  }
  else
  {
    MessageBoxW(nullptr, L"Invalid DI_Keyboard, bailing out of suspend()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\KeyboardAsync.cpp:115", 0);
  }*/
}

//----- (0045B3A4) --------------------------------------------------------
char AsyncKeyboard::_45B3A4()
{
  __debugbreak();
  return 0;
  /**((unsigned char *)this + 8) = 1;
  Sleep(0x85u);
  return 1;*/
}


//----- (00465C53) --------------------------------------------------------
void AsyncKeyboard::Release()
{
  __debugbreak();
  /*if ( LOBYTE(pGame->pKeyboardInstance->bUsingAsynKeyboard) )
  {
    if ( pAsyncKeyboard )
    {
      pAsyncKeyboard->Suspend();
      if ( pAsyncKeyboard )
        (**(void (__stdcall ***)(int))pAsyncKeyboard)(1);
    }
    pAsyncKeyboard = 0;
  }*/
}

//----- (0045B3B6) --------------------------------------------------------
void AsyncKeyboard::Thread()
{
  __debugbreak();
  /*void *v1; // esi@1
  signed int v2; // ecx@3
  int v3; // eax@3
  DWORD v4; // edx@6
  std::string v5; // [sp-18h] [bp-2Ch]@2
  const char *v6; // [sp-8h] [bp-1Ch]@2
  int v7; // [sp-4h] [bp-18h]@2
  DWORD v8; // [sp+Ch] [bp-8h]@2
  int a3; // [sp+13h] [bp-1h]@2

  v1 = this;
  if ( *((unsigned int *)this + 451) )
  {
    ::EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
    v8 = timeGetTime();
    memcpy((char *)v1 + 9, (const void *)(*((unsigned int *)v1 + 451) + 29), 0x100u);
    (*((DirectInputKeyboard **)v1 + 451)->_43B8EC();
    memcpy((char *)v1 + 265, (const void *)(*((unsigned int *)v1 + 451) + 29), 0x100u);
    v2 = 0;
    v3 = (int)((char *)v1 + 780);
    do
    {
      if ( *((unsigned char *)v1 + v2 + 265) & 0x80 )
      {
        if ( v8 - *(unsigned int *)v3 > 0xC8 )
        {
          v4 = v8;
          *((unsigned char *)v1 + v2 + 521) |= 0x80u;
          *(unsigned int *)v3 = v4;
        }
      }
      ++v2;
      v3 += 4;
    }
    while ( v2 < 256 );
    ::LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
  }
  else
  {
    MessageBoxW(nullptr, L"Invalid DI_Keyboard, bailing out of update_keyboard_data()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\KeyboardAsync.cpp:169", 0);
  }*/
}

//----- (0045B4EC) --------------------------------------------------------
char AsyncKeyboard::_45B4EC(unsigned __int8 a2)
{
  __debugbreak();
  return 0;
  /*void *v2; // esi@1
  char v3; // bl@1

  v2 = this;
  EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
  v3 = *((unsigned char *)v2 + a2 + 265) >> 7;
  LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncKeyboard);
  return v3;*/
}

//----- (0045B57D) --------------------------------------------------------
char AsyncKeyboard::map_key(int key)
{
  __debugbreak();
  return 0;
  /*char result; // al@2
  std::string v3; // [sp-18h] [bp-1Ch]@99
  const char *v4; // [sp-8h] [bp-Ch]@99
  int v5; // [sp-4h] [bp-8h]@99
  void *v6; // [sp+0h] [bp-4h]@1

  v6 = this;
  switch ( key )
  {
    case 8:
      result = 14;
      break;
    case 9:
      result = 15;
      break;
    case 13:
      result = 28;
      break;
    case 16:
    case 161:
      result = 54;
      break;
    case 160:
      result = 42;
      break;
    case 17:
    case 163:
      result = -99;
      break;
    case 162:
      result = 29;
      break;
    case 18:
      result = -72;
      break;
    case 20:
      result = 58;
      break;
    case 21:
      result = 112;
      break;
    case 25:
      result = -108;
      break;
    case 27:
      result = 1;
      break;
    case 28:
      result = 121;
      break;
    case 29:
      result = 123;
      break;
    case 32:
      result = 57;
      break;
    case 33:
      result = -55;
      break;
    case 34:
      result = -47;
      break;
    case 35:
      result = -49;
      break;
    case 36:
      result = -57;
      break;
    case 37:
      result = -53;
      break;
    case 38:
      result = -56;
      break;
    case 39:
      result = -51;
      break;
    case 40:
      result = -48;
      break;
    case 42:
      result = -73;
      break;
    case 45:
      result = -46;
      break;
    case 46:
      result = -45;
      break;
    case 48:
      result = 11;
      break;
    case 49:
      result = 2;
      break;
    case 50:
      result = 3;
      break;
    case 51:
      result = 4;
      break;
    case 52:
      result = 5;
      break;
    case 53:
      result = 6;
      break;
    case 54:
      result = 7;
      break;
    case 55:
      result = 8;
      break;
    case 56:
      result = 9;
      break;
    case 57:
      result = 10;
      break;
    case 65:
      result = 30;
      break;
    case 66:
      result = 48;
      break;
    case 67:
      result = 46;
      break;
    case 68:
      result = 32;
      break;
    case 69:
      result = 18;
      break;
    case 70:
      result = 33;
      break;
    case 71:
      result = 34;
      break;
    case 72:
      result = 35;
      break;
    case 73:
      result = 23;
      break;
    case 74:
      result = 36;
      break;
    case 75:
      result = 37;
      break;
    case 76:
      result = 38;
      break;
    case 77:
      result = 50;
      break;
    case 78:
      result = 49;
      break;
    case 79:
      result = 24;
      break;
    case 80:
      result = 25;
      break;
    case 81:
      result = 16;
      break;
    case 82:
      result = 19;
      break;
    case 83:
      result = 31;
      break;
    case 84:
      result = 20;
      break;
    case 85:
      result = 22;
      break;
    case 86:
      result = 47;
      break;
    case 87:
      result = 17;
      break;
    case 88:
      result = 45;
      break;
    case 89:
      result = 21;
      break;
    case 90:
      result = 44;
      break;
    case 91:
      result = -37;
      break;
    case 92:
      result = -36;
      break;
    case 93:
      result = -35;
      break;
    case 96:
      result = 82;
      break;
    case 97:
      result = 79;
      break;
    case 98:
      result = 80;
      break;
    case 99:
      result = 81;
      break;
    case 100:
      result = 75;
      break;
    case 101:
      result = 76;
      break;
    case 102:
      result = 77;
      break;
    case 103:
      result = 71;
      break;
    case 104:
      result = 72;
      break;
    case 105:
      result = 73;
      break;
    case 106:
      result = 55;
      break;
    case 107:
      result = 78;
      break;
    case 109:
      result = 74;
      break;
    case 110:
      result = 83;
      break;
    case 111:
      result = -75;
      break;
    case 112:
      result = 59;
      break;
    case 113:
      result = 60;
      break;
    case 114:
      result = 61;
      break;
    case 115:
      result = 62;
      break;
    case 116:
      result = 63;
      break;
    case 117:
      result = 64;
      break;
    case 118:
      result = 65;
      break;
    case 119:
      result = 66;
      break;
    case 120:
      result = 67;
      break;
    case 121:
      result = 68;
      break;
    case 122:
      result = 87;
      break;
    case 123:
      result = 88;
      break;
    case 124:
      result = 100;
      break;
    case 125:
      result = 101;
      break;
    case 126:
      result = 102;
      break;
    case 144:
      result = 69;
      break;
    case 145:
      result = 70;
      break;
    default:
      MessageBoxW(nullptr, L"Uknown key detected!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\KeyboardAsync.cpp:999", 0);
      goto LABEL_100;
    case 1:
    case 2:
    case 3:
    case 4:
    case 12:
    case 19:
    case 23:
    case 24:
    case 30:
    case 31:
    case 41:
    case 43:
    case 44:
    case 47:
    case 108:
    case 127:
    case 128:
    case 129:
    case 130:
    case 131:
    case 132:
    case 133:
    case 134:
    case 135:
LABEL_100:
      result = -1;
      break;
  }
  return result;*/
}

//----- (0045BA60) --------------------------------------------------------
int __stdcall AsyncKeyboard::ThreadStarter(AsyncKeyboard *pInstance)
{
  __debugbreak();
  return 0;
  /*while ( 1 )
  {
    while ( !pAsyncKeyboard )
      ;
    if ( *((unsigned char *)pAsyncKeyboard + 8) )
      ExitThread(0);
    pAsyncKeyboard->Thread();
    Sleep(0x21u);
  }*/
}








/*
//----- (0043B76D) --------------------------------------------------------
DirectInputKeyboard *__thiscall DirectInputKeyboard::DirectInputKeyboard(DirectInputKeyboard *this)
{
  DirectInputKeyboard *v1; // esi@1
  HRESULT v2; // eax@5
  unsigned int uVersion; // [sp-18h] [bp-20h]@3
  IDirectInput **ppDirectInput; // [sp-14h] [bp-1Ch]@3
  int v6; // [sp-10h] [bp-18h]@3
  const char *v7; // [sp-Ch] [bp-14h]@3
  int v8; // [sp-8h] [bp-10h]@3
  unsigned int v9; // [sp-4h] [bp-Ch]@3
  CheckHRESULT_stru0 v10; // [sp+4h] [bp-4h]@5

  v1 = this;
  this->field_8 = 0;
  LOBYTE(this->field_1C) = 0;
  this->vdestructor_ptr = &pDirectInputKeyboard_pvdtor;
  if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 )
  {
    v9 = 1;
    v8 = 28;
    v7 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp";
    v6 = 0;
    ppDirectInput = &this->pDirectInput;
    uVersion = 0x500u;
  }
  else
  {
    v9 = 1;
    v8 = 26;
    v7 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp";
    v6 = 0;
    ppDirectInput = &this->pDirectInput;
    uVersion = 0x300u;
  }
  v2 = DirectInputCreateA(hInstance, uVersion, ppDirectInput, v6);
  CheckHRESULT(&v10, v2, v7, v8, v9);
  DirectInputKeyboard::CreateDevice(v1);
  DirectInputKeyboard::43B87B(v1);
  return v1;
}
// 4C8880: using guessed type int __stdcall DirectInputCreateA(int, int, int, int);

//----- (0043B7E3) --------------------------------------------------------
void __thiscall DirectInputKeyboard::vdtor(DirectInputKeyboard *this, bool a2)
{
  void *v2; // esi@1

  v2 = this;
  DirectInputKeyboard::dtor(this);
  if ( a2 & 1 )
    free(v2);
}

//----- (0043B7FF) --------------------------------------------------------
void __thiscall DirectInputKeyboard::dtor(DirectInputKeyboard *this)
{
  DirectInputKeyboard *v1; // esi@1
  int v2; // eax@1

  v1 = this;
  v2 = this->field_8;
  this->vdestructor_ptr = &pDirectInputKeyboard_pvdtor;
  if ( v2 )
  {
    (*(void (__stdcall **)(int))(*(int *)v2 + 32))(v2);
    (*(void (__stdcall **)(int))(*(int *)v1->field_8 + 8))(v1->field_8);
    v1->field_8 = 0;
  }
  v1->pDirectInput->lpVtbl->Release(v1->pDirectInput);
  v1->pDirectInput = 0;
}

//----- (0043B831) --------------------------------------------------------
void __thiscall DirectInputKeyboard::CreateDevice(DirectInputKeyboard *this)
{
  DirectInputKeyboard *v1; // esi@1
  HRESULT v2; // eax@1
  int v3; // [sp+4h] [bp-4h]@1

  v1 = this;
  v2 = ((int (__stdcall *)(IDirectInput *, signed int, int (__stdcall *)(int, int), DirectInputKeyboard *, signed int))this->pDirectInput->lpVtbl->field_10)(
         this->pDirectInput,
         3,
         DirectInputKeyboard_enumerator_43B9B9,
         this,
         1);
  CheckHRESULT((CheckHRESULT_stru0 *)&v3, v2, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp", 52, 1u);
  if ( !LOBYTE(v1->field_1C) )
  {
    v3 = (int)"Error: No keyboard found";
    _CxxThrowException((int)&v3, (int)&dword_4DBD94);
  }
}
// 43B9B9: using guessed type int __stdcall DirectInputKeyboard_enumerator_43B9B9(int, int);
// 4DBD94: using guessed type int dword_4DBD94;

//----- (0043B87B) --------------------------------------------------------
void __thiscall DirectInputKeyboard::43B87B(DirectInputKeyboard *ecx0)
{
  char *v1; // esi@1
  HRESULT v2; // eax@1
  HRESULT v3; // eax@1
  HRESULT v4; // eax@1
  unsigned int v5; // [sp+0h] [bp-Ch]@0
  char this; // [sp+8h] [bp-4h]@1

  v1 = (char *)&ecx0->field_8;
  v2 = ((int (__stdcall *)(IDirectInput *, int *, int *, int, int))ecx0->pDirectInput->lpVtbl->field_C)(
         ecx0->pDirectInput,
         &ecx0->field_C,
         &ecx0->field_8,
         0,
         "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp");
  CheckHRESULT((CheckHRESULT_stru0 *)&this, v2, (const char *)0x3C, 1, v5);
  v3 = (*(int (__stdcall **)(int, int))(**(int **)v1 + 44))(*(int *)v1, dword_4C9890);
  CheckHRESULT((CheckHRESULT_stru0 *)&this, v3, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp", 63, 1u);
  v4 = (*(int (__stdcall **)(int, HWND, signed int))(**(int **)v1 + 52))(*(int *)v1, hWnd, 6);
  CheckHRESULT((CheckHRESULT_stru0 *)&this, v4, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp", 64, 1u);
  (*(void (__cdecl **)(int))(**(int **)v1 + 28))(*(int *)v1);
}
// 4C9890: using guessed type int dword_4C9890[10];

//----- (0043B8EC) --------------------------------------------------------
char __thiscall DirectInputKeyboard::43B8EC(DirectInputKeyboard *this)
{
  DirectInputKeyboard *v1; // esi@1
  int v2; // eax@1
  char result; // al@2
  char *v4; // ebx@3
  int v5; // esi@5
  HRESULT v6; // eax@5
  std::string v7; // [sp-18h] [bp-2Ch]@2
  int v8; // [sp-Ch] [bp-20h]@5
  const char *v9; // [sp-8h] [bp-1Ch]@2
  int v10; // [sp-4h] [bp-18h]@2
  std::string *v13; // [sp+Ch] [bp-8h]@2
  int a3; // [sp+13h] [bp-1h]@2

  v1 = this;
  v2 = this->field_8;
  if ( v2 )
  {
    v4 = (char *)&this->field_1C + 1;
    if ( (*(int (__stdcall **)(int, signed int, char *))(*(int *)v2 + 36))(v2, 256, (char *)&this->field_1C + 1) == -2147024866 )
    {
      if ( !(*(int (__stdcall **)(int))(*(int *)v1->field_8 + 28))(v1->field_8) )
      {
        v5 = v1->field_8;
        v10 = 1;
        v9 = (const char *)79;
        v8 = (int)"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp";
        v6 = (*(int (__stdcall **)(int, signed int, char *))(*(int *)v5 + 36))(v5, 256, v4);
        CheckHRESULT((CheckHRESULT_stru0 *)&v13, v6, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp", 79, 1u);
      }
    }
    result = 1;
  }
  else
  {
    MessageBoxW(nullptr, L"Invalid Device pointer, bailing out of update_data()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp:72", 0);
    result = 0;
  }
  return result;
}

//----- (0043B96E) --------------------------------------------------------
char __thiscall DirectInputKeyboard::set_acquire(DirectInputKeyboard *this, int *a2)
{
  int v2; // eax@1
  char result; // al@2
  int v4; // ecx@3
  std::string v5; // [sp-18h] [bp-1Ch]@2
  const char *v6; // [sp-8h] [bp-Ch]@2
  int v7; // [sp-4h] [bp-8h]@2
  DirectInputKeyboard *v8; // [sp+0h] [bp-4h]@1

  v8 = this;
  v2 = this->field_8;
  if ( v2 )
  {
    v4 = *(int *)v2;
    v7 = v2;
    if ( (char)a2 )
      (*(void (__stdcall **)(int))(v4 + 28))(v7);
    else
      (*(void (__stdcall **)(int))(v4 + 32))(v7);
    result = 1;
  }
  else
  {
    MessageBoxW(nullptr, L"Invalid Device pointer, bailing out of set_acquire()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputKeyboard.cpp:89", 0);
    result = 0;
  }
  return result;
}

//----- (0043B9B9) --------------------------------------------------------
signed int __stdcall DirectInputKeyboard_enumerator_43B9B9(int a1, int a2)
{
  signed int result; // eax@2

  if ( *(char *)(a1 + 36) & 3 )
  {
    *(int *)(a2 + 12) = *(int *)(a1 + 4);
    *(int *)(a2 + 16) = *(int *)(a1 + 8);
    *(int *)(a2 + 20) = *(int *)(a1 + 12);
    *(int *)(a2 + 24) = *(int *)(a1 + 16);
    *(char *)(a2 + 28) = 1;
    result = 0;
  }
  else
  {
    result = 1;
  }
  return result;
}
// 43B9B9: using guessed type int __stdcall DirectInputKeyboard_enumerator_43B9B9(int, int);
*/