Mercurial > mm7
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 */ |