diff Mouse.cpp @ 0:9c0607679772

init
author Ritor1
date Sat, 12 Jan 2013 09:45:18 +0600
parents
children ee11772d0ad2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Mouse.cpp	Sat Jan 12 09:45:18 2013 +0600
@@ -0,0 +1,2044 @@
+#include "OSAPI.h"
+
+#include "Mouse.h"
+#include "Items.h"
+#include "Party.h"
+#include "LOD.h"
+#include "Game.h"
+#include "Texture.h"
+
+
+
+
+
+
+
+Mouse *pMouse;
+AsyncMouse *pAsyncMouse;
+
+
+
+
+
+//----- (00469860) --------------------------------------------------------
+void Mouse::GetClickPos(unsigned int *pX, unsigned int *pY)
+{
+  unsigned int v3; // eax@2
+
+  if (pAsyncMouse)
+  {
+    *pX = *((int *)pAsyncMouse + 6);
+    v3 = *((int *)pAsyncMouse + 7);
+  }
+  else
+  {
+    *pX = this->uMouseClickX;
+    v3 = this->uMouseClickY;
+  }
+  *pY = v3;
+}
+
+//----- (004698A6) --------------------------------------------------------
+void Mouse::RemoveHoldingItem()
+{
+  pParty->pPickedItem.Reset();
+  if (strcmpi(pCurrentCursorName, "MICON2"))
+    SetCursorBitmap("MICON1");
+}
+
+//----- (004698D8) --------------------------------------------------------
+void Mouse::SetCursorBitmapFromItemID(unsigned int uItemID)
+{
+  pMouse->SetCursorBitmap(pItemsTable->pItems[uItemID].pIconName);
+}
+
+//----- (004698F6) --------------------------------------------------------
+void Mouse::SetCurrentCursorBitmap()
+{
+  SetCursorBitmap(pCurrentCursorName);
+}
+
+//----- (00469903) --------------------------------------------------------
+void Mouse::SetCursorBitmap(const char *pName)
+{
+  Mouse *v2; // esi@1
+  HCURSOR v3; // eax@10
+  int v4; // ecx@10
+  double v5; // st7@11
+  float v6; // ST04_4@12
+  LONG v7; // eax@14
+  LONG v8; // eax@17
+  unsigned int v9; // eax@21
+  float v10; // [sp+4h] [bp-18h]@11
+  struct tagPOINT Point; // [sp+14h] [bp-8h]@20
+
+  v2 = this;
+  if ( !this->bInitialized || !pName )
+    return;
+  if ( _strcmpi("MICON2", pName) )
+    pGame->uFlags2 &= 0xFFFFFFEFu;
+  else
+    pGame->uFlags2 |= 0x10u;
+  if ( _strcmpi(v2->pCurrentCursorName, pName) )
+    strcpy(v2->pCurrentCursorName, pName);
+  ClearCursor();
+  if ( _strnicmp(pName, "MICON1", 5u) )
+  {
+    v9 = pIcons_LOD->LoadTexture(pName, TEXTURE_16BIT_PALETTE);
+    v2->uCursorTextureID = v9;
+    v2->uCursorTextureID_2 = v9;
+    v2->AllocCursorSystemMem();
+    v2->field_C = 0;
+    v2->field_14 = 1;
+    v2->bActive = 1;
+    if ( !areWeLoadingTexture )
+    {
+      if (uCursorTextureID != -1)
+        pIcons_LOD->pTextures[uCursorTextureID].Release();
+      pIcons_LOD->_40F9C5();
+    }
+    return;
+  }
+  v2->bActive = 0;
+  v2->field_C = 1;
+  if ( !strcmp(pName, "MICON1") )
+  {
+    v3 = LoadCursorA(GetModuleHandleW(nullptr), "Arrow");
+    SetClassLongA(hWnd, GCL_HCURSOR, (LONG)v3);
+    v4 = (int)pAsyncMouse;
+    if (pAsyncMouse)
+    {
+      v10 = 0.0;
+      v5 = 0.0;
+LABEL_12:
+      v6 = v5;
+      pAsyncMouse->SetHotspot(v6, v10);
+      goto LABEL_18;
+    }
+    goto LABEL_20;
+  }
+  if ( !strcmp(pName, "MICON2") )
+  {
+    v7 = (LONG)LoadCursorA(GetModuleHandleW(nullptr), "Target");
+    SetClassLongA(hWnd, -12, v7);
+    v4 = (int)pAsyncMouse;
+    if (pAsyncMouse)
+    {
+      v10 = 14.0;
+      v5 = 14.0;
+      goto LABEL_12;
+    }
+LABEL_20:
+    GetCursorPos(&Point);
+    SetCursorPos(Point.x, Point.y);
+    return;
+  }
+  if ( !strcmp(pName, "MICON3") )
+  {
+    v8 = (LONG)LoadCursorA(0, (LPCSTR)IDC_WAIT);
+    SetClassLongA(hWnd, -12, v8);
+  }
+LABEL_18:
+  if ( !pAsyncMouse || (pAsyncMouse->LoadCursor(pName), !pAsyncMouse) )
+    goto LABEL_20;
+}
+// 506128: using guessed type int areWeLoadingTexture;
+
+//----- (00469AE4) --------------------------------------------------------
+LONG Mouse::_469AE4()
+{
+  Mouse *v1; // esi@1
+  LONG v2; // ecx@2
+  LONG result; // eax@2
+  struct tagPOINT Point; // [sp+Ch] [bp-8h]@2
+
+  v1 = this;
+  this->field_8 = 1;
+  if (pAsyncMouse)
+  {
+    v2 = *((int *)pAsyncMouse + 6);
+    Point.x = *((int *)pAsyncMouse + 6);
+    result = *((int *)pAsyncMouse + 7);
+  }
+  else
+  {
+    GetCursorPos(&Point);
+    if ( pRenderer->bWindowMode )
+      ScreenToClient(hWnd, &Point);
+    result = Point.y;
+    v2 = Point.x;
+  }
+  v1->uMouseClickX = v2;
+  v1->uMouseClickY = result;
+  if ( pRenderer->bWindowMode )
+    goto LABEL_16;
+  if (pAsyncMouse)
+    goto LABEL_24;
+  if ( v2 < 0 )
+    v2 = 0;
+  if ( result < 0 )
+    result = 0;
+  if ( v2 > 639 )
+    v2 = 639;
+  if ( result > 479 )
+  {
+    result = 479;
+LABEL_16:
+    if (pAsyncMouse)
+      goto LABEL_24;
+    if ( pRenderer->bWindowMode && (v2 < 0 || result < 0 || v2 > 639 || result > 479) )
+      goto LABEL_23;
+  }
+  if ( v1->field_C )
+LABEL_23:
+    v1->bActive = 0;
+LABEL_24:
+  v1->field_8 = 0;
+  return result;
+}
+
+//----- (00469BA3) --------------------------------------------------------
+void Mouse::ClearCursor()
+{
+  Mouse *v1; // esi@1
+  void *v2; // eax@1
+  void **v3; // esi@5
+
+  v1 = this;
+  v2 = this->pCursorBitmap_sysmem;
+  this->bActive = 0;
+  if ( v2 )
+  {
+    free(v2);
+    v1->pCursorBitmap_sysmem = 0;
+  }
+  if ( v1->pCursorBitmap2_sysmem )
+  {
+    free(v1->pCursorBitmap2_sysmem);
+    v1->pCursorBitmap2_sysmem = 0;
+  }
+  v3 = &v1->ptr_90;
+  if ( *v3 )
+    free(*v3);
+  *v3 = 0;
+}
+
+//----- (00469BE6) --------------------------------------------------------
+void Mouse::AllocCursorSystemMem()
+{
+  bActive = 0;
+  if (!pCursorBitmap_sysmem)
+    pCursorBitmap_sysmem = (unsigned __int16 *)DoAllocCursorMem();
+  if (!pCursorBitmap2_sysmem)
+    pCursorBitmap2_sysmem = (unsigned __int8 *)DoAllocCursorMem();
+}
+
+//----- (00469C0D) --------------------------------------------------------
+void *Mouse::DoAllocCursorMem()
+{
+  return malloc(4 * (this->uCursorTextureID != -1 ? pIcons_LOD->pTextures[this->uCursorTextureID].uTextureWidth : 24)
+                  * (this->uCursorTextureID != -1 ? pIcons_LOD->pTextures[this->uCursorTextureID].uTextureHeight : 26));
+}
+
+//----- (00469C39) --------------------------------------------------------
+POINT *Mouse::GetCursorPos(POINT *a2)
+{
+  void *v2; // edx@1
+  POINT *result; // eax@1
+  unsigned int v4; // ecx@2
+  unsigned int v5; // edx@3
+
+  v2 = pAsyncMouse;
+  result = a2;
+  if (pAsyncMouse)
+  {
+    a2->x = *((int *)pAsyncMouse + 6);
+    v4 = *((int *)v2 + 7);
+  }
+  else
+  {
+    v5 = this->uMouseClickX;
+    v4 = this->uMouseClickY;
+    a2->x = v5;
+  }
+  a2->y = v4;
+  return result;
+}
+
+//----- (00469C65) --------------------------------------------------------
+void Mouse::Initialize(HWND hWnd)
+{
+  this->hWnd = hWnd;
+  this->bActive = 0;
+  this->bInitialized = 1;
+  this->pCursorBitmapPos.x = 0;
+  this->pCursorBitmapPos.y = 0;
+  this->uMouseClickX = 0;
+  this->uMouseClickY = 0;
+  this->pCursorBitmap_sysmem = 0;
+  this->field_34 = 0;
+  this->pCursorBitmap2_sysmem = 0;
+
+  SetCursorBitmap("MICON3");
+  SetCursorBitmap("MICON2");
+  SetCursorBitmap("MICON1");
+}
+
+//----- (00469CC2) --------------------------------------------------------
+void Mouse::Deactivate()
+{
+  if (bInitialized)
+    bActive = false;
+}
+
+//----- (00469CCD) --------------------------------------------------------
+void Mouse::DrawCursor()
+{
+  Mouse *v1; // esi@1
+  char v11; // zf@6
+  signed int v3; // eax@6
+  signed int v4; // ecx@6
+  Vec4_int_ *v5; // edx@21
+  int v6; // edi@21
+  int v7; // ebx@21
+  int v8; // eax@29
+  unsigned int v9; // eax@31
+
+  v1 = this;
+  if ( this->bInitialized )
+  {
+    if ( !this->field_8 && this->bActive && !this->field_C )
+      pMouse->_469AE4();
+    v11 = v1->field_C == 0;
+    v3 = v1->uMouseClickX;
+    v4 = v1->uMouseClickY;
+    v1->field_F4 = 1;
+    if ( !v11 )
+      goto LABEL_12;
+    if ( pRenderer->bWindowMode )
+    {
+      if ( v3 < 0 || v4 < 0 || v3 > 639 || v4 > 479 )
+      {
+LABEL_12:
+        v1->field_F4 = 0;
+        return;
+      }
+    }
+    else
+    {
+      if ( v3 < 0 )
+        v3 = 0;
+      if ( v4 < 0 )
+        v4 = 0;
+      if ( v3 > 639 )
+        v3 = 639;
+      if ( v4 > 479 )
+        v4 = 479;
+    }
+    v5 = &v1->pCursorBitmapRect;
+    v6 = v3 + v1->uCursorBitmapPitch;
+    v7 = v4 + v1->field_5C[0];
+    v1->pCursorBitmapRect.y = v4;
+    v1->pCursorBitmapRect.x = v3;
+    v1->pCursorBitmapRect.z = v6;
+    v1->pCursorBitmapRect.w = v7;
+    if ( v3 < 0 )
+      v5->x = 0;
+    if ( v4 < 0 )
+      v1->pCursorBitmapRect.y = 0;
+    if ( v6 > 640 )
+      v1->pCursorBitmapRect.z = 640;
+    if ( v7 > 480 )
+      v1->pCursorBitmapRect.w = 480;
+    v8 = v1->pCursorBitmapRect.z;
+    v1->bActive = 0;
+    v1->uCursorBitmapWidth = v8 - v5->x;
+    v11 = v1->field_14 == 0;
+    v1->uCursorBitmapHeight = v1->pCursorBitmapRect.w - v1->pCursorBitmapRect.y;
+    if ( !v11 )
+    {
+      if ( pMouse->ptr_90 )
+        v9 = 2 * pMouse->uCursorBitmapPitch;
+      else
+        v9 = 0;
+      pRenderer->_4A6DF5(
+        v1->pCursorBitmap_sysmem,
+        v9,
+        &v1->pCursorBitmapPos,
+        pRenderer->pTargetSurface,
+        pRenderer->uTargetSurfacePitch,
+        &v1->pCursorBitmapRect);
+      v1->field_14 = 0;
+    }
+  }
+}
+
+//----- (00469E1C) --------------------------------------------------------
+void Mouse::_469E1C()
+{
+  bActive = true;
+}
+
+//----- (00469E24) --------------------------------------------------------
+void Mouse::_469E24()
+{
+  if (pCursorBitmap3_sysmembits_16bit)
+  {
+    free(pCursorBitmap3_sysmembits_16bit);
+    pCursorBitmap3_sysmembits_16bit = 0;
+  }
+}
+
+//----- (00469E3B) --------------------------------------------------------
+void Mouse::DrawCursorToTarget()
+{
+  if (!pCursorBitmap3_sysmembits_16bit)
+    return;
+
+  auto pSrc = pCursorBitmap3_sysmembits_16bit;
+  for (uint y = field_44; y < field_4C; ++y)
+    for (uint x = field_40; x < field_48; ++x)
+      pRenderer->pTargetSurface[y * pRenderer->uTargetSurfacePitch + x] = *pSrc++;
+}
+
+//----- (00469EA4) --------------------------------------------------------
+void Mouse::_469EA4()
+{
+  Mouse *v1; // esi@1
+  unsigned int v2; // eax@2
+  Texture *v3; // edi@2
+  unsigned int v4; // ecx@3
+  unsigned int v5; // eax@3
+  unsigned int v6; // ebx@5
+  int v7; // ecx@15
+  int v8; // ecx@25
+  int v9; // ebx@26
+  unsigned int v10; // eax@26
+  int v11; // edx@27
+  unsigned __int16 *v12; // edx@29
+  unsigned __int16 *v13; // ebx@29
+  unsigned int a2; // [sp+Ch] [bp-1Ch]@5
+  unsigned int v15; // [sp+10h] [bp-18h]@5
+  unsigned int v16; // [sp+14h] [bp-14h]@25
+  unsigned __int16 *v17; // [sp+18h] [bp-10h]@25
+  int v18; // [sp+1Ch] [bp-Ch]@27
+  int v19; // [sp+20h] [bp-8h]@15
+  unsigned __int16 *v20; // [sp+20h] [bp-8h]@28
+  int v21; // [sp+24h] [bp-4h]@12
+  unsigned __int16 *v22; // [sp+24h] [bp-4h]@25
+
+  v1 = this;
+  if ( pParty->pPickedItem.uItemID )
+  {
+    v2 = pIcons_LOD->LoadTexture(
+           pItemsTable->pItems[pParty->pPickedItem.uItemID].pIconName,
+           TEXTURE_16BIT_PALETTE);
+    v3 = (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0);
+    if (pAsyncMouse)
+    {
+      v4 = *((int *)pAsyncMouse + 6);
+      v5 = *((int *)pAsyncMouse + 7);
+    }
+    else
+    {
+      v4 = pMouse->uMouseClickX;
+      v5 = pMouse->uMouseClickY;
+    }
+    v6 = v5;
+    a2 = v4;
+    v15 = v5;
+    if ( (signed int)v4 <= 639 && (signed int)v5 <= 479 )
+    {
+      if ( (v4 & 0x80000000u) != 0 )
+        a2 = 0;
+      if ( (v5 & 0x80000000u) != 0 )
+      {
+        v6 = 0;
+        v15 = 0;
+      }
+      if ( (signed int)(v3->uTextureWidth + a2) <= 640 )
+        v21 = v3->uTextureWidth;
+      else
+        v21 = 640 - a2;
+      if ( (signed int)(v3->uTextureHeight + v6) <= 480 )
+      {
+        v19 = v3->uTextureHeight;
+        v7 = v3->uTextureHeight;
+      }
+      else
+      {
+        v7 = 480 - v6;
+        v19 = 480 - v6;
+      }
+      if ( !v1->pCursorBitmap3_sysmembits_16bit
+        || a2 != v1->field_40
+        || v6 != v1->field_44
+        || a2 + v21 != v1->field_48
+        || v6 + v7 != v1->field_4C )
+      {
+        if ( v1->pCursorBitmap3_sysmembits_16bit )
+          free(v1->pCursorBitmap3_sysmembits_16bit);
+        v1->pCursorBitmap3_sysmembits_16bit = (unsigned __int16 *)operator new(2 * v3->uTextureHeight
+                                                                                 * v3->uTextureWidth);
+        v1->field_40 = a2;
+        v1->field_48 = a2 + v21;
+        v1->field_44 = v6;
+        v1->field_4C = v6 + v19;
+      }
+      v8 = v1->field_44;
+      v22 = v1->pCursorBitmap3_sysmembits_16bit;
+      v17 = pRenderer->pTargetSurface;
+      v16 = pRenderer->uTargetSurfacePitch;
+      if ( v8 < v1->field_4C )
+      {
+        v9 = v1->field_48;
+        v10 = pRenderer->uTargetSurfacePitch * v8;
+        do
+        {
+          v11 = v1->field_40;
+          v18 = v1->field_40;
+          if ( v11 < v9 )
+          {
+            v20 = &v17[v10 + v11];
+            do
+            {
+              v12 = v20;
+              v13 = v22;
+              ++v18;
+              ++v20;
+              ++v22;
+              *v13 = *v12;
+              v9 = v1->field_48;
+            }
+            while ( v18 < v9 );
+          }
+          v10 += v16;
+          ++v8;
+        }
+        while ( v8 < v1->field_4C );
+        v6 = v15;
+      }
+      if ( pParty->pPickedItem.uAttributes & 2 )
+      {
+        pRenderer->_4A6776(a2, v6, v3);
+      }
+      else
+      {
+        if ( pParty->pPickedItem.uAttributes & 1 )
+          pRenderer->DrawTextureTransparent(a2, v6, v3);
+        else
+          pRenderer->DrawTransparentGreenShade(a2, v6, v3);
+      }
+    }
+  }
+  else
+  {
+    if ( this->pCursorBitmap3_sysmembits_16bit )
+    {
+      free(this->pCursorBitmap3_sysmembits_16bit);
+      v1->pCursorBitmap3_sysmembits_16bit = 0;
+    }
+  }
+}
+
+//----- (0046A080) --------------------------------------------------------
+void Mouse::Activate(int bActive)
+{
+  bActive = bActive;
+}
+
+//----- (0046A08A) --------------------------------------------------------
+void Mouse::SetMouseClick(int x, int y)
+{
+  uMouseClickX = x;
+  uMouseClickY = y;
+}
+
+
+//----- (00409E3D) --------------------------------------------------------
+void AsyncMouse::_409E3D(char a2)
+{
+  if ( *((unsigned char *)this + 128) & 1 )
+    *((unsigned char *)this + 103) = 1;
+  else
+    *((unsigned char *)this + 103) = 0;
+  if ( a2 )
+    *((unsigned int *)this + 32) |= 1u;
+  else
+    *((unsigned int *)this + 32) &= 0xFFFFFFFEu;
+}
+
+//----- (00465C2C) --------------------------------------------------------
+void AsyncMouse::Release()
+{
+  if (pAsyncMouse)
+  {
+    pAsyncMouse->Suspend();
+    if (pAsyncMouse)
+      (**(void (__stdcall ***)(int))pAsyncMouse)(1);
+  }
+  pAsyncMouse = 0;
+}
+
+
+
+
+//----- (0046ACA9) --------------------------------------------------------
+AsyncMouse::AsyncMouse(IDirectDrawSurface *a2)
+{
+  IDirectDrawSurface *v2; // eax@1
+  void *v3; // esi@1
+  char *v4; // edi@1
+  double v5; // ST14_8@3
+  double v6; // ST14_8@3
+
+  v2 = a2;
+  v3 = this;
+  *((int *)this + 16) = -1;
+  *((int *)this + 3) = (int)v2;
+  LOBYTE(v2) = BYTE3(a2);
+  v4 = (char *)this + 104;
+  *((int *)this + 1) = 0;
+  *((char *)this + 20) = 0;
+  *((int *)this + 17) = 0;
+  *((int *)this + 18) = 0;
+  *((char *)this + 88) = 1;
+  *((char *)this + 91) = 0;
+  *((char *)this + 93) = 0;
+  *((char *)this + 94) = 0;
+  *((char *)this + 95) = 0;
+  *((char *)this + 96) = 0;
+  *((char *)this + 97) = 0;
+  *((char *)this + 98) = 0;
+  *((char *)this + 99) = 0;
+  *((char *)this + 100) = 0;
+  *((char *)this + 101) = 0;
+  *((char *)this + 102) = 0;
+  *((char *)this + 104) = (char)v2;
+  *((int *)this + 27) = (int)AsyncMouse::unk_46BD09(0, 0);
+  *((int *)v4 + 2) = 0;
+  *((char *)v3 + 116) = BYTE3(a2);
+  *((int *)v3 + 30) = (int)AsyncMouse::unk_46BD09(0, 0);
+  *((int *)v3 + 31) = 0;
+  *((int *)v3 + 32) = 0;
+  *((int *)v3 + 33) = 0;
+  *(int *)v3 = 5080880;
+  if ( !Initialize(this) )
+  {
+    MessageBoxW(nullptr, L"Could not initialize CMouseAsync object", nullptr, 0);
+  }
+  *((int *)v3 + 12) = 0;
+  *((int *)v3 + 13) = 0;
+  *((int *)v3 + 14) = 0;
+  *((int *)v3 + 15) = 0;
+  v5 = (float)0.0 + 6.7553994e15;
+  *((int *)v3 + 10) = LODWORD(v5);
+  v6 = (float)0.0 + 6.7553994e15;
+  a2 = (IDirectDrawSurface *)LODWORD(v6);
+  *((int *)v3 + 32) |= 1u;
+  *((int *)v3 + 11) = LODWORD(v6);
+  *((char *)v3 + 103) = 1;
+}
+// 4DBD94: using guessed type int dword_4DBD94;
+
+
+
+//----- (0046ADE2) --------------------------------------------------------
+AsyncMouse::~AsyncMouse()
+{
+  void *v1; // esi@1
+  char *v2; // edi@1
+  int v3; // ecx@1
+
+  v1 = this;
+  //*(int *)this = AsyncMouse_pvdtor;
+  v2 = (char *)this + 132;
+  v3 = *((int *)this + 33);
+  if ( v3 )
+    (**(void (__stdcall ***)(int))v3)(1);
+  *(int *)v2 = 0;
+  TerminateThread(*((HANDLE *)v1 + 4), 0xFAu);
+  SetWindowPos(hWnd, (HWND)0xFFFFFFFE, uWindowX, uWindowY, 640, 480, 0);
+  //AsyncMouse::dtor_sub_46BC73((int)((char *)v1 + 116));
+  //AsyncMouse::dtor_sub_46BC73((int)((char *)v1 + 104));
+}
+// 4D8730: using guessed type int (__stdcall *AsyncMouse_pvdtor[2])(char);
+
+
+
+
+
+
+
+
+
+
+
+
+
+//----- (0046AE6E) --------------------------------------------------------
+char AsyncMouse::Initialize(LPVOID lpParameter)
+{
+  void *v1; // esi@1
+  char result; // al@2
+
+  v1 = lpParameter;
+  if ( LoadCursorImage() && _46B072() )
+    result = CreateDisrectInputMouse() != 0;
+  else
+    result = 0;
+  return result;
+}
+
+//----- (0046AE97) --------------------------------------------------------
+char AsyncMouse::LoadCursor(const char *pContainer)
+{
+  __debugbreak();
+  return 0;
+  /*
+  void *v2; // esi@1
+  int v3; // eax@1
+  HRESULT v4; // eax@1
+  char result; // al@3
+  HRESULT a2; // [sp+8h] [bp-B0h]@1
+  int v7; // [sp+58h] [bp-60h]@1
+  char v9; // [sp+B4h] [bp-4h]@1
+
+  v2 = this;
+  EnterCriticalSection(&pGame->pThreadWardInstance->cs2);
+  v3 = *((int *)v2 + 1);
+  a2 = 100;
+  v7 = 0;
+  v4 = (*(int (__stdcall **)(int, int, int, int, signed int, HRESULT *))(*(int *)v3 + 20))(
+         v3,
+         0,
+         0,
+         0,
+         1024,
+         &a2);
+  ErrHR(v4, "DirectInput", __FUNCTION__, __FILE__, __LINE__);
+  
+  Texture thisa; // [sp+6Ch] [bp-4Ch]@1
+  //Texture::Texture(&thisa);
+
+  if ( pIcons_LOD->LoadTextureFromLOD(&thisa, pContainer, TEXTURE_16BIT_PALETTE) != -1
+    && DrawCursor(&thisa, *((IDirectDrawSurface4 **)v2 + 1), 0) )
+  {
+    thisa.Release();
+    LeaveCriticalSection(&pGame->pThreadWardInstance->cs2);
+    result = 1;
+  }
+  else
+  {
+    result = 0;
+  }
+  return result;*/
+}
+
+//----- (0046AF50) --------------------------------------------------------
+char AsyncMouse::LoadCursorImage()
+{
+  void *v1; // ebx@1
+  int v2; // eax@2
+  int v3; // esi@4
+  char result; // al@5
+  //const char *v5; // eax@6
+  //std::string v6; // [sp-18h] [bp-12Ch]@9
+  const char *v7; // [sp-8h] [bp-11Ch]@9
+  int v8; // [sp-4h] [bp-118h]@9
+  DDSURFACEDESC2 Dst; // [sp+Ch] [bp-108h]@1
+  int v10; // [sp+88h] [bp-8Ch]@2
+  int v11; // [sp+8Ch] [bp-88h]@2
+  int v12; // [sp+90h] [bp-84h]@2
+  int v13; // [sp+94h] [bp-80h]@2
+  char v14; // [sp+D0h] [bp-44h]@2
+  int v15; // [sp+F0h] [bp-24h]@2
+  int v16; // [sp+104h] [bp-10h]@4
+  int v17; // [sp+108h] [bp-Ch]@4
+  std::string *v18; // [sp+10Ch] [bp-8h]@9
+  int a3; // [sp+113h] [bp-1h]@9
+
+  v1 = this;
+  memset(&Dst, 0, 0x7Cu);
+  Dst.dwSize = 124;
+  if ( pRenderer->pDirectDraw4->GetDisplayMode(&Dst)
+    || (memset(&v10, 0, 0x7Cu),
+        v10 = 124,
+        v11 = 4103,
+        v15 = 2112,
+        v12 = 32,
+        v13 = 32,
+        v2 = *((int *)v1 + 3),
+        memcpy(&v14, &Dst.ddpfPixelFormat, 0x20u),
+        (*(int (__stdcall **)(int, int *, char *, int))(**(int **)v2 + 24))(
+          *(int *)v2,
+          &v10,
+          (char *)v1 + 4,
+          0))
+    || (*(int (__stdcall **)(int, int *, char *, int))(***((int ***)v1 + 3) + 24))(
+         **((int **)v1 + 3),
+         &v10,
+         (char *)v1 + 8,
+         0)
+    || (v3 = *((int *)v1 + 1),
+        v16 = 0,
+        v17 = 0,
+        (*(int (__stdcall **)(int, signed int, int *))(*(int *)v3 + 116))(v3, 8, &v16)) )
+  {
+    result = 0;
+    return false;
+  }
+  else
+  {
+    if ( !LoadCursor("micon1") )
+    {
+      MessageBoxW(nullptr, L"Could not load async mouse cursor image", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:182", 0);
+    }
+    result = 1;
+    return true;
+  }
+  return result;
+}
+// 4D86F0: using guessed type int dword_4D86F0;
+
+//----- (0046B072) --------------------------------------------------------
+char AsyncMouse::_46B072()
+{
+  DWORD v1; // esi@1
+  HANDLE v2; // eax@1
+  char result; // al@2
+  DWORD ThreadId; // [sp+0h] [bp-4h]@1
+
+  ThreadId = (DWORD)this;
+  v1 = (DWORD)this;
+  v2 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)AsyncMouseThread, this, 4u, &ThreadId);
+  *(int *)(v1 + 16) = (int)v2;
+  if ( v2 )
+    result = SetThreadPriority(v2, 15) != 0;
+  else
+    result = 0;
+  return result;
+}
+
+//----- (0046B0A9) --------------------------------------------------------
+char AsyncMouse::CreateDisrectInputMouse()
+{
+  __debugbreak();
+  /*
+  void *v1; // esi@1
+  DirectInputMouse *v2; // ecx@1
+  DirectInputMouse *v3; // eax@2
+
+  v1 = this;
+  v2 = (DirectInputMouse *)operator new(0x2Cu);
+  if ( v2 )
+    v3 = DirectInputMouse::DirectInputMouse(v2);
+  else
+    v3 = 0;
+  *((int *)v1 + 33) = v3;
+  return v3 != 0;*/
+  return 0;
+}
+
+//----- (0046B0ED) --------------------------------------------------------
+int AsyncMouse::_46B0ED()
+{
+  __debugbreak();
+  /*
+  int v1; // esi@1
+  int v2; // ecx@1
+  int result; // eax@2
+
+  v1 = this + 132;
+  v2 = *(int *)(this + 132);
+  if ( v2 )
+    result = (**(int (__stdcall ***)(int))v2)(1);
+  *(int *)v1 = 0;
+  return result;*/
+  return 0;
+}
+// 46B0ED: using guessed type int __thiscall AsyncMouse__46B0ED(int);
+
+//----- (0046B105) --------------------------------------------------------
+void AsyncMouse::Resume()
+{
+  __debugbreak();
+  /*
+  void *v1; // esi@1
+
+  v1 = this;
+  EnterCriticalSection(&pGame->pThreadWardInstance->cs3);
+  AsyncMouse::CreateDisrectInputMouse(v1);
+  AsyncMouse::Clip();
+  ResumeThread(*((HANDLE *)v1 + 4));
+  *((char *)v1 + 88) = 0;
+  LeaveCriticalSection(&pGame->pThreadWardInstance->cs3);*/
+}
+
+//----- (0046B14F) --------------------------------------------------------
+void AsyncMouse::Suspend()
+{
+  void *v1; // esi@1
+  Vis *v2; // eax@3
+  std::string v3; // [sp-18h] [bp-24h]@2
+  const char *v4; // [sp-8h] [bp-14h]@2
+  int v5; // [sp-4h] [bp-10h]@2
+  std::string *v6; // [sp+4h] [bp-8h]@2
+  int a3; // [sp+Bh] [bp-1h]@2
+
+  v1 = this;
+  if ( *((int *)this + 33) )
+  {
+    v2 = pGame->pVisInstance;
+    if ( v2 )
+      v2->stru1.uNumPointers = 0;
+    EnterCriticalSection(&pGame->pThreadWardInstance->cs3);
+    SuspendThread(*((HANDLE *)v1 + 4));
+    _46B0ED();
+    LeaveCriticalSection(&pGame->pThreadWardInstance->cs3);
+  }
+  else
+  {
+      MessageBoxW(nullptr, L"DI_Mouse pointer invalid; bailing out from suspend()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:233", 0);
+  }
+}
+// 46B0ED: using guessed type int __thiscall AsyncMouse__46B0ED(int);
+
+//----- (0046B1DD) --------------------------------------------------------
+char AsyncMouse::_46B1DD()
+{
+  *((char *)this + 20) = 1;
+  Sleep(118);
+  return 1;
+}
+
+//----- (0046B1EC) --------------------------------------------------------
+bool AsyncMouse::DrawCursor(Texture *a1, IDirectDrawSurface4 *a2, int a3)
+{
+  __debugbreak();
+  /*
+  bool result; // eax@1
+  unsigned __int16 *v5; // ebx@2
+  unsigned __int8 *v6; // edx@2
+  int v7; // esi@2
+  int v8; // ecx@2
+  LPVOID v9; // edi@2
+  int v10; // ecx@5
+  DDSURFACEDESC2 Dst; // [sp+0h] [bp-84h]@1
+  __int32 v12; // [sp+7Ch] [bp-8h]@3
+  int v13; // [sp+80h] [bp-4h]@3
+
+  Dst.dwSize = 124;
+  result = pRenderer->LockSurface_DDraw4(a2, &Dst, 1u);
+  if ( result )
+  {
+    v5 = a1->pPalette16;
+    v6 = a1->pLevelOfDetail0;
+    v7 = a1->uTextureWidth;
+    v8 = a1->uTextureHeight;
+    v9 = Dst.lpSurface;
+    if ( v8 > 0 )
+    {
+      v12 = 2 * (Dst.lPitch / 2 - v7);
+      v13 = v8;
+      do
+      {
+        if ( v7 > 0 )
+        {
+          v10 = v7;
+          do
+          {
+            if ( v5[*v6] )
+              *(short *)v9 = v5[*v6];
+            v9 = (char *)v9 + 2;
+            ++v6;
+            --v10;
+          }
+          while ( v10 );
+        }
+        v9 = (char *)v9 + v12;
+        --v13;
+      }
+      while ( v13 );
+    }
+    result = a2->Unlock(
+               v6,
+               a2,
+               a3);
+  }
+  LOBYTE(result) = 1;
+  return result;*/
+  return 0;
+}
+
+//----- (0046B289) --------------------------------------------------------
+bool AsyncMouse::_46B289(int a2, char a3)
+{
+  char v3; // dl@1
+  bool result; // eax@33
+  char v5; // [sp+2h] [bp-2h]@1
+  char v6; // [sp+3h] [bp-1h]@1
+
+  v3 = *((char *)this + 93);
+  v6 = *((char *)this + 94);
+  v5 = *((char *)this + 95);
+  if ( a3 & 1 )
+  {
+    *((char *)this + 93) = 1;
+  }
+  else
+  {
+    if ( v3 )
+      *((char *)this + 99) = 1;
+    else
+      *((char *)this + 99) = 0;
+    *((char *)this + 93) = 0;
+  }
+  if ( a3 & 2 )
+  {
+    *((char *)this + 94) = 1;
+  }
+  else
+  {
+    if ( v6 )
+      *((char *)this + 100) = 1;
+    else
+      *((char *)this + 100) = 0;
+    *((char *)this + 94) = 0;
+  }
+  if ( a3 & 4 )
+  {
+    *((char *)this + 95) = 1;
+  }
+  else
+  {
+    if ( v5 )
+      *((char *)this + 101) = 1;
+    else
+      *((char *)this + 101) = 0;
+    *((char *)this + 95) = 0;
+  }
+  *((char *)this + 96) = v3 != *((char *)this + 93);
+  *((char *)this + 97) = v6 != *((char *)this + 94);
+  *((char *)this + 98) = v5 != *((char *)this + 95);
+  if ( *((char *)this + 99) && *((char *)this + 96) || *((char *)this + 100) && *((char *)this + 97) )
+    *((char *)this + 102) = 1;
+  LOBYTE(result) = 1;
+  return result;
+}
+
+//----- (0046B342) --------------------------------------------------------
+void AsyncMouse::SetHotspot(float hotspotx, float hotspoty)
+{
+  double v3; // ST00_8@1
+  double v4; // ST00_8@1
+
+  v3 = hotspotx + 6.7553994e15;
+  *(int *)(this + 40) = LODWORD(v3);
+  v4 = hotspoty + 6.7553994e15;
+  *(int *)(this + 44) = LODWORD(v4);
+}
+
+//----- (0046B37C) --------------------------------------------------------
+int AsyncMouse::UpdateData(int a2)
+{
+  __debugbreak();
+  /*
+  void *v2; // edi@1
+  int result; // eax@2
+  int v4; // eax@3
+  int v5; // esi@3
+  std::string v6; // [sp-18h] [bp-28h]@2
+  const char *v7; // [sp-8h] [bp-18h]@2
+  int v8; // [sp-4h] [bp-14h]@2
+  std::string *v9; // [sp+8h] [bp-8h]@2
+  int a3; // [sp+Fh] [bp-1h]@2
+
+  v2 = this;
+  if ( *((int *)this + 33) )
+  {
+    EnterCriticalSection(&pGame->pThreadWardInstance->cs3);
+    DirectInputMouse::_43BB89(*((DirectInputMouse **)v2 + 33));
+    v4 = *((int *)v2 + 33);
+    v5 = v4 + 32;
+    _46B289(v4 + 32, *(int *)(v4 + 40));
+    LeaveCriticalSection(&pGame->pThreadWardInstance->cs3);
+    result = a2;
+    *(int *)a2 = *(int *)v5;
+    *(int *)(a2 + 4) = *(int *)(v5 + 4);
+  }
+  else
+  {
+    MessageBoxW(nullptr, L"DI_Mouse pointer invalid bailing out from update_mouse_data()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:446", 0);
+    result = a2;
+    *(int *)a2 = 0;
+    *(int *)(a2 + 4) = 0;
+  }
+  return result;*/
+  return 0;
+}
+
+//----- (0046B420) --------------------------------------------------------
+char AsyncMouse::Thread()
+{
+  void *v1; // esi@1
+  char result; // al@2
+  int v3; // eax@3
+  int v4; // ecx@3
+  int v5; // eax@3
+  int v6; // ecx@3
+  int v7; // [sp+4h] [bp-8h]@3
+  int v8; // [sp+8h] [bp-4h]@3
+
+  v1 = this;
+  if ( *((char *)this + 20) )
+  {
+    result = 0;
+  }
+  else
+  {
+    UpdateData((int)&v7);
+    _46BA8D(v7, v8);
+    _46B958(v7 - *((int *)v1 + 10), v8 - *((int *)v1 + 11));
+    _46B492((int)&v7);
+    _46B5D5((int)&v7);
+    v3 = v7;
+    v4 = v8;
+    *((int *)v1 + 6) = v7;
+    v5 = v3 - *((int *)v1 + 10);
+    *((int *)v1 + 7) = v4;
+    v6 = v4 - *((int *)v1 + 11);
+    *((int *)v1 + 8) = v5;
+    result = 1;
+    *((int *)v1 + 9) = v6;
+  }
+  return result;
+}
+
+//----- (0046B492) --------------------------------------------------------
+void AsyncMouse::_46B492(int a2)
+{
+  __debugbreak();
+  /*
+  void *v2; // edi@1
+  int v3; // esi@3
+  int v4; // eax@5
+  int v5; // ecx@5
+  int v6; // eax@8
+  int v7; // ecx@8
+  int v8; // eax@11
+  int v9; // esi@11
+  int v10; // [sp+Ch] [bp-1Ch]@5
+  int v11; // [sp+10h] [bp-18h]@5
+  int v12; // [sp+14h] [bp-14h]@5
+  int v13; // [sp+18h] [bp-10h]@5
+  int v14; // [sp+24h] [bp-4h]@5
+
+  v2 = this;
+  EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
+  if ( *((int *)v2 + 28) > 0x80u )
+    _46BCAB((char *)v2 + 104);
+  v3 = a2;
+  if ( *((char *)v2 + 93) && *((char *)v2 + 96) )
+  {
+    v4 = *(int *)a2;
+    v5 = *(int *)(a2 + 4);
+    v13 = 1;
+    v10 = 5080884;
+    v11 = v4;
+    v12 = v5;
+    v14 = 0;
+    AsyncMouse::unk_46BCD2((char *)v2 + 104, (int)&a2, *((int *)v2 + 27), (int)&v10);
+    v14 = -1;
+  }
+  if ( *((char *)v2 + 94) && *((char *)v2 + 97) )
+  {
+    v6 = *(int *)v3;
+    v7 = *(int *)(v3 + 4);
+    v13 = 2;
+    v10 = 5080884;
+    v11 = v6;
+    v12 = v7;
+    v14 = 1;
+    AsyncMouse::unk_46BCD2((char *)v2 + 104, (int)&a2, *((int *)v2 + 27), (int)&v10);
+    v14 = -1;
+  }
+  if ( *((char *)v2 + 95) && *((char *)v2 + 98) )
+  {
+    v8 = *(int *)v3;
+    v9 = *(int *)(v3 + 4);
+    v13 = 4;
+    v10 = 5080884;
+    v11 = v8;
+    v12 = v9;
+    v14 = 2;
+    AsyncMouse::unk_46BCD2((char *)v2 + 104, (int)&a2, *((int *)v2 + 27), (int)&v10);
+  }
+  LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
+}
+
+//----- (0046B5D5) --------------------------------------------------------
+void AsyncMouse::_46B5D5(int a2)
+{
+  __debugbreak();
+  /*
+  void *v2; // esi@1
+  DWORD v3; // eax@3
+  char v4; // zf@3
+  int v5; // edi@3
+  int v6; // eax@6
+  int v7; // ecx@6
+  int v8; // eax@11
+  int v9; // ecx@11
+  int v10; // eax@16
+  int v11; // edi@16
+  int (__stdcall **v12)(char); // [sp+Ch] [bp-20h]@6
+  int v13; // [sp+10h] [bp-1Ch]@6
+  int v14; // [sp+14h] [bp-18h]@6
+  int v15; // [sp+18h] [bp-14h]@6
+  DWORD v16; // [sp+1Ch] [bp-10h]@3
+  int v17; // [sp+28h] [bp-4h]@6
+
+  v2 = this;
+  EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
+  if ( *((int *)v2 + 31) > 0x80u )
+    _46BCAB((char *)v2 + 116);
+  v3 = timeGetTime();
+  v4 = *((char *)v2 + 93) == 0;
+  v5 = a2;
+  v16 = v3;
+  if ( !v4 && *((char *)v2 + 96) )
+  {
+    if ( v3 - *((int *)v2 + 19) < 0xFA )
+    {
+      v6 = *(int *)a2;
+      v7 = *(int *)(a2 + 4);
+      v15 = 1;
+      v12 = &AsyncMouse::unk::vdtor_ptr;
+      v13 = v6;
+      v14 = v7;
+      v17 = 0;
+      AsyncMouse::unk_46BCD2((char *)v2 + 116, (int)&a2, *((int *)v2 + 30), (int)&v12);
+      v17 = -1;
+      v3 = v16;
+    }
+    *((int *)v2 + 19) = v3;
+  }
+  if ( *((char *)v2 + 94) && *((char *)v2 + 97) )
+  {
+    if ( v3 - *((int *)v2 + 20) < 0xFA )
+    {
+      v8 = *(int *)v5;
+      v9 = *(int *)(v5 + 4);
+      v15 = 2;
+      //v12 = &AsyncMouse::unk::vdtor_ptr;
+      v13 = v8;
+      v14 = v9;
+      v17 = 1;
+      AsyncMouse::unk_46BCD2((char *)v2 + 116, (int)&a2, *((int *)v2 + 30), (int)&v12);
+      v17 = -1;
+      v3 = v16;
+    }
+    *((int *)v2 + 20) = v3;
+  }
+  if ( *((char *)v2 + 95) && *((char *)v2 + 98) )
+  {
+    if ( v3 - *((int *)v2 + 21) < 0xFA )
+    {
+      v10 = *(int *)v5;
+      v11 = *(int *)(v5 + 4);
+      v15 = 4;
+      //v12 = &AsyncMouse::unk::vdtor_ptr;
+      v13 = v10;
+      v14 = v11;
+      v17 = 2;
+      AsyncMouse::unk_46BCD2((char *)v2 + 116, (int)&a2, *((int *)v2 + 30), (int)&v12);
+      v3 = v16;
+    }
+    *((int *)v2 + 21) = v3;
+  }
+  LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
+}
+
+//----- (0046B736) --------------------------------------------------------
+void AsyncMouse::_46B736_consume_click_lists(char a2)
+{
+  __debugbreak();
+  /*
+  void *v2; // esi@1
+
+  v2 = this;
+  _46B76F();
+  _46B879();
+  if ( a2 )
+  {
+    _46BCAB((char *)v2 + 104);
+    _46BCAB((char *)v2 + 116);
+  }
+  if ( *((char *)v2 + 102) )
+  {
+    back_to_game();
+    *((char *)v2 + 102) = 0;
+  }*/
+}
+
+//----- (0046B76F) --------------------------------------------------------
+void AsyncMouse::_46B76F()
+{
+  __debugbreak();
+  /*
+  char *v0; // ebx@1
+  int v1; // eax@1
+  int v2; // edi@1
+  int v3; // eax@2
+  unsigned int *v4; // esi@2
+  unsigned int v5; // ST08_4@7
+  unsigned int v6; // ST04_4@7
+  float v7; // ST00_4@7
+  unsigned int v8; // ST08_4@9
+  unsigned int v9; // ST04_4@9
+  float v10; // ST00_4@9
+
+  EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
+  v0 = (char *)pAsyncMouse + 108;
+  v1 = *((int *)pAsyncMouse + 27);
+  v2 = *(int *)v1;
+  if ( *(int *)v1 != v1 )
+  {
+    do
+    {
+      v3 = *(int *)(v2 + 20);
+      v4 = (unsigned int *)(v2 + 12);
+      if ( v3 & 1 )
+      {
+        pGame->PickMouse(512.0, *v4, *(int *)(v2 + 16), 0, &a3, &a4);
+        if ( GetCurrentMenuID() == 6 )
+          sub_41CD4F(0x29u);
+        UI_OnMouseLeftClick((int *)(v2 + 12));
+      }
+      else
+      {
+        if ( v3 & 2 )
+        {
+          v5 = *(int *)(v2 + 16);
+          v6 = *v4;
+          v7 = GetPickDepth();
+          pGame->PickMouse(v7, v6, v5, 0, &stru_F93E30, &a5);
+          sub_416D62_ShowPopupWindow_MonsterRecord_ItemInfo_etcsub_416D62((Vec2_int_ *)(v2 + 12));
+        }
+        else
+        {
+          if ( v3 & 4 )
+          {
+            v8 = *(int *)(v2 + 16);
+            v9 = *v4;
+            v10 = GetPickDepth();
+            pGame->PickMouse(v10, v9, v8, 1, &a3, &a5);
+          }
+        }
+      }
+      v2 = *(int *)v2;
+    }
+    while ( v2 != *(int *)v0 );
+  }
+  LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
+}
+
+//----- (0046B879) --------------------------------------------------------
+void AsyncMouse::_46B879()
+{
+  __debugbreak();
+  /*
+  char *v0; // ebx@1
+  int v1; // eax@1
+  int v2; // edi@1
+  int v3; // eax@2
+  unsigned int *v4; // esi@2
+  unsigned int v5; // ST08_4@5
+  unsigned int v6; // ST04_4@5
+  float v7; // ST00_4@5
+
+  EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
+  v0 = (char *)pAsyncMouse + 120;
+  v1 = *((int *)pAsyncMouse + 30);
+  v2 = *(int *)v1;
+  if ( *(int *)v1 != v1 )
+  {
+    do
+    {
+      v3 = *(int *)(v2 + 20);
+      v4 = (unsigned int *)(v2 + 12);
+      if ( v3 & 1 )
+      {
+        pGame->PickMouse(512.0, *v4, *(int *)(v2 + 16), 0, &a3, &a4);
+        sub_4178C4();
+      }
+      else
+      {
+        if ( v3 & 2 )
+        {
+          v5 = *(int *)(v2 + 16);
+          v6 = *v4;
+          v7 = GetPickDepth();
+          pGame->PickMouse(v7, v6, v5, 0, &stru_F93E30, &a4);
+          sub_4178E1();
+        }
+        else
+        {
+          if ( v3 & 4 )
+            nullsub_1();
+        }
+      }
+      v2 = *(int *)v2;
+    }
+    while ( v2 != *(int *)v0 );
+  }
+  LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
+}
+
+//----- (0046B944) --------------------------------------------------------
+int AsyncMouse::_46B944()
+{
+  __debugbreak();
+  /*
+  void *v1; // esi@1
+
+  v1 = this;
+  _46BCAB((char *)this + 104);
+  return _46BCAB((char *)v1 + 116);*/
+  return 0;
+}
+// 46BCAB: using guessed type int __thiscall AsyncMouse__46BCAB(int);
+
+//----- (0046B958) --------------------------------------------------------
+char AsyncMouse::_46B958(int a2, int a3)
+{
+  __debugbreak();
+  /*
+  void *v3; // esi@1
+  char result; // al@3
+  int v5; // edx@6
+  int v6; // eax@6
+  int v7; // eax@12
+  int v8; // edi@13
+  int v9; // eax@19
+  struct IDirectDrawSurface4 *v10; // ST08_4@21
+  DDBLTFX v11; // [sp+4h] [bp-74h]@21
+  RECT v12; // [sp+68h] [bp-10h]@19
+
+  v3 = this;
+  if ( pRenderer->pFrontBuffer4 && !pRenderer->pFrontBuffer4->IsLost() )
+  {
+    EnterCriticalSection(&pGame->pThreadWardInstance->cs2);
+    if ( *((char *)v3 + 88) )
+      pRenderer->pFrontBuffer4->BltFast(
+        *((int *)v3 + 8),
+        *((int *)v3 + 9),
+        (LPDIRECTDRAWSURFACE4)*((int *)v3 + 2),
+        (LPRECT)((char *)v3 + 48),
+        16u);
+    v5 = 640 - a2;
+    v6 = 640 - a2;
+    if ( 640 - a2 >= 31 )
+      v6 = 31;
+    if ( v6 >= 0 )
+    {
+      if ( v5 >= 31 )
+        v5 = 31;
+    }
+    else
+    {
+      v5 = 0;
+    }
+    v7 = 480 - a3;
+    if ( 480 - a3 >= 31 )
+      v8 = 31;
+    else
+      v8 = 480 - a3;
+    if ( v8 >= 0 )
+    {
+      if ( v7 >= 31 )
+        v7 = 31;
+    }
+    else
+    {
+      v7 = 0;
+    }
+    *((int *)v3 + 13) = 0;
+    *((int *)v3 + 14) = v5;
+    v12.right = a2 + v5;
+    *((int *)v3 + 12) = 0;
+    *((int *)v3 + 15) = v7;
+    v12.left = a2;
+    v12.bottom = a3 + v7;
+    v9 = *((int *)v3 + 2);
+    v12.top = a3;
+    (*(void (__stdcall **)(int, int, int, IDirectDrawSurface4 *, RECT *, signed int))(*(int *)v9 + 28))(
+      v9,
+      0,
+      0,
+      pRenderer->pFrontBuffer4,
+      &v12,
+      16);
+    if ( !*((char *)v3 + 90) || *((char *)v3 + 128) & 1 )
+    {
+      v10 = (struct IDirectDrawSurface4 *)*((int *)v3 + 1);
+      v11.dwSize = 100;
+      v11.dwDDFX = 8;
+      pRenderer->pFrontBuffer4->Blt(
+        &v12,
+        v10,
+        (LPRECT)((char *)v3 + 48),
+        16812032u,
+        &v11);
+    }
+    *((char *)v3 + 88) = 1;
+    LeaveCriticalSection(&pGame->pThreadWardInstance->cs2);
+    result = 1;
+  }
+  else
+  {
+    result = 0;
+  }
+  return result;*/
+  return 0;
+}
+
+//----- (0046BA8D) --------------------------------------------------------
+char AsyncMouse::_46BA8D(int a2, int a3)
+{
+  __debugbreak();
+  /*
+  void *v3; // esi@1
+  DWORD v4; // eax@1
+
+  v3 = this;
+  v4 = timeGetTime();
+  if ( v4 - *((int *)v3 + 16) <= 0x32 )
+  {
+    *((char *)v3 + 91) = *((char *)v3 + 90) == 1;
+    *((char *)v3 + 90) = 0;
+  }
+  else
+  {
+    if ( *((char *)v3 + 90) )
+      *((char *)v3 + 91) = 0;
+    else
+      *((char *)v3 + 91) = 1;
+    *((char *)v3 + 90) = 1;
+  }
+  if ( a2 != *((int *)v3 + 17) || a3 != *((int *)v3 + 18) )
+  {
+    *((int *)v3 + 16) = v4;
+    *((int *)v3 + 17) = a2;
+    *((int *)v3 + 18) = a3;
+  }
+  return *((char *)v3 + 90);*/
+  return 0;
+}
+
+//----- (0046BAEC) --------------------------------------------------------
+void AsyncMouse::_46BAEC()
+{
+  void *v1; // esi@1
+
+  v1 = this;
+  EnterCriticalSection(&pGame->pThreadWardInstance->cs2);
+  *((char *)v1 + 88) = 0;
+}
+
+//----- (0046BB0A) --------------------------------------------------------
+void AsyncMouse::_46BB0A()
+{
+  __debugbreak();
+  /*
+  void *v1; // esi@1
+  int v2; // eax@1
+  int v3; // edx@1
+  int v4; // ecx@1
+  int v5; // edx@1
+  int v6; // eax@1
+  char v7; // zf@1
+  struct IDirectDrawSurface4 *v8; // ST08_4@8
+  int v9; // [sp+8h] [bp-74h]@8
+  int v10; // [sp+Ch] [bp-70h]@8
+  int v11; // [sp+6Ch] [bp-10h]@1
+  int v12; // [sp+70h] [bp-Ch]@1
+  int v13; // [sp+74h] [bp-8h]@1
+  int v14; // [sp+78h] [bp-4h]@1
+
+  v1 = this;
+  v2 = *((int *)this + 17) - *((int *)this + 10);
+  v3 = *((int *)this + 14);
+  v4 = *((int *)this + 18) - *((int *)this + 11);
+  v11 = v2;
+  v5 = v2 + v3;
+  v6 = *((int *)v1 + 15);
+  v12 = v4;
+  v7 = *((char *)v1 + 90) == 0;
+  v13 = v5;
+  v14 = v4 + v6;
+  if ( v7 || *((char *)v1 + 128) & 1 )
+  {
+    if ( *((char *)v1 + 88) )
+      pRenderer->pFrontBuffer4->BltFast(
+        *((int *)v1 + 8),
+        *((int *)v1 + 9),
+        (LPDIRECTDRAWSURFACE4)*((int *)v1 + 2),
+        (LPRECT)((char *)v1 + 48),
+        16u);
+    (*(void (__stdcall **)(int, int, int, IDirectDrawSurface4 *, int *, signed int))(**((int **)v1 + 2) + 28))(
+      *((int *)v1 + 2),
+      0,
+      0,
+      pRenderer->pFrontBuffer4,
+      &v11,
+      16);
+  }
+  if ( *((char *)v1 + 90) && !(*((char *)v1 + 128) & 1) )
+  {
+    v8 = (struct IDirectDrawSurface4 *)*((int *)v1 + 1);
+    v9 = 100;
+    v10 = 8;
+    pRenderer->pFrontBuffer4->Blt(
+      (LPRECT)&v11,
+      v8,
+      (LPRECT)((char *)v1 + 48),
+      16812032u,
+      (LPDDBLTFX)&v9);
+  }
+  LeaveCriticalSection(&pGame->pThreadWardInstance->cs2);*/
+}
+
+//----- (0046BBD0) --------------------------------------------------------
+void *AsyncMouse::Clip()
+{
+  __debugbreak();
+  /*
+  void *result; // eax@1
+  std::string v1; // [sp-18h] [bp-30h]@2
+  const char *v2; // [sp-8h] [bp-20h]@2
+  int v3; // [sp-4h] [bp-1Ch]@2
+  RECT Rect; // [sp+0h] [bp-18h]@1
+  std::string *v5; // [sp+10h] [bp-8h]@2
+  int a3; // [sp+17h] [bp-1h]@2
+
+  SetWindowPos(hWnd, HWND_MESSAGE|0x2, 320, 240, 640, 480, 0);
+  Rect.left = 325;
+  Rect.top = 245;
+  Rect.right = 326;
+  Rect.bottom = 246;
+  result = (void *)ClipCursor(&Rect);
+  if ( !result )
+  {
+          MessageBoxW(nullptr, L"Could not clip cursor to screen!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:827", 0);
+  }
+  return result;*/
+  return 0;
+}
+
+//----- (0046BC4E) --------------------------------------------------------
+void __stdcall AsyncMouse::AsyncMouseThread(int a1)
+{
+  __debugbreak();
+  /*
+  while ( 1 )
+  {
+    while ( !pAsyncMouse )
+      Sleep(1);
+    if ( !AsyncMouse::Thread(pAsyncMouse) )
+      ExitThread(0);
+    Sleep(18);
+  }*/
+}
+
+//----- (0046BC73) --------------------------------------------------------
+void AsyncMouse::dtor_sub_46BC73()
+{
+  __debugbreak();
+  /*
+  int v1; // edi@1
+  void **v2; // ebx@1
+  void *v3; // esi@1
+  void *v4; // eax@2
+  int v5; // [sp+0h] [bp-4h]@1
+
+  v5 = this;
+  v1 = this;
+  v2 = *(void ***)(this + 4);
+  v3 = *v2;
+  while ( v3 != v2 )
+  {
+    v4 = v3;
+    v3 = *(void **)v3;
+    AsyncMouse::unk_46BD2D((void *)v1, (int)&v5, v4);
+  }
+  free(*(void **)(v1 + 4));
+  *(int *)(v1 + 4) = 0;
+  *(int *)(v1 + 8) = 0;*/
+}
+
+//----- (0046BCAB) --------------------------------------------------------
+int AsyncMouse::_46BCAB()
+{
+  __debugbreak();
+  /*
+  void *v1; // ebx@1
+  void **v2; // edi@1
+  void *v3; // esi@1
+  void *v4; // eax@2
+  int result; // eax@2
+  int v6; // [sp+0h] [bp-4h]@1
+
+  v6 = this;
+  v1 = (void *)this;
+  v2 = *(void ***)(this + 4);
+  v3 = *v2;
+  while ( v3 != v2 )
+  {
+    v4 = v3;
+    v3 = *(void **)v3;
+    result = AsyncMouse::unk_46BD2D(v1, (int)&v6, v4);
+  }
+  return result;*/
+  return 0;
+}
+// 46BCAB: using guessed type int __thiscall AsyncMouse__46BCAB(int);
+
+//----- (0046BCD2) --------------------------------------------------------
+int AsyncMouse::unk_46BCD2(int a2, int a3, int a4)
+{
+  __debugbreak();
+  /*
+  void *v4; // edi@1
+  void *v5; // eax@1
+  void *v6; // esi@1
+  int result; // eax@1
+
+  v4 = this;
+  v5 = AsyncMouse::unk_46BD09((void *)a3, *(void **)(a3 + 4));
+  v6 = v5;
+  *(int *)(a3 + 4) = v5;
+  **((int **)v5 + 1) = v5;
+  AsyncMouse::unk_46BD66((char *)v5 + 8, a4);
+  result = a2;
+  ++*((int *)v4 + 2);
+  *(int *)a2 = v6;
+  return result;*/
+  return 0;
+}
+// 46BD66: using guessed type int __fastcall AsyncMouse__unk__46BD66(int, int);
+
+//----- (0046BD09) --------------------------------------------------------
+void *AsyncMouse::unk_46BD09(void *a1, void *a2)
+{
+  __debugbreak();
+  /*
+  void *result; // eax@1
+  void *v3; // ecx@1
+  void *v4; // ecx@3
+
+  result = operator new(0x18u);
+  v3 = a1;
+  if ( !a1 )
+    v3 = result;
+  *(int *)result = v3;
+  v4 = a2;
+  if ( !a2 )
+    v4 = result;
+  *((int *)result + 1) = v4;
+  return result;*/
+  return 0;
+}
+
+//----- (0046BD2D) --------------------------------------------------------
+int AsyncMouse::unk_46BD2D(int a2, void *a3)
+{
+  __debugbreak();
+  /*
+  void *v3; // edi@1
+  int v4; // ebx@1
+  int result; // eax@1
+
+  v3 = this;
+  v4 = *(int *)a3;
+  **((int **)a3 + 1) = *(int *)a3;
+  *(int *)(*(int *)a3 + 4) = *((int *)a3 + 1);
+  (**((void (__stdcall ***)(int))a3 + 2))(0);
+  free(a3);
+  result = a2;
+  --*((int *)v3 + 2);
+  *(int *)a2 = v4;
+  return result;*/
+  return 0;
+}
+
+//----- (0046BD66) --------------------------------------------------------
+int AsyncMouse::unk_46BD66(int a1, int a2)
+{
+  int result; // eax@2
+
+  if ( a1 )
+  {
+    *(int *)(a1 + 4) = *(int *)(a2 + 4);
+    *(int *)(a1 + 8) = *(int *)(a2 + 8);
+    result = *(int *)(a2 + 12);
+    *(int *)(a1 + 12) = result;
+    //*(int *)a1 = &AsyncMouse::unk::vdtor_ptr;
+  }
+  return result;
+}
+// 46BD66: using guessed type int __fastcall AsyncMouse__unk__46BD66(int, int);
+// 4D8734: using guessed type int (__stdcall *AsyncMouse__unk__vdtor_ptr)(char);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*
+//----- (0043B9FF) --------------------------------------------------------
+DirectInputMouse *__thiscall DirectInputMouse::DirectInputMouse(DirectInputMouse *this)
+{
+  DirectInputMouse *v1; // esi@1
+  HRESULT v2; // eax@5
+  signed int v4; // [sp-18h] [bp-24h]@3
+  char *v5; // [sp-14h] [bp-20h]@3
+  int v6; // [sp-10h] [bp-1Ch]@3
+  const char *v7; // [sp-Ch] [bp-18h]@3
+  int v8; // [sp-8h] [bp-14h]@3
+  unsigned int v9; // [sp-4h] [bp-10h]@3
+  CheckHRESULT_stru0 v10; // [sp+8h] [bp-4h]@5
+
+  v1 = this;
+  this->field_8 = 0;
+  LOBYTE(this->field_1C) = 0;
+  this->field_28 = 0;
+  this->vdestructor_ptr = (int)&DirectInputMouse_pvdtor;
+  if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 )
+  {
+    v9 = 1;
+    v8 = 30;
+    v7 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp";
+    v6 = 0;
+    v5 = (char *)&this->pDirectInput;
+    v4 = 1280;
+  }
+  else
+  {
+    v9 = 1;
+    v8 = 28;
+    v7 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp";
+    v6 = 0;
+    v5 = (char *)&this->pDirectInput;
+    v4 = 768;
+  }
+  v2 = DirectInputCreateA(hInstance, v4, v5, v6);
+  CheckHRESULT(&v10, v2, v7, v8, v9);
+  DirectInputMouse::CreateDevice(v1);
+  DirectInputMouse::43BB18(v1);
+  v1->field_20 = 0;
+  v1->field_24 = 0;
+  return v1;
+}
+// 4C8880: using guessed type int __stdcall DirectInputCreateA(int, int, int, int);
+// 4D8608: using guessed type int (__stdcall *DirectInputMouse_pvdtor)(char);
+
+//----- (0043BA80) --------------------------------------------------------
+void *__thiscall DirectInputMouse::vdtor(void *this, bool a2)
+{
+  void *v2; // esi@1
+
+  v2 = this;
+  DirectInputMouse::dtor(this);
+  if ( a2 & 1 )
+    free(v2);
+  return v2;
+}
+
+//----- (0043BA9C) --------------------------------------------------------
+int __thiscall DirectInputMouse::dtor(void *this)
+{
+  void *v1; // esi@1
+  int v2; // eax@1
+  int result; // eax@3
+
+  v1 = this;
+  v2 = *((int *)this + 2);
+  *(int *)this = &DirectInputMouse_pvdtor;
+  if ( v2 )
+  {
+    (*(void (__stdcall **)(int))(*(int *)v2 + 32))(v2);
+    (*(void (__stdcall **)(int))(**((int **)v1 + 2) + 8))(*((int *)v1 + 2));
+    *((int *)v1 + 2) = 0;
+  }
+  result = (*(int (__stdcall **)(int))(**((int **)v1 + 1) + 8))(*((int *)v1 + 1));
+  *((int *)v1 + 1) = 0;
+  return result;
+}
+// 4D8608: using guessed type int (__stdcall *DirectInputMouse_pvdtor)(char);
+
+//----- (0043BACE) --------------------------------------------------------
+void __thiscall DirectInputMouse::CreateDevice(DirectInputMouse *this)
+{
+  DirectInputMouse *v1; // esi@1
+  HRESULT v2; // eax@1
+  CheckHRESULT_stru0 v3; // [sp+4h] [bp-4h]@1
+
+  v1 = this;
+  v2 = ((int (__stdcall *)(int, int, int, int, int))this->pDirectInput->lpVtbl->field_10)(
+         this->pDirectInput,
+         2,
+         DirectInputMouse_enumerator,
+         this,
+         1);
+  CheckHRESULT(&v3, v2, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 57, 1u);
+  if ( !LOBYTE(v1->field_1C) )
+  {
+    v3.vdestructor_ptr = (void (__thiscall ***)(CheckHRESULT_stru0 *, bool))"Error: No mouse found";
+    _CxxThrowException((int)&v3, (int)&dword_4DBD94);
+  }
+}
+// 43BC61: using guessed type int __stdcall DirectInputMouse_enumerator(int, int);
+// 4DBD94: using guessed type int dword_4DBD94;
+
+//----- (0043BB18) --------------------------------------------------------
+int __thiscall DirectInputMouse::43BB18(DirectInputMouse *this)
+{
+  char *v1; // esi@1
+  HRESULT v2; // eax@1
+  HRESULT v3; // eax@1
+  HRESULT v4; // eax@1
+  unsigned int v6; // [sp+0h] [bp-Ch]@0
+  CheckHRESULT_stru0 v7; // [sp+8h] [bp-4h]@1
+
+  v1 = (char *)&this->field_8;
+  v2 = ((int (__stdcall *)(int, int, int, int, int))this->pDirectInput->lpVtbl->field_C)(
+         this->pDirectInput,
+         &this->field_C,
+         &this->field_8,
+         0,
+         "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp");
+  CheckHRESULT(&v7, v2, (const char *)0x40, 1, v6);
+  v3 = (*(int (__stdcall **)(int, int))(**(int **)v1 + 44))(*(int *)v1, dword_4C9920);
+  CheckHRESULT(&v7, v3, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 65, 1u);
+  v4 = (*(int (__stdcall **)(int, int, int))(**(int **)v1 + 52))(*(int *)v1, hWnd, 6);
+  CheckHRESULT(&v7, v4, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 66, 1u);
+  return (*(int (__cdecl **)(int))(**(int **)v1 + 28))(*(int *)v1);
+}
+// 4C9920: using guessed type int dword_4C9920[16];
+
+//----- (0043BB89) --------------------------------------------------------
+bool __thiscall DirectInputMouse::43BB89(DirectInputMouse *this)
+{
+  DirectInputMouse *v1; // esi@1
+  bool result; // eax@1
+  HRESULT v3; // eax@5
+  __int32 v4; // ecx@6
+  __int32 v5; // eax@6
+  __int32 v6; // edx@6
+  int v7; // ecx@12
+  bool v8; // ecx@12
+  signed int v9; // edx@12
+  HRESULT a2; // [sp+4h] [bp-14h]@3
+  int v11; // [sp+8h] [bp-10h]@12
+  char v12; // [sp+10h] [bp-8h]@18
+  char v13; // [sp+11h] [bp-7h]@20
+  char v14; // [sp+12h] [bp-6h]@22
+  char v15; // [sp+13h] [bp-5h]@24
+  char v18; // [sp+14h] [bp-4h]@5
+
+  v1 = this;
+  result = this->field_8;
+  if ( result )
+  {
+    if ( (*(int (__stdcall **)(bool, signed int, HRESULT *))(*(int *)result + 36))(result, 16, &a2) == -2147024866
+      && !(*(int (__stdcall **)(int))(*(int *)v1->field_8 + 28))(v1->field_8) )
+    {
+      v3 = (*(int (__stdcall **)(int, signed int, HRESULT *))(*(int *)v1->field_8 + 36))(v1->field_8, 16, &a2);
+      CheckHRESULT((CheckHRESULT_stru0 *)&v18, v3, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 80, 1u);
+    }
+    v4 = v1->field_20 + a2;
+    v5 = 640;
+    v6 = v1->field_20 + a2;
+    if ( v4 >= 640 )
+      v6 = 640;
+    if ( v6 >= 0 )
+    {
+      if ( v4 < 640 )
+        v5 = v1->field_20 + a2;
+    }
+    else
+    {
+      v5 = 0;
+    }
+    v7 = v11;
+    v1->field_20 = v5;
+    v8 = v1->field_24 + v7;
+    result = 480;
+    v9 = v8;
+    if ( v8 >= 480 )
+      v9 = 480;
+    if ( v9 >= 0 )
+    {
+      if ( v8 < 480 )
+        result = v8;
+    }
+    else
+    {
+      result = 0;
+    }
+    v1->field_28 = 0;
+    v1->field_24 = result;
+    if ( v12 & 0x80 )
+      v1->field_28 = 1;
+    if ( v13 & 0x80 )
+      v1->field_28 |= 2u;
+    if ( v14 & 0x80 )
+      v1->field_28 |= 4u;
+    if ( v15 & 0x80 )
+      v1->field_28 |= 8u;
+    LOBYTE(result) = 1;
+  }
+  else
+  {
+    LOBYTE(result) = 0;
+  }
+  return result;
+}
+
+//----- (0043BC61) --------------------------------------------------------
+signed int __stdcall DirectInputMouse_enumerator(int a1, int a2)
+{
+  signed int result; // eax@2
+
+  if ( *(char *)(a1 + 36) & 2 )
+  {
+    *(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;
+}
+// 43BC61: using guessed type int __stdcall DirectInputMouse_enumerator(int, int);
+*/
\ No newline at end of file