comparison Mouse.cpp @ 0:9c0607679772

init
author Ritor1
date Sat, 12 Jan 2013 09:45:18 +0600
parents
children ee11772d0ad2
comparison
equal deleted inserted replaced
-1:000000000000 0:9c0607679772
1 #include "OSAPI.h"
2
3 #include "Mouse.h"
4 #include "Items.h"
5 #include "Party.h"
6 #include "LOD.h"
7 #include "Game.h"
8 #include "Texture.h"
9
10
11
12
13
14
15
16 Mouse *pMouse;
17 AsyncMouse *pAsyncMouse;
18
19
20
21
22
23 //----- (00469860) --------------------------------------------------------
24 void Mouse::GetClickPos(unsigned int *pX, unsigned int *pY)
25 {
26 unsigned int v3; // eax@2
27
28 if (pAsyncMouse)
29 {
30 *pX = *((int *)pAsyncMouse + 6);
31 v3 = *((int *)pAsyncMouse + 7);
32 }
33 else
34 {
35 *pX = this->uMouseClickX;
36 v3 = this->uMouseClickY;
37 }
38 *pY = v3;
39 }
40
41 //----- (004698A6) --------------------------------------------------------
42 void Mouse::RemoveHoldingItem()
43 {
44 pParty->pPickedItem.Reset();
45 if (strcmpi(pCurrentCursorName, "MICON2"))
46 SetCursorBitmap("MICON1");
47 }
48
49 //----- (004698D8) --------------------------------------------------------
50 void Mouse::SetCursorBitmapFromItemID(unsigned int uItemID)
51 {
52 pMouse->SetCursorBitmap(pItemsTable->pItems[uItemID].pIconName);
53 }
54
55 //----- (004698F6) --------------------------------------------------------
56 void Mouse::SetCurrentCursorBitmap()
57 {
58 SetCursorBitmap(pCurrentCursorName);
59 }
60
61 //----- (00469903) --------------------------------------------------------
62 void Mouse::SetCursorBitmap(const char *pName)
63 {
64 Mouse *v2; // esi@1
65 HCURSOR v3; // eax@10
66 int v4; // ecx@10
67 double v5; // st7@11
68 float v6; // ST04_4@12
69 LONG v7; // eax@14
70 LONG v8; // eax@17
71 unsigned int v9; // eax@21
72 float v10; // [sp+4h] [bp-18h]@11
73 struct tagPOINT Point; // [sp+14h] [bp-8h]@20
74
75 v2 = this;
76 if ( !this->bInitialized || !pName )
77 return;
78 if ( _strcmpi("MICON2", pName) )
79 pGame->uFlags2 &= 0xFFFFFFEFu;
80 else
81 pGame->uFlags2 |= 0x10u;
82 if ( _strcmpi(v2->pCurrentCursorName, pName) )
83 strcpy(v2->pCurrentCursorName, pName);
84 ClearCursor();
85 if ( _strnicmp(pName, "MICON1", 5u) )
86 {
87 v9 = pIcons_LOD->LoadTexture(pName, TEXTURE_16BIT_PALETTE);
88 v2->uCursorTextureID = v9;
89 v2->uCursorTextureID_2 = v9;
90 v2->AllocCursorSystemMem();
91 v2->field_C = 0;
92 v2->field_14 = 1;
93 v2->bActive = 1;
94 if ( !areWeLoadingTexture )
95 {
96 if (uCursorTextureID != -1)
97 pIcons_LOD->pTextures[uCursorTextureID].Release();
98 pIcons_LOD->_40F9C5();
99 }
100 return;
101 }
102 v2->bActive = 0;
103 v2->field_C = 1;
104 if ( !strcmp(pName, "MICON1") )
105 {
106 v3 = LoadCursorA(GetModuleHandleW(nullptr), "Arrow");
107 SetClassLongA(hWnd, GCL_HCURSOR, (LONG)v3);
108 v4 = (int)pAsyncMouse;
109 if (pAsyncMouse)
110 {
111 v10 = 0.0;
112 v5 = 0.0;
113 LABEL_12:
114 v6 = v5;
115 pAsyncMouse->SetHotspot(v6, v10);
116 goto LABEL_18;
117 }
118 goto LABEL_20;
119 }
120 if ( !strcmp(pName, "MICON2") )
121 {
122 v7 = (LONG)LoadCursorA(GetModuleHandleW(nullptr), "Target");
123 SetClassLongA(hWnd, -12, v7);
124 v4 = (int)pAsyncMouse;
125 if (pAsyncMouse)
126 {
127 v10 = 14.0;
128 v5 = 14.0;
129 goto LABEL_12;
130 }
131 LABEL_20:
132 GetCursorPos(&Point);
133 SetCursorPos(Point.x, Point.y);
134 return;
135 }
136 if ( !strcmp(pName, "MICON3") )
137 {
138 v8 = (LONG)LoadCursorA(0, (LPCSTR)IDC_WAIT);
139 SetClassLongA(hWnd, -12, v8);
140 }
141 LABEL_18:
142 if ( !pAsyncMouse || (pAsyncMouse->LoadCursor(pName), !pAsyncMouse) )
143 goto LABEL_20;
144 }
145 // 506128: using guessed type int areWeLoadingTexture;
146
147 //----- (00469AE4) --------------------------------------------------------
148 LONG Mouse::_469AE4()
149 {
150 Mouse *v1; // esi@1
151 LONG v2; // ecx@2
152 LONG result; // eax@2
153 struct tagPOINT Point; // [sp+Ch] [bp-8h]@2
154
155 v1 = this;
156 this->field_8 = 1;
157 if (pAsyncMouse)
158 {
159 v2 = *((int *)pAsyncMouse + 6);
160 Point.x = *((int *)pAsyncMouse + 6);
161 result = *((int *)pAsyncMouse + 7);
162 }
163 else
164 {
165 GetCursorPos(&Point);
166 if ( pRenderer->bWindowMode )
167 ScreenToClient(hWnd, &Point);
168 result = Point.y;
169 v2 = Point.x;
170 }
171 v1->uMouseClickX = v2;
172 v1->uMouseClickY = result;
173 if ( pRenderer->bWindowMode )
174 goto LABEL_16;
175 if (pAsyncMouse)
176 goto LABEL_24;
177 if ( v2 < 0 )
178 v2 = 0;
179 if ( result < 0 )
180 result = 0;
181 if ( v2 > 639 )
182 v2 = 639;
183 if ( result > 479 )
184 {
185 result = 479;
186 LABEL_16:
187 if (pAsyncMouse)
188 goto LABEL_24;
189 if ( pRenderer->bWindowMode && (v2 < 0 || result < 0 || v2 > 639 || result > 479) )
190 goto LABEL_23;
191 }
192 if ( v1->field_C )
193 LABEL_23:
194 v1->bActive = 0;
195 LABEL_24:
196 v1->field_8 = 0;
197 return result;
198 }
199
200 //----- (00469BA3) --------------------------------------------------------
201 void Mouse::ClearCursor()
202 {
203 Mouse *v1; // esi@1
204 void *v2; // eax@1
205 void **v3; // esi@5
206
207 v1 = this;
208 v2 = this->pCursorBitmap_sysmem;
209 this->bActive = 0;
210 if ( v2 )
211 {
212 free(v2);
213 v1->pCursorBitmap_sysmem = 0;
214 }
215 if ( v1->pCursorBitmap2_sysmem )
216 {
217 free(v1->pCursorBitmap2_sysmem);
218 v1->pCursorBitmap2_sysmem = 0;
219 }
220 v3 = &v1->ptr_90;
221 if ( *v3 )
222 free(*v3);
223 *v3 = 0;
224 }
225
226 //----- (00469BE6) --------------------------------------------------------
227 void Mouse::AllocCursorSystemMem()
228 {
229 bActive = 0;
230 if (!pCursorBitmap_sysmem)
231 pCursorBitmap_sysmem = (unsigned __int16 *)DoAllocCursorMem();
232 if (!pCursorBitmap2_sysmem)
233 pCursorBitmap2_sysmem = (unsigned __int8 *)DoAllocCursorMem();
234 }
235
236 //----- (00469C0D) --------------------------------------------------------
237 void *Mouse::DoAllocCursorMem()
238 {
239 return malloc(4 * (this->uCursorTextureID != -1 ? pIcons_LOD->pTextures[this->uCursorTextureID].uTextureWidth : 24)
240 * (this->uCursorTextureID != -1 ? pIcons_LOD->pTextures[this->uCursorTextureID].uTextureHeight : 26));
241 }
242
243 //----- (00469C39) --------------------------------------------------------
244 POINT *Mouse::GetCursorPos(POINT *a2)
245 {
246 void *v2; // edx@1
247 POINT *result; // eax@1
248 unsigned int v4; // ecx@2
249 unsigned int v5; // edx@3
250
251 v2 = pAsyncMouse;
252 result = a2;
253 if (pAsyncMouse)
254 {
255 a2->x = *((int *)pAsyncMouse + 6);
256 v4 = *((int *)v2 + 7);
257 }
258 else
259 {
260 v5 = this->uMouseClickX;
261 v4 = this->uMouseClickY;
262 a2->x = v5;
263 }
264 a2->y = v4;
265 return result;
266 }
267
268 //----- (00469C65) --------------------------------------------------------
269 void Mouse::Initialize(HWND hWnd)
270 {
271 this->hWnd = hWnd;
272 this->bActive = 0;
273 this->bInitialized = 1;
274 this->pCursorBitmapPos.x = 0;
275 this->pCursorBitmapPos.y = 0;
276 this->uMouseClickX = 0;
277 this->uMouseClickY = 0;
278 this->pCursorBitmap_sysmem = 0;
279 this->field_34 = 0;
280 this->pCursorBitmap2_sysmem = 0;
281
282 SetCursorBitmap("MICON3");
283 SetCursorBitmap("MICON2");
284 SetCursorBitmap("MICON1");
285 }
286
287 //----- (00469CC2) --------------------------------------------------------
288 void Mouse::Deactivate()
289 {
290 if (bInitialized)
291 bActive = false;
292 }
293
294 //----- (00469CCD) --------------------------------------------------------
295 void Mouse::DrawCursor()
296 {
297 Mouse *v1; // esi@1
298 char v11; // zf@6
299 signed int v3; // eax@6
300 signed int v4; // ecx@6
301 Vec4_int_ *v5; // edx@21
302 int v6; // edi@21
303 int v7; // ebx@21
304 int v8; // eax@29
305 unsigned int v9; // eax@31
306
307 v1 = this;
308 if ( this->bInitialized )
309 {
310 if ( !this->field_8 && this->bActive && !this->field_C )
311 pMouse->_469AE4();
312 v11 = v1->field_C == 0;
313 v3 = v1->uMouseClickX;
314 v4 = v1->uMouseClickY;
315 v1->field_F4 = 1;
316 if ( !v11 )
317 goto LABEL_12;
318 if ( pRenderer->bWindowMode )
319 {
320 if ( v3 < 0 || v4 < 0 || v3 > 639 || v4 > 479 )
321 {
322 LABEL_12:
323 v1->field_F4 = 0;
324 return;
325 }
326 }
327 else
328 {
329 if ( v3 < 0 )
330 v3 = 0;
331 if ( v4 < 0 )
332 v4 = 0;
333 if ( v3 > 639 )
334 v3 = 639;
335 if ( v4 > 479 )
336 v4 = 479;
337 }
338 v5 = &v1->pCursorBitmapRect;
339 v6 = v3 + v1->uCursorBitmapPitch;
340 v7 = v4 + v1->field_5C[0];
341 v1->pCursorBitmapRect.y = v4;
342 v1->pCursorBitmapRect.x = v3;
343 v1->pCursorBitmapRect.z = v6;
344 v1->pCursorBitmapRect.w = v7;
345 if ( v3 < 0 )
346 v5->x = 0;
347 if ( v4 < 0 )
348 v1->pCursorBitmapRect.y = 0;
349 if ( v6 > 640 )
350 v1->pCursorBitmapRect.z = 640;
351 if ( v7 > 480 )
352 v1->pCursorBitmapRect.w = 480;
353 v8 = v1->pCursorBitmapRect.z;
354 v1->bActive = 0;
355 v1->uCursorBitmapWidth = v8 - v5->x;
356 v11 = v1->field_14 == 0;
357 v1->uCursorBitmapHeight = v1->pCursorBitmapRect.w - v1->pCursorBitmapRect.y;
358 if ( !v11 )
359 {
360 if ( pMouse->ptr_90 )
361 v9 = 2 * pMouse->uCursorBitmapPitch;
362 else
363 v9 = 0;
364 pRenderer->_4A6DF5(
365 v1->pCursorBitmap_sysmem,
366 v9,
367 &v1->pCursorBitmapPos,
368 pRenderer->pTargetSurface,
369 pRenderer->uTargetSurfacePitch,
370 &v1->pCursorBitmapRect);
371 v1->field_14 = 0;
372 }
373 }
374 }
375
376 //----- (00469E1C) --------------------------------------------------------
377 void Mouse::_469E1C()
378 {
379 bActive = true;
380 }
381
382 //----- (00469E24) --------------------------------------------------------
383 void Mouse::_469E24()
384 {
385 if (pCursorBitmap3_sysmembits_16bit)
386 {
387 free(pCursorBitmap3_sysmembits_16bit);
388 pCursorBitmap3_sysmembits_16bit = 0;
389 }
390 }
391
392 //----- (00469E3B) --------------------------------------------------------
393 void Mouse::DrawCursorToTarget()
394 {
395 if (!pCursorBitmap3_sysmembits_16bit)
396 return;
397
398 auto pSrc = pCursorBitmap3_sysmembits_16bit;
399 for (uint y = field_44; y < field_4C; ++y)
400 for (uint x = field_40; x < field_48; ++x)
401 pRenderer->pTargetSurface[y * pRenderer->uTargetSurfacePitch + x] = *pSrc++;
402 }
403
404 //----- (00469EA4) --------------------------------------------------------
405 void Mouse::_469EA4()
406 {
407 Mouse *v1; // esi@1
408 unsigned int v2; // eax@2
409 Texture *v3; // edi@2
410 unsigned int v4; // ecx@3
411 unsigned int v5; // eax@3
412 unsigned int v6; // ebx@5
413 int v7; // ecx@15
414 int v8; // ecx@25
415 int v9; // ebx@26
416 unsigned int v10; // eax@26
417 int v11; // edx@27
418 unsigned __int16 *v12; // edx@29
419 unsigned __int16 *v13; // ebx@29
420 unsigned int a2; // [sp+Ch] [bp-1Ch]@5
421 unsigned int v15; // [sp+10h] [bp-18h]@5
422 unsigned int v16; // [sp+14h] [bp-14h]@25
423 unsigned __int16 *v17; // [sp+18h] [bp-10h]@25
424 int v18; // [sp+1Ch] [bp-Ch]@27
425 int v19; // [sp+20h] [bp-8h]@15
426 unsigned __int16 *v20; // [sp+20h] [bp-8h]@28
427 int v21; // [sp+24h] [bp-4h]@12
428 unsigned __int16 *v22; // [sp+24h] [bp-4h]@25
429
430 v1 = this;
431 if ( pParty->pPickedItem.uItemID )
432 {
433 v2 = pIcons_LOD->LoadTexture(
434 pItemsTable->pItems[pParty->pPickedItem.uItemID].pIconName,
435 TEXTURE_16BIT_PALETTE);
436 v3 = (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0);
437 if (pAsyncMouse)
438 {
439 v4 = *((int *)pAsyncMouse + 6);
440 v5 = *((int *)pAsyncMouse + 7);
441 }
442 else
443 {
444 v4 = pMouse->uMouseClickX;
445 v5 = pMouse->uMouseClickY;
446 }
447 v6 = v5;
448 a2 = v4;
449 v15 = v5;
450 if ( (signed int)v4 <= 639 && (signed int)v5 <= 479 )
451 {
452 if ( (v4 & 0x80000000u) != 0 )
453 a2 = 0;
454 if ( (v5 & 0x80000000u) != 0 )
455 {
456 v6 = 0;
457 v15 = 0;
458 }
459 if ( (signed int)(v3->uTextureWidth + a2) <= 640 )
460 v21 = v3->uTextureWidth;
461 else
462 v21 = 640 - a2;
463 if ( (signed int)(v3->uTextureHeight + v6) <= 480 )
464 {
465 v19 = v3->uTextureHeight;
466 v7 = v3->uTextureHeight;
467 }
468 else
469 {
470 v7 = 480 - v6;
471 v19 = 480 - v6;
472 }
473 if ( !v1->pCursorBitmap3_sysmembits_16bit
474 || a2 != v1->field_40
475 || v6 != v1->field_44
476 || a2 + v21 != v1->field_48
477 || v6 + v7 != v1->field_4C )
478 {
479 if ( v1->pCursorBitmap3_sysmembits_16bit )
480 free(v1->pCursorBitmap3_sysmembits_16bit);
481 v1->pCursorBitmap3_sysmembits_16bit = (unsigned __int16 *)operator new(2 * v3->uTextureHeight
482 * v3->uTextureWidth);
483 v1->field_40 = a2;
484 v1->field_48 = a2 + v21;
485 v1->field_44 = v6;
486 v1->field_4C = v6 + v19;
487 }
488 v8 = v1->field_44;
489 v22 = v1->pCursorBitmap3_sysmembits_16bit;
490 v17 = pRenderer->pTargetSurface;
491 v16 = pRenderer->uTargetSurfacePitch;
492 if ( v8 < v1->field_4C )
493 {
494 v9 = v1->field_48;
495 v10 = pRenderer->uTargetSurfacePitch * v8;
496 do
497 {
498 v11 = v1->field_40;
499 v18 = v1->field_40;
500 if ( v11 < v9 )
501 {
502 v20 = &v17[v10 + v11];
503 do
504 {
505 v12 = v20;
506 v13 = v22;
507 ++v18;
508 ++v20;
509 ++v22;
510 *v13 = *v12;
511 v9 = v1->field_48;
512 }
513 while ( v18 < v9 );
514 }
515 v10 += v16;
516 ++v8;
517 }
518 while ( v8 < v1->field_4C );
519 v6 = v15;
520 }
521 if ( pParty->pPickedItem.uAttributes & 2 )
522 {
523 pRenderer->_4A6776(a2, v6, v3);
524 }
525 else
526 {
527 if ( pParty->pPickedItem.uAttributes & 1 )
528 pRenderer->DrawTextureTransparent(a2, v6, v3);
529 else
530 pRenderer->DrawTransparentGreenShade(a2, v6, v3);
531 }
532 }
533 }
534 else
535 {
536 if ( this->pCursorBitmap3_sysmembits_16bit )
537 {
538 free(this->pCursorBitmap3_sysmembits_16bit);
539 v1->pCursorBitmap3_sysmembits_16bit = 0;
540 }
541 }
542 }
543
544 //----- (0046A080) --------------------------------------------------------
545 void Mouse::Activate(int bActive)
546 {
547 bActive = bActive;
548 }
549
550 //----- (0046A08A) --------------------------------------------------------
551 void Mouse::SetMouseClick(int x, int y)
552 {
553 uMouseClickX = x;
554 uMouseClickY = y;
555 }
556
557
558 //----- (00409E3D) --------------------------------------------------------
559 void AsyncMouse::_409E3D(char a2)
560 {
561 if ( *((unsigned char *)this + 128) & 1 )
562 *((unsigned char *)this + 103) = 1;
563 else
564 *((unsigned char *)this + 103) = 0;
565 if ( a2 )
566 *((unsigned int *)this + 32) |= 1u;
567 else
568 *((unsigned int *)this + 32) &= 0xFFFFFFFEu;
569 }
570
571 //----- (00465C2C) --------------------------------------------------------
572 void AsyncMouse::Release()
573 {
574 if (pAsyncMouse)
575 {
576 pAsyncMouse->Suspend();
577 if (pAsyncMouse)
578 (**(void (__stdcall ***)(int))pAsyncMouse)(1);
579 }
580 pAsyncMouse = 0;
581 }
582
583
584
585
586 //----- (0046ACA9) --------------------------------------------------------
587 AsyncMouse::AsyncMouse(IDirectDrawSurface *a2)
588 {
589 IDirectDrawSurface *v2; // eax@1
590 void *v3; // esi@1
591 char *v4; // edi@1
592 double v5; // ST14_8@3
593 double v6; // ST14_8@3
594
595 v2 = a2;
596 v3 = this;
597 *((int *)this + 16) = -1;
598 *((int *)this + 3) = (int)v2;
599 LOBYTE(v2) = BYTE3(a2);
600 v4 = (char *)this + 104;
601 *((int *)this + 1) = 0;
602 *((char *)this + 20) = 0;
603 *((int *)this + 17) = 0;
604 *((int *)this + 18) = 0;
605 *((char *)this + 88) = 1;
606 *((char *)this + 91) = 0;
607 *((char *)this + 93) = 0;
608 *((char *)this + 94) = 0;
609 *((char *)this + 95) = 0;
610 *((char *)this + 96) = 0;
611 *((char *)this + 97) = 0;
612 *((char *)this + 98) = 0;
613 *((char *)this + 99) = 0;
614 *((char *)this + 100) = 0;
615 *((char *)this + 101) = 0;
616 *((char *)this + 102) = 0;
617 *((char *)this + 104) = (char)v2;
618 *((int *)this + 27) = (int)AsyncMouse::unk_46BD09(0, 0);
619 *((int *)v4 + 2) = 0;
620 *((char *)v3 + 116) = BYTE3(a2);
621 *((int *)v3 + 30) = (int)AsyncMouse::unk_46BD09(0, 0);
622 *((int *)v3 + 31) = 0;
623 *((int *)v3 + 32) = 0;
624 *((int *)v3 + 33) = 0;
625 *(int *)v3 = 5080880;
626 if ( !Initialize(this) )
627 {
628 MessageBoxW(nullptr, L"Could not initialize CMouseAsync object", nullptr, 0);
629 }
630 *((int *)v3 + 12) = 0;
631 *((int *)v3 + 13) = 0;
632 *((int *)v3 + 14) = 0;
633 *((int *)v3 + 15) = 0;
634 v5 = (float)0.0 + 6.7553994e15;
635 *((int *)v3 + 10) = LODWORD(v5);
636 v6 = (float)0.0 + 6.7553994e15;
637 a2 = (IDirectDrawSurface *)LODWORD(v6);
638 *((int *)v3 + 32) |= 1u;
639 *((int *)v3 + 11) = LODWORD(v6);
640 *((char *)v3 + 103) = 1;
641 }
642 // 4DBD94: using guessed type int dword_4DBD94;
643
644
645
646 //----- (0046ADE2) --------------------------------------------------------
647 AsyncMouse::~AsyncMouse()
648 {
649 void *v1; // esi@1
650 char *v2; // edi@1
651 int v3; // ecx@1
652
653 v1 = this;
654 //*(int *)this = AsyncMouse_pvdtor;
655 v2 = (char *)this + 132;
656 v3 = *((int *)this + 33);
657 if ( v3 )
658 (**(void (__stdcall ***)(int))v3)(1);
659 *(int *)v2 = 0;
660 TerminateThread(*((HANDLE *)v1 + 4), 0xFAu);
661 SetWindowPos(hWnd, (HWND)0xFFFFFFFE, uWindowX, uWindowY, 640, 480, 0);
662 //AsyncMouse::dtor_sub_46BC73((int)((char *)v1 + 116));
663 //AsyncMouse::dtor_sub_46BC73((int)((char *)v1 + 104));
664 }
665 // 4D8730: using guessed type int (__stdcall *AsyncMouse_pvdtor[2])(char);
666
667
668
669
670
671
672
673
674
675
676
677
678
679 //----- (0046AE6E) --------------------------------------------------------
680 char AsyncMouse::Initialize(LPVOID lpParameter)
681 {
682 void *v1; // esi@1
683 char result; // al@2
684
685 v1 = lpParameter;
686 if ( LoadCursorImage() && _46B072() )
687 result = CreateDisrectInputMouse() != 0;
688 else
689 result = 0;
690 return result;
691 }
692
693 //----- (0046AE97) --------------------------------------------------------
694 char AsyncMouse::LoadCursor(const char *pContainer)
695 {
696 __debugbreak();
697 return 0;
698 /*
699 void *v2; // esi@1
700 int v3; // eax@1
701 HRESULT v4; // eax@1
702 char result; // al@3
703 HRESULT a2; // [sp+8h] [bp-B0h]@1
704 int v7; // [sp+58h] [bp-60h]@1
705 char v9; // [sp+B4h] [bp-4h]@1
706
707 v2 = this;
708 EnterCriticalSection(&pGame->pThreadWardInstance->cs2);
709 v3 = *((int *)v2 + 1);
710 a2 = 100;
711 v7 = 0;
712 v4 = (*(int (__stdcall **)(int, int, int, int, signed int, HRESULT *))(*(int *)v3 + 20))(
713 v3,
714 0,
715 0,
716 0,
717 1024,
718 &a2);
719 ErrHR(v4, "DirectInput", __FUNCTION__, __FILE__, __LINE__);
720
721 Texture thisa; // [sp+6Ch] [bp-4Ch]@1
722 //Texture::Texture(&thisa);
723
724 if ( pIcons_LOD->LoadTextureFromLOD(&thisa, pContainer, TEXTURE_16BIT_PALETTE) != -1
725 && DrawCursor(&thisa, *((IDirectDrawSurface4 **)v2 + 1), 0) )
726 {
727 thisa.Release();
728 LeaveCriticalSection(&pGame->pThreadWardInstance->cs2);
729 result = 1;
730 }
731 else
732 {
733 result = 0;
734 }
735 return result;*/
736 }
737
738 //----- (0046AF50) --------------------------------------------------------
739 char AsyncMouse::LoadCursorImage()
740 {
741 void *v1; // ebx@1
742 int v2; // eax@2
743 int v3; // esi@4
744 char result; // al@5
745 //const char *v5; // eax@6
746 //std::string v6; // [sp-18h] [bp-12Ch]@9
747 const char *v7; // [sp-8h] [bp-11Ch]@9
748 int v8; // [sp-4h] [bp-118h]@9
749 DDSURFACEDESC2 Dst; // [sp+Ch] [bp-108h]@1
750 int v10; // [sp+88h] [bp-8Ch]@2
751 int v11; // [sp+8Ch] [bp-88h]@2
752 int v12; // [sp+90h] [bp-84h]@2
753 int v13; // [sp+94h] [bp-80h]@2
754 char v14; // [sp+D0h] [bp-44h]@2
755 int v15; // [sp+F0h] [bp-24h]@2
756 int v16; // [sp+104h] [bp-10h]@4
757 int v17; // [sp+108h] [bp-Ch]@4
758 std::string *v18; // [sp+10Ch] [bp-8h]@9
759 int a3; // [sp+113h] [bp-1h]@9
760
761 v1 = this;
762 memset(&Dst, 0, 0x7Cu);
763 Dst.dwSize = 124;
764 if ( pRenderer->pDirectDraw4->GetDisplayMode(&Dst)
765 || (memset(&v10, 0, 0x7Cu),
766 v10 = 124,
767 v11 = 4103,
768 v15 = 2112,
769 v12 = 32,
770 v13 = 32,
771 v2 = *((int *)v1 + 3),
772 memcpy(&v14, &Dst.ddpfPixelFormat, 0x20u),
773 (*(int (__stdcall **)(int, int *, char *, int))(**(int **)v2 + 24))(
774 *(int *)v2,
775 &v10,
776 (char *)v1 + 4,
777 0))
778 || (*(int (__stdcall **)(int, int *, char *, int))(***((int ***)v1 + 3) + 24))(
779 **((int **)v1 + 3),
780 &v10,
781 (char *)v1 + 8,
782 0)
783 || (v3 = *((int *)v1 + 1),
784 v16 = 0,
785 v17 = 0,
786 (*(int (__stdcall **)(int, signed int, int *))(*(int *)v3 + 116))(v3, 8, &v16)) )
787 {
788 result = 0;
789 return false;
790 }
791 else
792 {
793 if ( !LoadCursor("micon1") )
794 {
795 MessageBoxW(nullptr, L"Could not load async mouse cursor image", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:182", 0);
796 }
797 result = 1;
798 return true;
799 }
800 return result;
801 }
802 // 4D86F0: using guessed type int dword_4D86F0;
803
804 //----- (0046B072) --------------------------------------------------------
805 char AsyncMouse::_46B072()
806 {
807 DWORD v1; // esi@1
808 HANDLE v2; // eax@1
809 char result; // al@2
810 DWORD ThreadId; // [sp+0h] [bp-4h]@1
811
812 ThreadId = (DWORD)this;
813 v1 = (DWORD)this;
814 v2 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)AsyncMouseThread, this, 4u, &ThreadId);
815 *(int *)(v1 + 16) = (int)v2;
816 if ( v2 )
817 result = SetThreadPriority(v2, 15) != 0;
818 else
819 result = 0;
820 return result;
821 }
822
823 //----- (0046B0A9) --------------------------------------------------------
824 char AsyncMouse::CreateDisrectInputMouse()
825 {
826 __debugbreak();
827 /*
828 void *v1; // esi@1
829 DirectInputMouse *v2; // ecx@1
830 DirectInputMouse *v3; // eax@2
831
832 v1 = this;
833 v2 = (DirectInputMouse *)operator new(0x2Cu);
834 if ( v2 )
835 v3 = DirectInputMouse::DirectInputMouse(v2);
836 else
837 v3 = 0;
838 *((int *)v1 + 33) = v3;
839 return v3 != 0;*/
840 return 0;
841 }
842
843 //----- (0046B0ED) --------------------------------------------------------
844 int AsyncMouse::_46B0ED()
845 {
846 __debugbreak();
847 /*
848 int v1; // esi@1
849 int v2; // ecx@1
850 int result; // eax@2
851
852 v1 = this + 132;
853 v2 = *(int *)(this + 132);
854 if ( v2 )
855 result = (**(int (__stdcall ***)(int))v2)(1);
856 *(int *)v1 = 0;
857 return result;*/
858 return 0;
859 }
860 // 46B0ED: using guessed type int __thiscall AsyncMouse__46B0ED(int);
861
862 //----- (0046B105) --------------------------------------------------------
863 void AsyncMouse::Resume()
864 {
865 __debugbreak();
866 /*
867 void *v1; // esi@1
868
869 v1 = this;
870 EnterCriticalSection(&pGame->pThreadWardInstance->cs3);
871 AsyncMouse::CreateDisrectInputMouse(v1);
872 AsyncMouse::Clip();
873 ResumeThread(*((HANDLE *)v1 + 4));
874 *((char *)v1 + 88) = 0;
875 LeaveCriticalSection(&pGame->pThreadWardInstance->cs3);*/
876 }
877
878 //----- (0046B14F) --------------------------------------------------------
879 void AsyncMouse::Suspend()
880 {
881 void *v1; // esi@1
882 Vis *v2; // eax@3
883 std::string v3; // [sp-18h] [bp-24h]@2
884 const char *v4; // [sp-8h] [bp-14h]@2
885 int v5; // [sp-4h] [bp-10h]@2
886 std::string *v6; // [sp+4h] [bp-8h]@2
887 int a3; // [sp+Bh] [bp-1h]@2
888
889 v1 = this;
890 if ( *((int *)this + 33) )
891 {
892 v2 = pGame->pVisInstance;
893 if ( v2 )
894 v2->stru1.uNumPointers = 0;
895 EnterCriticalSection(&pGame->pThreadWardInstance->cs3);
896 SuspendThread(*((HANDLE *)v1 + 4));
897 _46B0ED();
898 LeaveCriticalSection(&pGame->pThreadWardInstance->cs3);
899 }
900 else
901 {
902 MessageBoxW(nullptr, L"DI_Mouse pointer invalid; bailing out from suspend()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:233", 0);
903 }
904 }
905 // 46B0ED: using guessed type int __thiscall AsyncMouse__46B0ED(int);
906
907 //----- (0046B1DD) --------------------------------------------------------
908 char AsyncMouse::_46B1DD()
909 {
910 *((char *)this + 20) = 1;
911 Sleep(118);
912 return 1;
913 }
914
915 //----- (0046B1EC) --------------------------------------------------------
916 bool AsyncMouse::DrawCursor(Texture *a1, IDirectDrawSurface4 *a2, int a3)
917 {
918 __debugbreak();
919 /*
920 bool result; // eax@1
921 unsigned __int16 *v5; // ebx@2
922 unsigned __int8 *v6; // edx@2
923 int v7; // esi@2
924 int v8; // ecx@2
925 LPVOID v9; // edi@2
926 int v10; // ecx@5
927 DDSURFACEDESC2 Dst; // [sp+0h] [bp-84h]@1
928 __int32 v12; // [sp+7Ch] [bp-8h]@3
929 int v13; // [sp+80h] [bp-4h]@3
930
931 Dst.dwSize = 124;
932 result = pRenderer->LockSurface_DDraw4(a2, &Dst, 1u);
933 if ( result )
934 {
935 v5 = a1->pPalette16;
936 v6 = a1->pLevelOfDetail0;
937 v7 = a1->uTextureWidth;
938 v8 = a1->uTextureHeight;
939 v9 = Dst.lpSurface;
940 if ( v8 > 0 )
941 {
942 v12 = 2 * (Dst.lPitch / 2 - v7);
943 v13 = v8;
944 do
945 {
946 if ( v7 > 0 )
947 {
948 v10 = v7;
949 do
950 {
951 if ( v5[*v6] )
952 *(short *)v9 = v5[*v6];
953 v9 = (char *)v9 + 2;
954 ++v6;
955 --v10;
956 }
957 while ( v10 );
958 }
959 v9 = (char *)v9 + v12;
960 --v13;
961 }
962 while ( v13 );
963 }
964 result = a2->Unlock(
965 v6,
966 a2,
967 a3);
968 }
969 LOBYTE(result) = 1;
970 return result;*/
971 return 0;
972 }
973
974 //----- (0046B289) --------------------------------------------------------
975 bool AsyncMouse::_46B289(int a2, char a3)
976 {
977 char v3; // dl@1
978 bool result; // eax@33
979 char v5; // [sp+2h] [bp-2h]@1
980 char v6; // [sp+3h] [bp-1h]@1
981
982 v3 = *((char *)this + 93);
983 v6 = *((char *)this + 94);
984 v5 = *((char *)this + 95);
985 if ( a3 & 1 )
986 {
987 *((char *)this + 93) = 1;
988 }
989 else
990 {
991 if ( v3 )
992 *((char *)this + 99) = 1;
993 else
994 *((char *)this + 99) = 0;
995 *((char *)this + 93) = 0;
996 }
997 if ( a3 & 2 )
998 {
999 *((char *)this + 94) = 1;
1000 }
1001 else
1002 {
1003 if ( v6 )
1004 *((char *)this + 100) = 1;
1005 else
1006 *((char *)this + 100) = 0;
1007 *((char *)this + 94) = 0;
1008 }
1009 if ( a3 & 4 )
1010 {
1011 *((char *)this + 95) = 1;
1012 }
1013 else
1014 {
1015 if ( v5 )
1016 *((char *)this + 101) = 1;
1017 else
1018 *((char *)this + 101) = 0;
1019 *((char *)this + 95) = 0;
1020 }
1021 *((char *)this + 96) = v3 != *((char *)this + 93);
1022 *((char *)this + 97) = v6 != *((char *)this + 94);
1023 *((char *)this + 98) = v5 != *((char *)this + 95);
1024 if ( *((char *)this + 99) && *((char *)this + 96) || *((char *)this + 100) && *((char *)this + 97) )
1025 *((char *)this + 102) = 1;
1026 LOBYTE(result) = 1;
1027 return result;
1028 }
1029
1030 //----- (0046B342) --------------------------------------------------------
1031 void AsyncMouse::SetHotspot(float hotspotx, float hotspoty)
1032 {
1033 double v3; // ST00_8@1
1034 double v4; // ST00_8@1
1035
1036 v3 = hotspotx + 6.7553994e15;
1037 *(int *)(this + 40) = LODWORD(v3);
1038 v4 = hotspoty + 6.7553994e15;
1039 *(int *)(this + 44) = LODWORD(v4);
1040 }
1041
1042 //----- (0046B37C) --------------------------------------------------------
1043 int AsyncMouse::UpdateData(int a2)
1044 {
1045 __debugbreak();
1046 /*
1047 void *v2; // edi@1
1048 int result; // eax@2
1049 int v4; // eax@3
1050 int v5; // esi@3
1051 std::string v6; // [sp-18h] [bp-28h]@2
1052 const char *v7; // [sp-8h] [bp-18h]@2
1053 int v8; // [sp-4h] [bp-14h]@2
1054 std::string *v9; // [sp+8h] [bp-8h]@2
1055 int a3; // [sp+Fh] [bp-1h]@2
1056
1057 v2 = this;
1058 if ( *((int *)this + 33) )
1059 {
1060 EnterCriticalSection(&pGame->pThreadWardInstance->cs3);
1061 DirectInputMouse::_43BB89(*((DirectInputMouse **)v2 + 33));
1062 v4 = *((int *)v2 + 33);
1063 v5 = v4 + 32;
1064 _46B289(v4 + 32, *(int *)(v4 + 40));
1065 LeaveCriticalSection(&pGame->pThreadWardInstance->cs3);
1066 result = a2;
1067 *(int *)a2 = *(int *)v5;
1068 *(int *)(a2 + 4) = *(int *)(v5 + 4);
1069 }
1070 else
1071 {
1072 MessageBoxW(nullptr, L"DI_Mouse pointer invalid bailing out from update_mouse_data()", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:446", 0);
1073 result = a2;
1074 *(int *)a2 = 0;
1075 *(int *)(a2 + 4) = 0;
1076 }
1077 return result;*/
1078 return 0;
1079 }
1080
1081 //----- (0046B420) --------------------------------------------------------
1082 char AsyncMouse::Thread()
1083 {
1084 void *v1; // esi@1
1085 char result; // al@2
1086 int v3; // eax@3
1087 int v4; // ecx@3
1088 int v5; // eax@3
1089 int v6; // ecx@3
1090 int v7; // [sp+4h] [bp-8h]@3
1091 int v8; // [sp+8h] [bp-4h]@3
1092
1093 v1 = this;
1094 if ( *((char *)this + 20) )
1095 {
1096 result = 0;
1097 }
1098 else
1099 {
1100 UpdateData((int)&v7);
1101 _46BA8D(v7, v8);
1102 _46B958(v7 - *((int *)v1 + 10), v8 - *((int *)v1 + 11));
1103 _46B492((int)&v7);
1104 _46B5D5((int)&v7);
1105 v3 = v7;
1106 v4 = v8;
1107 *((int *)v1 + 6) = v7;
1108 v5 = v3 - *((int *)v1 + 10);
1109 *((int *)v1 + 7) = v4;
1110 v6 = v4 - *((int *)v1 + 11);
1111 *((int *)v1 + 8) = v5;
1112 result = 1;
1113 *((int *)v1 + 9) = v6;
1114 }
1115 return result;
1116 }
1117
1118 //----- (0046B492) --------------------------------------------------------
1119 void AsyncMouse::_46B492(int a2)
1120 {
1121 __debugbreak();
1122 /*
1123 void *v2; // edi@1
1124 int v3; // esi@3
1125 int v4; // eax@5
1126 int v5; // ecx@5
1127 int v6; // eax@8
1128 int v7; // ecx@8
1129 int v8; // eax@11
1130 int v9; // esi@11
1131 int v10; // [sp+Ch] [bp-1Ch]@5
1132 int v11; // [sp+10h] [bp-18h]@5
1133 int v12; // [sp+14h] [bp-14h]@5
1134 int v13; // [sp+18h] [bp-10h]@5
1135 int v14; // [sp+24h] [bp-4h]@5
1136
1137 v2 = this;
1138 EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
1139 if ( *((int *)v2 + 28) > 0x80u )
1140 _46BCAB((char *)v2 + 104);
1141 v3 = a2;
1142 if ( *((char *)v2 + 93) && *((char *)v2 + 96) )
1143 {
1144 v4 = *(int *)a2;
1145 v5 = *(int *)(a2 + 4);
1146 v13 = 1;
1147 v10 = 5080884;
1148 v11 = v4;
1149 v12 = v5;
1150 v14 = 0;
1151 AsyncMouse::unk_46BCD2((char *)v2 + 104, (int)&a2, *((int *)v2 + 27), (int)&v10);
1152 v14 = -1;
1153 }
1154 if ( *((char *)v2 + 94) && *((char *)v2 + 97) )
1155 {
1156 v6 = *(int *)v3;
1157 v7 = *(int *)(v3 + 4);
1158 v13 = 2;
1159 v10 = 5080884;
1160 v11 = v6;
1161 v12 = v7;
1162 v14 = 1;
1163 AsyncMouse::unk_46BCD2((char *)v2 + 104, (int)&a2, *((int *)v2 + 27), (int)&v10);
1164 v14 = -1;
1165 }
1166 if ( *((char *)v2 + 95) && *((char *)v2 + 98) )
1167 {
1168 v8 = *(int *)v3;
1169 v9 = *(int *)(v3 + 4);
1170 v13 = 4;
1171 v10 = 5080884;
1172 v11 = v8;
1173 v12 = v9;
1174 v14 = 2;
1175 AsyncMouse::unk_46BCD2((char *)v2 + 104, (int)&a2, *((int *)v2 + 27), (int)&v10);
1176 }
1177 LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
1178 }
1179
1180 //----- (0046B5D5) --------------------------------------------------------
1181 void AsyncMouse::_46B5D5(int a2)
1182 {
1183 __debugbreak();
1184 /*
1185 void *v2; // esi@1
1186 DWORD v3; // eax@3
1187 char v4; // zf@3
1188 int v5; // edi@3
1189 int v6; // eax@6
1190 int v7; // ecx@6
1191 int v8; // eax@11
1192 int v9; // ecx@11
1193 int v10; // eax@16
1194 int v11; // edi@16
1195 int (__stdcall **v12)(char); // [sp+Ch] [bp-20h]@6
1196 int v13; // [sp+10h] [bp-1Ch]@6
1197 int v14; // [sp+14h] [bp-18h]@6
1198 int v15; // [sp+18h] [bp-14h]@6
1199 DWORD v16; // [sp+1Ch] [bp-10h]@3
1200 int v17; // [sp+28h] [bp-4h]@6
1201
1202 v2 = this;
1203 EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
1204 if ( *((int *)v2 + 31) > 0x80u )
1205 _46BCAB((char *)v2 + 116);
1206 v3 = timeGetTime();
1207 v4 = *((char *)v2 + 93) == 0;
1208 v5 = a2;
1209 v16 = v3;
1210 if ( !v4 && *((char *)v2 + 96) )
1211 {
1212 if ( v3 - *((int *)v2 + 19) < 0xFA )
1213 {
1214 v6 = *(int *)a2;
1215 v7 = *(int *)(a2 + 4);
1216 v15 = 1;
1217 v12 = &AsyncMouse::unk::vdtor_ptr;
1218 v13 = v6;
1219 v14 = v7;
1220 v17 = 0;
1221 AsyncMouse::unk_46BCD2((char *)v2 + 116, (int)&a2, *((int *)v2 + 30), (int)&v12);
1222 v17 = -1;
1223 v3 = v16;
1224 }
1225 *((int *)v2 + 19) = v3;
1226 }
1227 if ( *((char *)v2 + 94) && *((char *)v2 + 97) )
1228 {
1229 if ( v3 - *((int *)v2 + 20) < 0xFA )
1230 {
1231 v8 = *(int *)v5;
1232 v9 = *(int *)(v5 + 4);
1233 v15 = 2;
1234 //v12 = &AsyncMouse::unk::vdtor_ptr;
1235 v13 = v8;
1236 v14 = v9;
1237 v17 = 1;
1238 AsyncMouse::unk_46BCD2((char *)v2 + 116, (int)&a2, *((int *)v2 + 30), (int)&v12);
1239 v17 = -1;
1240 v3 = v16;
1241 }
1242 *((int *)v2 + 20) = v3;
1243 }
1244 if ( *((char *)v2 + 95) && *((char *)v2 + 98) )
1245 {
1246 if ( v3 - *((int *)v2 + 21) < 0xFA )
1247 {
1248 v10 = *(int *)v5;
1249 v11 = *(int *)(v5 + 4);
1250 v15 = 4;
1251 //v12 = &AsyncMouse::unk::vdtor_ptr;
1252 v13 = v10;
1253 v14 = v11;
1254 v17 = 2;
1255 AsyncMouse::unk_46BCD2((char *)v2 + 116, (int)&a2, *((int *)v2 + 30), (int)&v12);
1256 v3 = v16;
1257 }
1258 *((int *)v2 + 21) = v3;
1259 }
1260 LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
1261 }
1262
1263 //----- (0046B736) --------------------------------------------------------
1264 void AsyncMouse::_46B736_consume_click_lists(char a2)
1265 {
1266 __debugbreak();
1267 /*
1268 void *v2; // esi@1
1269
1270 v2 = this;
1271 _46B76F();
1272 _46B879();
1273 if ( a2 )
1274 {
1275 _46BCAB((char *)v2 + 104);
1276 _46BCAB((char *)v2 + 116);
1277 }
1278 if ( *((char *)v2 + 102) )
1279 {
1280 back_to_game();
1281 *((char *)v2 + 102) = 0;
1282 }*/
1283 }
1284
1285 //----- (0046B76F) --------------------------------------------------------
1286 void AsyncMouse::_46B76F()
1287 {
1288 __debugbreak();
1289 /*
1290 char *v0; // ebx@1
1291 int v1; // eax@1
1292 int v2; // edi@1
1293 int v3; // eax@2
1294 unsigned int *v4; // esi@2
1295 unsigned int v5; // ST08_4@7
1296 unsigned int v6; // ST04_4@7
1297 float v7; // ST00_4@7
1298 unsigned int v8; // ST08_4@9
1299 unsigned int v9; // ST04_4@9
1300 float v10; // ST00_4@9
1301
1302 EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
1303 v0 = (char *)pAsyncMouse + 108;
1304 v1 = *((int *)pAsyncMouse + 27);
1305 v2 = *(int *)v1;
1306 if ( *(int *)v1 != v1 )
1307 {
1308 do
1309 {
1310 v3 = *(int *)(v2 + 20);
1311 v4 = (unsigned int *)(v2 + 12);
1312 if ( v3 & 1 )
1313 {
1314 pGame->PickMouse(512.0, *v4, *(int *)(v2 + 16), 0, &a3, &a4);
1315 if ( GetCurrentMenuID() == 6 )
1316 sub_41CD4F(0x29u);
1317 UI_OnMouseLeftClick((int *)(v2 + 12));
1318 }
1319 else
1320 {
1321 if ( v3 & 2 )
1322 {
1323 v5 = *(int *)(v2 + 16);
1324 v6 = *v4;
1325 v7 = GetPickDepth();
1326 pGame->PickMouse(v7, v6, v5, 0, &stru_F93E30, &a5);
1327 sub_416D62_ShowPopupWindow_MonsterRecord_ItemInfo_etcsub_416D62((Vec2_int_ *)(v2 + 12));
1328 }
1329 else
1330 {
1331 if ( v3 & 4 )
1332 {
1333 v8 = *(int *)(v2 + 16);
1334 v9 = *v4;
1335 v10 = GetPickDepth();
1336 pGame->PickMouse(v10, v9, v8, 1, &a3, &a5);
1337 }
1338 }
1339 }
1340 v2 = *(int *)v2;
1341 }
1342 while ( v2 != *(int *)v0 );
1343 }
1344 LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
1345 }
1346
1347 //----- (0046B879) --------------------------------------------------------
1348 void AsyncMouse::_46B879()
1349 {
1350 __debugbreak();
1351 /*
1352 char *v0; // ebx@1
1353 int v1; // eax@1
1354 int v2; // edi@1
1355 int v3; // eax@2
1356 unsigned int *v4; // esi@2
1357 unsigned int v5; // ST08_4@5
1358 unsigned int v6; // ST04_4@5
1359 float v7; // ST00_4@5
1360
1361 EnterCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);
1362 v0 = (char *)pAsyncMouse + 120;
1363 v1 = *((int *)pAsyncMouse + 30);
1364 v2 = *(int *)v1;
1365 if ( *(int *)v1 != v1 )
1366 {
1367 do
1368 {
1369 v3 = *(int *)(v2 + 20);
1370 v4 = (unsigned int *)(v2 + 12);
1371 if ( v3 & 1 )
1372 {
1373 pGame->PickMouse(512.0, *v4, *(int *)(v2 + 16), 0, &a3, &a4);
1374 sub_4178C4();
1375 }
1376 else
1377 {
1378 if ( v3 & 2 )
1379 {
1380 v5 = *(int *)(v2 + 16);
1381 v6 = *v4;
1382 v7 = GetPickDepth();
1383 pGame->PickMouse(v7, v6, v5, 0, &stru_F93E30, &a4);
1384 sub_4178E1();
1385 }
1386 else
1387 {
1388 if ( v3 & 4 )
1389 nullsub_1();
1390 }
1391 }
1392 v2 = *(int *)v2;
1393 }
1394 while ( v2 != *(int *)v0 );
1395 }
1396 LeaveCriticalSection(&pGame->pThreadWardInstance->csAsyncMouse);*/
1397 }
1398
1399 //----- (0046B944) --------------------------------------------------------
1400 int AsyncMouse::_46B944()
1401 {
1402 __debugbreak();
1403 /*
1404 void *v1; // esi@1
1405
1406 v1 = this;
1407 _46BCAB((char *)this + 104);
1408 return _46BCAB((char *)v1 + 116);*/
1409 return 0;
1410 }
1411 // 46BCAB: using guessed type int __thiscall AsyncMouse__46BCAB(int);
1412
1413 //----- (0046B958) --------------------------------------------------------
1414 char AsyncMouse::_46B958(int a2, int a3)
1415 {
1416 __debugbreak();
1417 /*
1418 void *v3; // esi@1
1419 char result; // al@3
1420 int v5; // edx@6
1421 int v6; // eax@6
1422 int v7; // eax@12
1423 int v8; // edi@13
1424 int v9; // eax@19
1425 struct IDirectDrawSurface4 *v10; // ST08_4@21
1426 DDBLTFX v11; // [sp+4h] [bp-74h]@21
1427 RECT v12; // [sp+68h] [bp-10h]@19
1428
1429 v3 = this;
1430 if ( pRenderer->pFrontBuffer4 && !pRenderer->pFrontBuffer4->IsLost() )
1431 {
1432 EnterCriticalSection(&pGame->pThreadWardInstance->cs2);
1433 if ( *((char *)v3 + 88) )
1434 pRenderer->pFrontBuffer4->BltFast(
1435 *((int *)v3 + 8),
1436 *((int *)v3 + 9),
1437 (LPDIRECTDRAWSURFACE4)*((int *)v3 + 2),
1438 (LPRECT)((char *)v3 + 48),
1439 16u);
1440 v5 = 640 - a2;
1441 v6 = 640 - a2;
1442 if ( 640 - a2 >= 31 )
1443 v6 = 31;
1444 if ( v6 >= 0 )
1445 {
1446 if ( v5 >= 31 )
1447 v5 = 31;
1448 }
1449 else
1450 {
1451 v5 = 0;
1452 }
1453 v7 = 480 - a3;
1454 if ( 480 - a3 >= 31 )
1455 v8 = 31;
1456 else
1457 v8 = 480 - a3;
1458 if ( v8 >= 0 )
1459 {
1460 if ( v7 >= 31 )
1461 v7 = 31;
1462 }
1463 else
1464 {
1465 v7 = 0;
1466 }
1467 *((int *)v3 + 13) = 0;
1468 *((int *)v3 + 14) = v5;
1469 v12.right = a2 + v5;
1470 *((int *)v3 + 12) = 0;
1471 *((int *)v3 + 15) = v7;
1472 v12.left = a2;
1473 v12.bottom = a3 + v7;
1474 v9 = *((int *)v3 + 2);
1475 v12.top = a3;
1476 (*(void (__stdcall **)(int, int, int, IDirectDrawSurface4 *, RECT *, signed int))(*(int *)v9 + 28))(
1477 v9,
1478 0,
1479 0,
1480 pRenderer->pFrontBuffer4,
1481 &v12,
1482 16);
1483 if ( !*((char *)v3 + 90) || *((char *)v3 + 128) & 1 )
1484 {
1485 v10 = (struct IDirectDrawSurface4 *)*((int *)v3 + 1);
1486 v11.dwSize = 100;
1487 v11.dwDDFX = 8;
1488 pRenderer->pFrontBuffer4->Blt(
1489 &v12,
1490 v10,
1491 (LPRECT)((char *)v3 + 48),
1492 16812032u,
1493 &v11);
1494 }
1495 *((char *)v3 + 88) = 1;
1496 LeaveCriticalSection(&pGame->pThreadWardInstance->cs2);
1497 result = 1;
1498 }
1499 else
1500 {
1501 result = 0;
1502 }
1503 return result;*/
1504 return 0;
1505 }
1506
1507 //----- (0046BA8D) --------------------------------------------------------
1508 char AsyncMouse::_46BA8D(int a2, int a3)
1509 {
1510 __debugbreak();
1511 /*
1512 void *v3; // esi@1
1513 DWORD v4; // eax@1
1514
1515 v3 = this;
1516 v4 = timeGetTime();
1517 if ( v4 - *((int *)v3 + 16) <= 0x32 )
1518 {
1519 *((char *)v3 + 91) = *((char *)v3 + 90) == 1;
1520 *((char *)v3 + 90) = 0;
1521 }
1522 else
1523 {
1524 if ( *((char *)v3 + 90) )
1525 *((char *)v3 + 91) = 0;
1526 else
1527 *((char *)v3 + 91) = 1;
1528 *((char *)v3 + 90) = 1;
1529 }
1530 if ( a2 != *((int *)v3 + 17) || a3 != *((int *)v3 + 18) )
1531 {
1532 *((int *)v3 + 16) = v4;
1533 *((int *)v3 + 17) = a2;
1534 *((int *)v3 + 18) = a3;
1535 }
1536 return *((char *)v3 + 90);*/
1537 return 0;
1538 }
1539
1540 //----- (0046BAEC) --------------------------------------------------------
1541 void AsyncMouse::_46BAEC()
1542 {
1543 void *v1; // esi@1
1544
1545 v1 = this;
1546 EnterCriticalSection(&pGame->pThreadWardInstance->cs2);
1547 *((char *)v1 + 88) = 0;
1548 }
1549
1550 //----- (0046BB0A) --------------------------------------------------------
1551 void AsyncMouse::_46BB0A()
1552 {
1553 __debugbreak();
1554 /*
1555 void *v1; // esi@1
1556 int v2; // eax@1
1557 int v3; // edx@1
1558 int v4; // ecx@1
1559 int v5; // edx@1
1560 int v6; // eax@1
1561 char v7; // zf@1
1562 struct IDirectDrawSurface4 *v8; // ST08_4@8
1563 int v9; // [sp+8h] [bp-74h]@8
1564 int v10; // [sp+Ch] [bp-70h]@8
1565 int v11; // [sp+6Ch] [bp-10h]@1
1566 int v12; // [sp+70h] [bp-Ch]@1
1567 int v13; // [sp+74h] [bp-8h]@1
1568 int v14; // [sp+78h] [bp-4h]@1
1569
1570 v1 = this;
1571 v2 = *((int *)this + 17) - *((int *)this + 10);
1572 v3 = *((int *)this + 14);
1573 v4 = *((int *)this + 18) - *((int *)this + 11);
1574 v11 = v2;
1575 v5 = v2 + v3;
1576 v6 = *((int *)v1 + 15);
1577 v12 = v4;
1578 v7 = *((char *)v1 + 90) == 0;
1579 v13 = v5;
1580 v14 = v4 + v6;
1581 if ( v7 || *((char *)v1 + 128) & 1 )
1582 {
1583 if ( *((char *)v1 + 88) )
1584 pRenderer->pFrontBuffer4->BltFast(
1585 *((int *)v1 + 8),
1586 *((int *)v1 + 9),
1587 (LPDIRECTDRAWSURFACE4)*((int *)v1 + 2),
1588 (LPRECT)((char *)v1 + 48),
1589 16u);
1590 (*(void (__stdcall **)(int, int, int, IDirectDrawSurface4 *, int *, signed int))(**((int **)v1 + 2) + 28))(
1591 *((int *)v1 + 2),
1592 0,
1593 0,
1594 pRenderer->pFrontBuffer4,
1595 &v11,
1596 16);
1597 }
1598 if ( *((char *)v1 + 90) && !(*((char *)v1 + 128) & 1) )
1599 {
1600 v8 = (struct IDirectDrawSurface4 *)*((int *)v1 + 1);
1601 v9 = 100;
1602 v10 = 8;
1603 pRenderer->pFrontBuffer4->Blt(
1604 (LPRECT)&v11,
1605 v8,
1606 (LPRECT)((char *)v1 + 48),
1607 16812032u,
1608 (LPDDBLTFX)&v9);
1609 }
1610 LeaveCriticalSection(&pGame->pThreadWardInstance->cs2);*/
1611 }
1612
1613 //----- (0046BBD0) --------------------------------------------------------
1614 void *AsyncMouse::Clip()
1615 {
1616 __debugbreak();
1617 /*
1618 void *result; // eax@1
1619 std::string v1; // [sp-18h] [bp-30h]@2
1620 const char *v2; // [sp-8h] [bp-20h]@2
1621 int v3; // [sp-4h] [bp-1Ch]@2
1622 RECT Rect; // [sp+0h] [bp-18h]@1
1623 std::string *v5; // [sp+10h] [bp-8h]@2
1624 int a3; // [sp+17h] [bp-1h]@2
1625
1626 SetWindowPos(hWnd, HWND_MESSAGE|0x2, 320, 240, 640, 480, 0);
1627 Rect.left = 325;
1628 Rect.top = 245;
1629 Rect.right = 326;
1630 Rect.bottom = 246;
1631 result = (void *)ClipCursor(&Rect);
1632 if ( !result )
1633 {
1634 MessageBoxW(nullptr, L"Could not clip cursor to screen!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\MouseAsync.cpp:827", 0);
1635 }
1636 return result;*/
1637 return 0;
1638 }
1639
1640 //----- (0046BC4E) --------------------------------------------------------
1641 void __stdcall AsyncMouse::AsyncMouseThread(int a1)
1642 {
1643 __debugbreak();
1644 /*
1645 while ( 1 )
1646 {
1647 while ( !pAsyncMouse )
1648 Sleep(1);
1649 if ( !AsyncMouse::Thread(pAsyncMouse) )
1650 ExitThread(0);
1651 Sleep(18);
1652 }*/
1653 }
1654
1655 //----- (0046BC73) --------------------------------------------------------
1656 void AsyncMouse::dtor_sub_46BC73()
1657 {
1658 __debugbreak();
1659 /*
1660 int v1; // edi@1
1661 void **v2; // ebx@1
1662 void *v3; // esi@1
1663 void *v4; // eax@2
1664 int v5; // [sp+0h] [bp-4h]@1
1665
1666 v5 = this;
1667 v1 = this;
1668 v2 = *(void ***)(this + 4);
1669 v3 = *v2;
1670 while ( v3 != v2 )
1671 {
1672 v4 = v3;
1673 v3 = *(void **)v3;
1674 AsyncMouse::unk_46BD2D((void *)v1, (int)&v5, v4);
1675 }
1676 free(*(void **)(v1 + 4));
1677 *(int *)(v1 + 4) = 0;
1678 *(int *)(v1 + 8) = 0;*/
1679 }
1680
1681 //----- (0046BCAB) --------------------------------------------------------
1682 int AsyncMouse::_46BCAB()
1683 {
1684 __debugbreak();
1685 /*
1686 void *v1; // ebx@1
1687 void **v2; // edi@1
1688 void *v3; // esi@1
1689 void *v4; // eax@2
1690 int result; // eax@2
1691 int v6; // [sp+0h] [bp-4h]@1
1692
1693 v6 = this;
1694 v1 = (void *)this;
1695 v2 = *(void ***)(this + 4);
1696 v3 = *v2;
1697 while ( v3 != v2 )
1698 {
1699 v4 = v3;
1700 v3 = *(void **)v3;
1701 result = AsyncMouse::unk_46BD2D(v1, (int)&v6, v4);
1702 }
1703 return result;*/
1704 return 0;
1705 }
1706 // 46BCAB: using guessed type int __thiscall AsyncMouse__46BCAB(int);
1707
1708 //----- (0046BCD2) --------------------------------------------------------
1709 int AsyncMouse::unk_46BCD2(int a2, int a3, int a4)
1710 {
1711 __debugbreak();
1712 /*
1713 void *v4; // edi@1
1714 void *v5; // eax@1
1715 void *v6; // esi@1
1716 int result; // eax@1
1717
1718 v4 = this;
1719 v5 = AsyncMouse::unk_46BD09((void *)a3, *(void **)(a3 + 4));
1720 v6 = v5;
1721 *(int *)(a3 + 4) = v5;
1722 **((int **)v5 + 1) = v5;
1723 AsyncMouse::unk_46BD66((char *)v5 + 8, a4);
1724 result = a2;
1725 ++*((int *)v4 + 2);
1726 *(int *)a2 = v6;
1727 return result;*/
1728 return 0;
1729 }
1730 // 46BD66: using guessed type int __fastcall AsyncMouse__unk__46BD66(int, int);
1731
1732 //----- (0046BD09) --------------------------------------------------------
1733 void *AsyncMouse::unk_46BD09(void *a1, void *a2)
1734 {
1735 __debugbreak();
1736 /*
1737 void *result; // eax@1
1738 void *v3; // ecx@1
1739 void *v4; // ecx@3
1740
1741 result = operator new(0x18u);
1742 v3 = a1;
1743 if ( !a1 )
1744 v3 = result;
1745 *(int *)result = v3;
1746 v4 = a2;
1747 if ( !a2 )
1748 v4 = result;
1749 *((int *)result + 1) = v4;
1750 return result;*/
1751 return 0;
1752 }
1753
1754 //----- (0046BD2D) --------------------------------------------------------
1755 int AsyncMouse::unk_46BD2D(int a2, void *a3)
1756 {
1757 __debugbreak();
1758 /*
1759 void *v3; // edi@1
1760 int v4; // ebx@1
1761 int result; // eax@1
1762
1763 v3 = this;
1764 v4 = *(int *)a3;
1765 **((int **)a3 + 1) = *(int *)a3;
1766 *(int *)(*(int *)a3 + 4) = *((int *)a3 + 1);
1767 (**((void (__stdcall ***)(int))a3 + 2))(0);
1768 free(a3);
1769 result = a2;
1770 --*((int *)v3 + 2);
1771 *(int *)a2 = v4;
1772 return result;*/
1773 return 0;
1774 }
1775
1776 //----- (0046BD66) --------------------------------------------------------
1777 int AsyncMouse::unk_46BD66(int a1, int a2)
1778 {
1779 int result; // eax@2
1780
1781 if ( a1 )
1782 {
1783 *(int *)(a1 + 4) = *(int *)(a2 + 4);
1784 *(int *)(a1 + 8) = *(int *)(a2 + 8);
1785 result = *(int *)(a2 + 12);
1786 *(int *)(a1 + 12) = result;
1787 //*(int *)a1 = &AsyncMouse::unk::vdtor_ptr;
1788 }
1789 return result;
1790 }
1791 // 46BD66: using guessed type int __fastcall AsyncMouse__unk__46BD66(int, int);
1792 // 4D8734: using guessed type int (__stdcall *AsyncMouse__unk__vdtor_ptr)(char);
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812 /*
1813 //----- (0043B9FF) --------------------------------------------------------
1814 DirectInputMouse *__thiscall DirectInputMouse::DirectInputMouse(DirectInputMouse *this)
1815 {
1816 DirectInputMouse *v1; // esi@1
1817 HRESULT v2; // eax@5
1818 signed int v4; // [sp-18h] [bp-24h]@3
1819 char *v5; // [sp-14h] [bp-20h]@3
1820 int v6; // [sp-10h] [bp-1Ch]@3
1821 const char *v7; // [sp-Ch] [bp-18h]@3
1822 int v8; // [sp-8h] [bp-14h]@3
1823 unsigned int v9; // [sp-4h] [bp-10h]@3
1824 CheckHRESULT_stru0 v10; // [sp+8h] [bp-4h]@5
1825
1826 v1 = this;
1827 this->field_8 = 0;
1828 LOBYTE(this->field_1C) = 0;
1829 this->field_28 = 0;
1830 this->vdestructor_ptr = (int)&DirectInputMouse_pvdtor;
1831 if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 )
1832 {
1833 v9 = 1;
1834 v8 = 30;
1835 v7 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp";
1836 v6 = 0;
1837 v5 = (char *)&this->pDirectInput;
1838 v4 = 1280;
1839 }
1840 else
1841 {
1842 v9 = 1;
1843 v8 = 28;
1844 v7 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp";
1845 v6 = 0;
1846 v5 = (char *)&this->pDirectInput;
1847 v4 = 768;
1848 }
1849 v2 = DirectInputCreateA(hInstance, v4, v5, v6);
1850 CheckHRESULT(&v10, v2, v7, v8, v9);
1851 DirectInputMouse::CreateDevice(v1);
1852 DirectInputMouse::43BB18(v1);
1853 v1->field_20 = 0;
1854 v1->field_24 = 0;
1855 return v1;
1856 }
1857 // 4C8880: using guessed type int __stdcall DirectInputCreateA(int, int, int, int);
1858 // 4D8608: using guessed type int (__stdcall *DirectInputMouse_pvdtor)(char);
1859
1860 //----- (0043BA80) --------------------------------------------------------
1861 void *__thiscall DirectInputMouse::vdtor(void *this, bool a2)
1862 {
1863 void *v2; // esi@1
1864
1865 v2 = this;
1866 DirectInputMouse::dtor(this);
1867 if ( a2 & 1 )
1868 free(v2);
1869 return v2;
1870 }
1871
1872 //----- (0043BA9C) --------------------------------------------------------
1873 int __thiscall DirectInputMouse::dtor(void *this)
1874 {
1875 void *v1; // esi@1
1876 int v2; // eax@1
1877 int result; // eax@3
1878
1879 v1 = this;
1880 v2 = *((int *)this + 2);
1881 *(int *)this = &DirectInputMouse_pvdtor;
1882 if ( v2 )
1883 {
1884 (*(void (__stdcall **)(int))(*(int *)v2 + 32))(v2);
1885 (*(void (__stdcall **)(int))(**((int **)v1 + 2) + 8))(*((int *)v1 + 2));
1886 *((int *)v1 + 2) = 0;
1887 }
1888 result = (*(int (__stdcall **)(int))(**((int **)v1 + 1) + 8))(*((int *)v1 + 1));
1889 *((int *)v1 + 1) = 0;
1890 return result;
1891 }
1892 // 4D8608: using guessed type int (__stdcall *DirectInputMouse_pvdtor)(char);
1893
1894 //----- (0043BACE) --------------------------------------------------------
1895 void __thiscall DirectInputMouse::CreateDevice(DirectInputMouse *this)
1896 {
1897 DirectInputMouse *v1; // esi@1
1898 HRESULT v2; // eax@1
1899 CheckHRESULT_stru0 v3; // [sp+4h] [bp-4h]@1
1900
1901 v1 = this;
1902 v2 = ((int (__stdcall *)(int, int, int, int, int))this->pDirectInput->lpVtbl->field_10)(
1903 this->pDirectInput,
1904 2,
1905 DirectInputMouse_enumerator,
1906 this,
1907 1);
1908 CheckHRESULT(&v3, v2, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 57, 1u);
1909 if ( !LOBYTE(v1->field_1C) )
1910 {
1911 v3.vdestructor_ptr = (void (__thiscall ***)(CheckHRESULT_stru0 *, bool))"Error: No mouse found";
1912 _CxxThrowException((int)&v3, (int)&dword_4DBD94);
1913 }
1914 }
1915 // 43BC61: using guessed type int __stdcall DirectInputMouse_enumerator(int, int);
1916 // 4DBD94: using guessed type int dword_4DBD94;
1917
1918 //----- (0043BB18) --------------------------------------------------------
1919 int __thiscall DirectInputMouse::43BB18(DirectInputMouse *this)
1920 {
1921 char *v1; // esi@1
1922 HRESULT v2; // eax@1
1923 HRESULT v3; // eax@1
1924 HRESULT v4; // eax@1
1925 unsigned int v6; // [sp+0h] [bp-Ch]@0
1926 CheckHRESULT_stru0 v7; // [sp+8h] [bp-4h]@1
1927
1928 v1 = (char *)&this->field_8;
1929 v2 = ((int (__stdcall *)(int, int, int, int, int))this->pDirectInput->lpVtbl->field_C)(
1930 this->pDirectInput,
1931 &this->field_C,
1932 &this->field_8,
1933 0,
1934 "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp");
1935 CheckHRESULT(&v7, v2, (const char *)0x40, 1, v6);
1936 v3 = (*(int (__stdcall **)(int, int))(**(int **)v1 + 44))(*(int *)v1, dword_4C9920);
1937 CheckHRESULT(&v7, v3, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 65, 1u);
1938 v4 = (*(int (__stdcall **)(int, int, int))(**(int **)v1 + 52))(*(int *)v1, hWnd, 6);
1939 CheckHRESULT(&v7, v4, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 66, 1u);
1940 return (*(int (__cdecl **)(int))(**(int **)v1 + 28))(*(int *)v1);
1941 }
1942 // 4C9920: using guessed type int dword_4C9920[16];
1943
1944 //----- (0043BB89) --------------------------------------------------------
1945 bool __thiscall DirectInputMouse::43BB89(DirectInputMouse *this)
1946 {
1947 DirectInputMouse *v1; // esi@1
1948 bool result; // eax@1
1949 HRESULT v3; // eax@5
1950 __int32 v4; // ecx@6
1951 __int32 v5; // eax@6
1952 __int32 v6; // edx@6
1953 int v7; // ecx@12
1954 bool v8; // ecx@12
1955 signed int v9; // edx@12
1956 HRESULT a2; // [sp+4h] [bp-14h]@3
1957 int v11; // [sp+8h] [bp-10h]@12
1958 char v12; // [sp+10h] [bp-8h]@18
1959 char v13; // [sp+11h] [bp-7h]@20
1960 char v14; // [sp+12h] [bp-6h]@22
1961 char v15; // [sp+13h] [bp-5h]@24
1962 char v18; // [sp+14h] [bp-4h]@5
1963
1964 v1 = this;
1965 result = this->field_8;
1966 if ( result )
1967 {
1968 if ( (*(int (__stdcall **)(bool, signed int, HRESULT *))(*(int *)result + 36))(result, 16, &a2) == -2147024866
1969 && !(*(int (__stdcall **)(int))(*(int *)v1->field_8 + 28))(v1->field_8) )
1970 {
1971 v3 = (*(int (__stdcall **)(int, signed int, HRESULT *))(*(int *)v1->field_8 + 36))(v1->field_8, 16, &a2);
1972 CheckHRESULT((CheckHRESULT_stru0 *)&v18, v3, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\DirectInputMouse.cpp", 80, 1u);
1973 }
1974 v4 = v1->field_20 + a2;
1975 v5 = 640;
1976 v6 = v1->field_20 + a2;
1977 if ( v4 >= 640 )
1978 v6 = 640;
1979 if ( v6 >= 0 )
1980 {
1981 if ( v4 < 640 )
1982 v5 = v1->field_20 + a2;
1983 }
1984 else
1985 {
1986 v5 = 0;
1987 }
1988 v7 = v11;
1989 v1->field_20 = v5;
1990 v8 = v1->field_24 + v7;
1991 result = 480;
1992 v9 = v8;
1993 if ( v8 >= 480 )
1994 v9 = 480;
1995 if ( v9 >= 0 )
1996 {
1997 if ( v8 < 480 )
1998 result = v8;
1999 }
2000 else
2001 {
2002 result = 0;
2003 }
2004 v1->field_28 = 0;
2005 v1->field_24 = result;
2006 if ( v12 & 0x80 )
2007 v1->field_28 = 1;
2008 if ( v13 & 0x80 )
2009 v1->field_28 |= 2u;
2010 if ( v14 & 0x80 )
2011 v1->field_28 |= 4u;
2012 if ( v15 & 0x80 )
2013 v1->field_28 |= 8u;
2014 LOBYTE(result) = 1;
2015 }
2016 else
2017 {
2018 LOBYTE(result) = 0;
2019 }
2020 return result;
2021 }
2022
2023 //----- (0043BC61) --------------------------------------------------------
2024 signed int __stdcall DirectInputMouse_enumerator(int a1, int a2)
2025 {
2026 signed int result; // eax@2
2027
2028 if ( *(char *)(a1 + 36) & 2 )
2029 {
2030 *(int *)(a2 + 12) = *(int *)(a1 + 4);
2031 *(int *)(a2 + 16) = *(int *)(a1 + 8);
2032 *(int *)(a2 + 20) = *(int *)(a1 + 12);
2033 *(int *)(a2 + 24) = *(int *)(a1 + 16);
2034 *(char *)(a2 + 28) = 1;
2035 result = 0;
2036 }
2037 else
2038 {
2039 result = 1;
2040 }
2041 return result;
2042 }
2043 // 43BC61: using guessed type int __stdcall DirectInputMouse_enumerator(int, int);
2044 */