Advertisement
Guest User

npvox.dll decompilation

a guest
Oct 27th, 2016
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 274.51 KB | None | 0 0
  1. /* This file has been generated by the Hex-Rays decompiler.
  2.    Copyright (c) 2007-2016 Hex-Rays <info@hex-rays.com>
  3.  
  4.    Detected compiler: Visual C++
  5. */
  6.  
  7. #include <windows.h>
  8. #include <math.h>
  9. #include <defs.h>
  10.  
  11.  
  12. //-------------------------------------------------------------------------
  13. // Function declarations
  14.  
  15. #define __thiscall __cdecl // Test compile in C mode
  16.  
  17. int sub_10001000();
  18. signed __int16 __stdcall NP_GetEntryPoints(int a1);
  19. __int16 __stdcall NP_Initialize(int a1);
  20. __int16 NP_Shutdown();
  21. int __cdecl sub_10001479(int a1);
  22. int __cdecl sub_10001498(int a1);
  23. int sub_100014D6();
  24. BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
  25. __int16 sub_1000152F();
  26. // int unknown_libname_1(void); weak
  27. signed __int16 __cdecl sub_10001552(int a1, int *a2, __int16 a3, __int16 a4, int a5, int a6, int a7);
  28. signed __int16 __cdecl sub_100017D0(int *a1, _DWORD *a2);
  29. signed __int16 __cdecl sub_100018EF(int *a1, _DWORD *a2);
  30. int __cdecl sub_10001C27(int a1, int a2);
  31. signed __int16 __cdecl sub_10001CB5(int *a1, int a2, int a3, int a4, _WORD *a5);
  32. int __cdecl sub_10001D01(int *a1);
  33. int __cdecl sub_10001D2B(int *a1, int a2, int a3, int a4);
  34. signed __int16 __cdecl sub_10001D59(int *a1);
  35. char *__cdecl sub_10001D9D(int a1, int a2, char *Source);
  36. void __cdecl sub_10001E74(int *a1, int a2);
  37. LRESULT __stdcall sub_10001FAF(HWND hWnd, int a2, int a3, LPARAM lParam);
  38. int __cdecl sub_10002026(int a1);
  39. // int unknown_libname_2(void); weak
  40. // int unknown_libname_3(); weak
  41. void *__cdecl sub_100020B0(size_t Size);
  42. int __cdecl sub_100020E8(int a1, int a2, DWORD nNumberOfBytesToRead);
  43. int __cdecl sub_1000210C(int a1, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite);
  44. int __cdecl sub_10002130(int a1, LONG lDistanceToMove, DWORD dwMoveMethod);
  45. int __cdecl sub_10002154(int a1);
  46. void __cdecl sub_10002170(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9);
  47. void sub_10002439();
  48. void __cdecl sub_100024B8(int a1);
  49. int __cdecl sub_100029CC(unsigned __int8 a1, unsigned __int8 a2, unsigned __int8 a3);
  50. int sub_10002A07();
  51. int sub_10002CEE();
  52. int __cdecl sub_10002E35(int a1);
  53. int __cdecl sub_10002F85(int a1, float *a2);
  54. int __cdecl sub_100030DA(int a1, int a2);
  55. float *__cdecl sub_1000325B(float *a1, float *a2);
  56. float *__cdecl sub_10003399(int a1, int a2);
  57. void *__cdecl sub_10003490(int a1, int a2);
  58. __int16 __cdecl sub_100036F1(void *Dst, int a2, size_t Size);
  59. // int __cdecl sub_1000375D(_DWORD); weak
  60. // int __cdecl sub_10003768(_DWORD); weak
  61. int __cdecl sub_10003780(int, HWND hWnd, int, int, int, int, int, int, int, int); // idb
  62. void sub_10003824();
  63. LRESULT __stdcall sub_10003842(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  64. void __cdecl __noreturn sub_10003C72(LPCSTR lpText);
  65. void __cdecl sub_10003CA1(void *lpvBits, __int16 a2, __int16 a3, __int16 a4, __int16 a5, __int16 a6, __int16 a7);
  66. int sub_10003D40();
  67. char __cdecl sub_10003E80(_DWORD *a1);
  68. int sub_10003EF0();
  69. void *sub_10003F10();
  70. _DWORD *__cdecl sub_10003F20(int a1, const void *a2, const void *a3, int a4);
  71. int __cdecl sub_10004180(int a1);
  72. int __cdecl sub_100042B0(int a1, int a2, int a3, int a4);
  73. int __cdecl sub_10004F50(int, int, int, int, int, int, float, float, char); // idb
  74. int __cdecl sub_100053E0(int, int, int, int, int, float, float, char); // idb
  75. int __cdecl sub_10005960(int a1, __int16 a2, float *a3, float *a4);
  76. float *__cdecl sub_10005C30(int a1, int a2, int a3, float a4, int a5);
  77. double __cdecl sub_10005C80(float *a1, float *a2, float *a3, float a4, int a5);
  78. unsigned int __cdecl sub_10005D20(const char *a1);
  79. void __cdecl sub_10005D50(float *a1, float *a2, float *a3, float *a4, float *a5, float *a6);
  80. double __cdecl sub_100061C0(float *a1);
  81. void *__cdecl sub_100063D0(int a1);
  82. int __cdecl sub_10006570(_DWORD *a1);
  83. int __cdecl sub_10006690(int, float, char); // idb
  84. signed __int16 __cdecl sub_10006810(int a1, int *a2);
  85. signed __int16 __cdecl sub_10006840(int a1, int a2, int a3);
  86. unsigned int __cdecl sub_10006880(const char *a1);
  87. int __cdecl sub_100068B0(int a1, int a2);
  88. signed __int16 __cdecl sub_100068E0(int a1, int a2, int a3);
  89. signed __int16 __cdecl sub_10006940(int a1, int *a2, int a3);
  90. signed __int16 __cdecl sub_10006AE0(int a1, int *a2, int a3);
  91. signed __int16 __cdecl sub_10006D60(int a1, int *a2, int a3);
  92. signed __int16 __cdecl sub_10006EE0(int a1, int *a2, int a3);
  93. signed __int16 __cdecl sub_10006FB0(int a1, int *a2, int a3, int a4);
  94. char __cdecl sub_10007150(int a1, unsigned __int8 *a2);
  95. int __cdecl sub_10007240(int a1, int a2);
  96. int __cdecl sub_100072A0(int a1, int a2, int a3);
  97. float *__cdecl sub_100072D0(float *a1, float *a2);
  98. int __cdecl sub_100074D0(int a1, int a2, int a3);
  99. float *__cdecl sub_10007560(float *a1, float *a2, float *a3);
  100. float *__cdecl sub_100075C0(float *a1, float *a2, float *a3);
  101. float *__cdecl sub_100075F0(float *a1, float *a2, float *a3);
  102. int __cdecl sub_10007620(int, float, int); // idb
  103. void __cdecl sub_10007670(float *a1, float *a2);
  104. float *__cdecl sub_10007700(float *a1, float *a2, float *a3);
  105. bool __cdecl sub_10007970(int a1, float a2, int a3);
  106. int __cdecl sub_10007A80(int a1, int a2, int a3, int a4, int *a5);
  107. int __cdecl sub_10007B39(int a1, int a2, int a3, int a4, unsigned int *a5);
  108. _WORD *__cdecl sub_10007C34(unsigned int a1, __int16 a2, unsigned int a3, _WORD *a4, int a5);
  109. // int __usercall sub_10007C9B@<eax>(int result@<eax>, int a2, char a3, int a4, int a5);
  110. unsigned int sub_10007CF1();
  111. unsigned int sub_10007D89();
  112. int __cdecl sub_10007E30(int a1, float *a2, _WORD *a3);
  113. int __cdecl sub_100082A0(int, int, int, float); // idb
  114. // int __usercall sub_10008940@<eax>(int a1@<ecx>, int a2@<esi>, int a3, float *a4, _WORD *a5);
  115. int __cdecl sub_10008DE0(int a1, float *a2, _WORD *a3);
  116. int __cdecl sub_10009250(int, int, int, float); // idb
  117. // int __usercall sub_100098E0@<eax>(int a1@<ecx>, int a2@<esi>, int a3, float *a4, _WORD *a5);
  118. int __cdecl sub_10009D80(int, int, float, float, int, int); // idb
  119. int __cdecl sub_10009F20(int, int, float, float, int, int); // idb
  120. int __cdecl sub_1000A0D0(int, int, float, float, int, int); // idb
  121. int __cdecl sub_1000A230(int, int, float, float, int, int); // idb
  122. int __cdecl sub_1000A3D0(int, int, float, float, int, int); // idb
  123. int __cdecl sub_1000A580(int, int, float, float, int, int); // idb
  124. _WORD *__cdecl sub_1000A6E0(int a1, int a2, float a3, float a4, int a5);
  125. _WORD *__cdecl sub_1000A880(int a1, int a2, float a3, float a4, int a5);
  126. int __cdecl sub_1000AA20(int, int, float, float, int); // idb
  127. int __cdecl sub_1000AE50(int, int, float, float); // idb
  128. int sub_1000B120();
  129. signed __int16 sub_1000B7A0();
  130. int __cdecl sub_1000B800(signed __int16 *a1, signed __int16 *a2);
  131. int __cdecl sub_1000BD10(int a1, int a2);
  132. int __cdecl sub_1000BE60(int a1, int a2);
  133. unsigned int __cdecl sub_1000BE70(int a1, int a2);
  134. int __cdecl sub_1000BF58(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  135. unsigned int __cdecl sub_1000C05D(int a1, int a2);
  136. int __cdecl sub_1000C18E(int a1, int a2);
  137. _WORD *__cdecl sub_1000C27D(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  138. int __cdecl sub_1000C38C(int a1, int a2);
  139. unsigned int __cdecl sub_1000C4F0(int a1, int a2);
  140. unsigned int __cdecl sub_1000C5D0(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  141. unsigned int __cdecl sub_1000C6D0(int a1, int a2);
  142. int __cdecl sub_1000C7F9(int a1, int a2);
  143. _BYTE *__cdecl sub_1000C8DF(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  144. int __cdecl sub_1000C9E5(int a1, int a2);
  145. unsigned int __cdecl sub_1000CB30(int a1, int a2);
  146. int __cdecl sub_1000CC1C(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  147. unsigned int __cdecl sub_1000CD2D(int a1, int a2);
  148. int __cdecl sub_1000CE65(int a1, int a2);
  149. _WORD *__cdecl sub_1000CF54(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  150. int __cdecl sub_1000D063(int a1, int a2);
  151. unsigned int __cdecl sub_1000D1C0(int a1, int a2);
  152. int __cdecl sub_1000D2A4(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  153. unsigned int __cdecl sub_1000D3B0(int a1, int a2);
  154. int __cdecl sub_1000D4DD(int a1, int a2);
  155. _BYTE *__cdecl sub_1000D5C3(int a1, int a2, int a3, __int16 a4, unsigned int a5);
  156. int __cdecl sub_1000D6C9(int a1, int a2);
  157. // int __cdecl atoi(const char *Str);
  158. // char *__cdecl strcpy(char *Dest, const char *Source);
  159. // size_t __cdecl strlen(const char *Str);
  160. // void *__cdecl malloc(size_t Size);
  161. // void __cdecl free(void *Memory);
  162. // void *__cdecl memset(void *Dst, int Val, size_t Size);
  163. // int __cdecl fabs(double); idb
  164. double __cdecl sub_10010090(_DWORD, _DWORD); // weak
  165. double __cdecl sub_1001009A(_DWORD, _DWORD); // weak
  166. // void __cdecl __noreturn exit(int Code);
  167. // int __thiscall unknown_libname_6(_DWORD, _DWORD); weak
  168. // double __stdcall unknown_libname_9(_DWORD); weak
  169. // double __stdcall unknown_libname_12(_DWORD); weak
  170. // double __stdcall unknown_libname_13(_DWORD); weak
  171. // double __usercall unknown_libname_25@<st0>(double@<st0>); weak
  172. // int __cdecl _ctrandisp1(double); idb
  173. int __cdecl sub_100170F0(int a1);
  174. // double __usercall sub_10017410@<st0>(long double a1@<st1>, long double a2@<st0>);
  175. int sub_1001744C(void); // weak
  176. // double _rtpiby2(void); weak
  177. int sub_100174A8();
  178. // _DWORD __cdecl _ld12cvt(_DWORD, _DWORD, _DWORD); weak
  179. int __cdecl sub_1001A9D0(int a1, int a2);
  180. int __cdecl sub_1001AA00(int a1, int a2);
  181. int __cdecl sub_1001AB00(int a1, int a2);
  182. int __cdecl sub_1001AB80(int a1, int a2);
  183. // int chsifnegret(void); weak
  184. // int __cdecl _write(int, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite); idb
  185. // int __cdecl _lseek(int, LONG lDistanceToMove, DWORD dwMoveMethod); idb
  186. // _DWORD __cdecl __strgtold12(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
  187. // _DWORD __cdecl _close(_DWORD); weak
  188. // int __cdecl _strcmpi(const char *Str1, const char *Str2);
  189. // int __cdecl _read(int, int, DWORD nNumberOfBytesToRead); idb
  190. // _DWORD __cdecl _tell(_DWORD); weak
  191. // _DWORD __cdecl _open(LPCSTR lpFileName, _DWORD);
  192. // HPALETTE __stdcall SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd);
  193. // int __stdcall SetDIBitsToDevice(HDC hdc, int xDest, int yDest, DWORD w, DWORD h, int xSrc, int ySrc, UINT StartScan, UINT cLines, const void *lpvBits, const BITMAPINFO *lpbmi, UINT ColorUse);
  194. // HPALETTE __stdcall CreatePalette(const LOGPALETTE *plpal);
  195. // BOOL __stdcall DeleteObject(HGDIOBJ ho);
  196. // UINT __stdcall RealizePalette(HDC hdc);
  197. // HPEN __stdcall ExtCreatePen(DWORD iPenStyle, DWORD cWidth, const LOGBRUSH *plbrush, DWORD cStyle, const DWORD *pstyle);
  198. // BOOL __stdcall Rectangle(HDC hdc, int left, int top, int right, int bottom);
  199. // HGDIOBJ __stdcall SelectObject(HDC hdc, HGDIOBJ h);
  200. // BOOL __stdcall SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
  201. // BOOL __stdcall InvalidateRect(HWND hWnd, const RECT *lpRect, BOOL bErase);
  202. // LONG __stdcall SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong);
  203. // UINT_PTR __stdcall SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
  204. // LRESULT __stdcall CallWindowProcA(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  205. // HWND __stdcall SetFocus(HWND hWnd);
  206. // void __stdcall PostQuitMessage(int nExitCode);
  207. // BOOL __stdcall KillTimer(HWND hWnd, UINT_PTR uIDEvent);
  208. // LRESULT __stdcall DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  209. // int __stdcall MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
  210. // int __stdcall ReleaseDC(HWND hWnd, HDC hDC);
  211. // HDC __stdcall GetDC(HWND hWnd);
  212. // HDC __stdcall BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
  213. // BOOL __stdcall EndPaint(HWND hWnd, const PAINTSTRUCT *lpPaint);
  214.  
  215. //-------------------------------------------------------------------------
  216. // Data declarations
  217.  
  218. _UNKNOWN loc_10010095; // weak
  219. int dword_1002A030 = 0; // weak
  220. int dword_1002A038 = 0; // weak
  221. int dword_1002A03C = 4294967295; // idb
  222. int dword_1002A040 = 4294967295; // idb
  223. int dword_1002A044 = 4294967295; // idb
  224. int dword_1002A048 = 4294967295; // idb
  225. int dword_1002A04C = 4294967295; // idb
  226. int dword_1002A050 = 4294967295; // idb
  227. int dword_1002A054 = 0; // weak
  228. int dword_1002A058 = 268435455; // weak
  229. char aWidth[] = "width"; // idb
  230. char aHeight[] = "height"; // idb
  231. char aBkgr_r[] = "bkgr_r"; // idb
  232. char aBkgr_g[] = "bkgr_g"; // idb
  233. char aBkgr_b[] = "bkgr_b"; // idb
  234. char aShdw_r[] = "shdw_r"; // idb
  235. char aShdw_g[] = "shdw_g"; // idb
  236. char aShdw_b[] = "shdw_b"; // idb
  237. __int16 dword_1002A0A0 = 640; // idb
  238. __int16 dword_1002A0A4 = 480; // idb
  239. int dword_1002A0A8 = 40; // weak
  240. int dword_1002A0AC = 164; // weak
  241. int dword_1002A0B0 = 200; // weak
  242. int dword_1002A0B4 = 12; // weak
  243. int dword_1002A0B8 = 124; // weak
  244. int dword_1002A0BC = 164; // weak
  245. int (__cdecl *off_1002A0C0)(size_t Size) = &sub_100020B0; // weak
  246. int dword_1002A0D8 = 0; // weak
  247. int dword_1002A0DC = 0; // weak
  248. int dword_1002A0E0 = 0; // weak
  249. char byte_1002A0E4 = '\0'; // weak
  250. int word_1002A0E8 = 0; // idb
  251. int word_1002A0EC = 0; // idb
  252. __int16 word_1002A0F0 = 0; // weak
  253. float flt_1002A0F4 =  0.098171875; // weak
  254. float flt_1002A0F8 =  0.0; // weak
  255. float flt_1002A0FC =  0.0; // weak
  256. float flt_1002A100 =  0.098171875; // weak
  257. float flt_1002A104 =  0.0; // weak
  258. float flt_1002A108 =  0.0; // weak
  259. float flt_1002A10C =  0.098171875; // weak
  260. float flt_1002A110 =  0.098171875; // weak
  261. CHAR Text[] = "Can not get scn handler"; // idb
  262. HPALETTE ho = NULL; // idb
  263. CHAR aFileOpenError[] = "File open error"; // idb
  264. CHAR Caption[] = "ERROR"; // idb
  265. int dword_1002A160 = 0; // weak
  266. _UNKNOWN unk_1002A168; // weak
  267. float flt_1002A170 =  0.1; // weak
  268. float flt_1002A17C =  0.1; // weak
  269. char *off_1002A18C = "Unsupported pixel size"; // weak
  270. char aSetupIsEmpty[15] = "Setup is empty"; // weak
  271. char aNoSetupParamet[19] = "No setup parameter"; // weak
  272. char aNoRoomForColor[24] = "No room for color table"; // weak
  273. char aNoRoomForHandl[20] = "No room for handler"; // weak
  274. char aNoRoomForInter[28] = "No room for internal buffer"; // weak
  275. char aNoColortabPara[22] = "No ColorTab parameter"; // weak
  276. char *off_1002A26C[4] = { "Bad file format", "Reading file", "No room", "Invalid color buffer depth" }; // weak
  277. char *off_1002A270[3] = { "Reading file", "No room", "Invalid color buffer depth" }; // weak
  278. char *off_1002A274[2] = { "No room", "Invalid color buffer depth" }; // weak
  279. char aNumberOfObject[27] = "Number of objects mismatch"; // weak
  280. int dword_1002A298 = 0; // weak
  281. _DWORD dword_1002A29C = 0; // idb
  282. int dword_1002A2A0 = 0; // weak
  283. int dword_1002A2A4 = 0; // weak
  284. int dword_1002A2A8 = 0; // weak
  285. int dword_1002A2AC = 0; // weak
  286. int dword_1002A2B0 = 0; // weak
  287. int dword_1002A2B4 = 0; // weak
  288. char byte_1002A2B8 = '\0'; // weak
  289. char byte_1002A2BC = '\0'; // weak
  290. char byte_1002A2C0 = '\0'; // weak
  291. char byte_1002A2D0[12] =
  292. {
  293.   '\0',
  294.   '\x02',
  295.   '\x06',
  296.   '\x02',
  297.   '\0',
  298.   '\b',
  299.   '\b',
  300.   '\x02',
  301.   '\x06',
  302.   '\x06',
  303.   '\0',
  304.   '\b'
  305. }; // idb
  306. _UNKNOWN unk_1002A2DC; // weak
  307. void *off_10036BE0 = &unk_1002A2E0; // weak
  308. int dword_10036C7C = 0; // weak
  309. int dword_10036CEC = 0; // weak
  310. _UNKNOWN unk_10038318; // weak
  311. _UNKNOWN unk_10038330; // weak
  312. int dword_100393D8 = 0; // weak
  313. int dword_100393DC = 0; // idb
  314. int dword_100393E0 = 0; // weak
  315. int dword_100393E4 = 0; // idb
  316. __int16 word_100393E8 = 0; // weak
  317. int dword_100393EC = 0; // weak
  318. int dword_100393F0 = 0; // weak
  319. float flt_100393F4 =  0.0; // weak
  320. int dword_100393F8 = 0; // weak
  321. float flt_100393FC =  0.0; // weak
  322. __int16 word_10039400; // idb
  323. float flt_10039408; // weak
  324. float flt_1003940C; // weak
  325. float flt_10039410; // weak
  326. int dword_10039414; // weak
  327. int dword_10039418; // weak
  328. int dword_1003941C; // weak
  329. int dword_10039420; // weak
  330. int dword_10039424; // weak
  331. int dword_10039428; // weak
  332. int dword_1003942C; // weak
  333. int dword_10039430; // weak
  334. int dword_10039434; // weak
  335. float flt_10039438; // weak
  336. float flt_1003943C; // weak
  337. float flt_10039440; // weak
  338. float flt_10039444; // weak
  339. __int16 word_10039448; // weak
  340. __int16 word_1003944A; // weak
  341. __int16 word_1003944C; // weak
  342. __int16 word_1003944E; // weak
  343. __int16 word_10039450; // weak
  344. __int16 word_10039452; // weak
  345. __int16 word_10039454; // weak
  346. __int16 word_10039456; // weak
  347. _UNKNOWN dword_10039458; // weak
  348. __int16 word_1003945C; // idb
  349. __int16 word_10039460; // idb
  350. int dword_10039468; // weak
  351. int dword_1003946C; // weak
  352. int dword_10039470; // weak
  353. int dword_10039474; // weak
  354. float flt_10039478; // weak
  355. float flt_1003947C; // weak
  356. float flt_10039480; // weak
  357. int dword_100394A8; // weak
  358. int dword_100394AC; // weak
  359. int dword_100394B0; // weak
  360. int dword_100394B4; // weak
  361. char byte_100394B8; // weak
  362. char byte_100394B9; // weak
  363. int dword_100394BA; // weak
  364. int dword_100394BE; // weak
  365. int dword_100394C2; // weak
  366. int dword_100394C6; // weak
  367. __int16 word_100394CA; // weak
  368. __int16 word_100394CC; // weak
  369. __int16 word_100394CE; // weak
  370. int dword_100394D0; // weak
  371. int (__cdecl *dword_100394D4)(_DWORD, _DWORD); // weak
  372. void *lpvBits; // idb
  373. void *Dst; // idb
  374. __int16 word_100394E0; // idb
  375. __int16 word_100394E2; // idb
  376. char byte_100394E4; // weak
  377. float flt_100394E8; // weak
  378. __int16 word_100394EC; // weak
  379. __int16 word_100394F0; // idb
  380. HDC Paint; // idb
  381. BITMAPINFO bmi; // idb
  382. int dword_10039768; // weak
  383. __int16 word_10039770; // weak
  384. __int16 word_10039772; // weak
  385. __int16 word_10039774; // weak
  386. __int16 word_10039776; // weak
  387. __int16 word_10039778; // weak
  388. __int16 word_1003977A; // weak
  389. __int16 word_1003977C; // weak
  390. __int16 word_1003977E; // weak
  391. __int16 word_10039780; // weak
  392. float flt_10039782; // weak
  393. float flt_10039786; // weak
  394. float flt_1003978A; // weak
  395. float flt_1003978E; // weak
  396. float flt_10039792; // weak
  397. float flt_10039796; // weak
  398. LOGPALETTE plpal; // idb
  399. HWND hWnd; // idb
  400. int dword_10039DEC; // weak
  401. int dword_10039DF0; // weak
  402. int dword_10039DF4; // weak
  403. _UNKNOWN unk_10039E00; // weak
  404. int dword_10039F00; // weak
  405. int dword_10039F04; // weak
  406. int dword_10039F10[]; // weak
  407. int dword_10039F14; // weak
  408. __int16 word_10039F18; // weak
  409. __int16 word_10039F1A; // weak
  410. int dword_10039F1C; // weak
  411. __int16 word_10039F20; // weak
  412. __int16 word_10039F22; // weak
  413. int dword_10039F24; // weak
  414. __int16 word_10039F28; // weak
  415. __int16 word_10039F2A; // weak
  416. int dword_10039F2C; // weak
  417. __int16 word_10039F30; // weak
  418. __int16 word_10039F32; // weak
  419. int dword_10039F34; // weak
  420. __int16 word_10039F38; // weak
  421. __int16 word_10039F3A; // weak
  422. int dword_10039F3C; // weak
  423. __int16 word_10039F40; // weak
  424. __int16 word_10039F42; // weak
  425. int dword_10039F44; // weak
  426. __int16 word_10039F48; // weak
  427. __int16 word_10039F4A; // weak
  428. int dword_10039F4C; // weak
  429. __int16 word_10039F50; // weak
  430. __int16 word_10039F52; // weak
  431. int dword_10039F54; // weak
  432. __int16 word_10039F58; // weak
  433. __int16 word_10039F5A; // weak
  434. int dword_10039F5C; // weak
  435. __int16 word_10039F60; // weak
  436. __int16 word_10039F62; // weak
  437. int dword_10039F64; // weak
  438. __int16 word_10039F68; // weak
  439. __int16 word_10039F6A; // weak
  440. int dword_10039F6C; // weak
  441. __int16 word_10039F70; // weak
  442. __int16 word_10039F72; // weak
  443. int dword_10039F74; // weak
  444. __int16 word_10039F78; // weak
  445. __int16 word_10039F7A; // weak
  446. int dword_10039F7C; // weak
  447. __int16 word_10039F80; // weak
  448. __int16 word_10039F82; // weak
  449. int dword_10039F84; // weak
  450. __int16 word_10039F88; // weak
  451. __int16 word_10039F8A; // weak
  452. int dword_10039F8C; // weak
  453. __int16 word_10039F90; // weak
  454. __int16 word_10039F92; // weak
  455. int dword_10039F94; // weak
  456. __int16 word_10039F98; // weak
  457. __int16 word_10039F9A; // weak
  458. int dword_10039F9C; // weak
  459. __int16 word_10039FA0; // weak
  460. __int16 word_10039FA2; // weak
  461. int dword_10039FA4; // weak
  462. __int16 word_10039FA8; // weak
  463. __int16 word_10039FAA; // weak
  464. int dword_10039FAC; // weak
  465. __int16 word_10039FB0; // weak
  466. __int16 word_10039FB2; // weak
  467. int dword_10039FB4; // weak
  468. __int16 word_10039FB8; // weak
  469. __int16 word_10039FBA; // weak
  470. int dword_10039FBC; // weak
  471. __int16 word_10039FC0; // weak
  472. __int16 word_10039FC2; // weak
  473. int dword_10039FC4; // weak
  474. __int16 word_10039FC8; // weak
  475. __int16 word_10039FCA; // weak
  476. int dword_10039FCC; // weak
  477. __int16 word_10039FD0; // weak
  478. __int16 word_10039FD2; // weak
  479. int dword_10039FD4; // weak
  480. __int16 word_10039FD8; // weak
  481. __int16 word_10039FDA; // weak
  482. int dword_10039FDC; // weak
  483. int dword_10039FE0; // weak
  484. int (__cdecl *dword_10039FF0)(_DWORD); // weak
  485. int (__cdecl *dword_10039FF4)(_DWORD); // weak
  486. int (__cdecl *dword_10039FF8)(_DWORD, _DWORD, _DWORD); // weak
  487.  
  488.  
  489. //----- (10001000) --------------------------------------------------------
  490. int sub_10001000()
  491. {
  492.   int v0; // ST18_4@2
  493.   int v2; // [esp+10h] [ebp-4h]@1
  494.  
  495.   v2 = unknown_libname_2();
  496.   if ( !v2 )
  497.     return 0;
  498.   v0 = sub_100014D6();
  499.   return (*(int (__cdecl **)(int, signed int, int))(*(_DWORD *)v0 + 40))(v0, 10, v2);
  500. }
  501. // 1000208C: using guessed type int unknown_libname_2(void);
  502.  
  503. //----- (10001049) --------------------------------------------------------
  504. signed __int16 __stdcall NP_GetEntryPoints(int a1)
  505. {
  506.   if ( !a1 )
  507.     return 3;
  508.   *(_WORD *)(a1 + 2) = 9;
  509.   *(_DWORD *)(a1 + 4) = sub_10001552;
  510.   *(_DWORD *)(a1 + 8) = sub_100017D0;
  511.   *(_DWORD *)(a1 + 12) = sub_100018EF;
  512.   *(_DWORD *)(a1 + 16) = sub_10001CB5;
  513.   *(_DWORD *)(a1 + 20) = sub_10001D59;
  514.   *(_DWORD *)(a1 + 24) = sub_10001D9D;
  515.   *(_DWORD *)(a1 + 28) = sub_10001D01;
  516.   *(_DWORD *)(a1 + 32) = sub_10001D2B;
  517.   *(_DWORD *)(a1 + 36) = sub_10001E74;
  518.   *(_DWORD *)(a1 + 40) = 0;
  519.   dword_100393D8 = a1;
  520.   return 0;
  521. }
  522. // 100393D8: using guessed type int dword_100393D8;
  523.  
  524. //----- (100010E6) --------------------------------------------------------
  525. __int16 __stdcall NP_Initialize(int a1)
  526. {
  527.   __int16 v2; // cx@5
  528.  
  529.   if ( !a1 )
  530.     return 3;
  531.   dword_1002A030 = a1;
  532.   if ( (signed int)*(unsigned __int8 *)(a1 + 3) > 0 )
  533.     return 8;
  534.   v2 = *(_WORD *)(dword_1002A030 + 2);
  535.   if ( (signed int)(unsigned __int8)v2 >= 9 )
  536.     *(_DWORD *)(dword_100393D8 + 44) = unknown_libname_3;
  537.   if ( (signed int)(unsigned __int8)v2 >= 9 )
  538.     *(_DWORD *)(dword_100393D8 + 48) = sub_10001000();
  539.   return sub_1000152F();
  540. }
  541. // 1000209E: using guessed type int unknown_libname_3();
  542. // 1002A030: using guessed type int dword_1002A030;
  543. // 100393D8: using guessed type int dword_100393D8;
  544.  
  545. //----- (10001176) --------------------------------------------------------
  546. __int16 NP_Shutdown()
  547. {
  548.   unknown_libname_1();
  549.   dword_1002A030 = 0;
  550.   return 0;
  551. }
  552. // 10001542: using guessed type int unknown_libname_1(void);
  553. // 1002A030: using guessed type int dword_1002A030;
  554.  
  555. //----- (10001479) --------------------------------------------------------
  556. int __cdecl sub_10001479(int a1)
  557. {
  558.   return (*(int (__cdecl **)(int))(dword_1002A030 + 36))(a1);
  559. }
  560. // 1002A030: using guessed type int dword_1002A030;
  561.  
  562. //----- (10001498) --------------------------------------------------------
  563. int __cdecl sub_10001498(int a1)
  564. {
  565.   return (*(int (__cdecl **)(int))(dword_1002A030 + 40))(a1);
  566. }
  567. // 1002A030: using guessed type int dword_1002A030;
  568.  
  569. //----- (100014D6) --------------------------------------------------------
  570. int sub_100014D6()
  571. {
  572.   return (*(int (**)(void))(dword_1002A030 + 52))();
  573. }
  574. // 1002A030: using guessed type int dword_1002A030;
  575.  
  576. //----- (10001510) --------------------------------------------------------
  577. BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  578. {
  579.   dword_100393E0 = (int)hinstDLL;
  580.   return 1;
  581. }
  582. // 100393E0: using guessed type int dword_100393E0;
  583.  
  584. //----- (1000152F) --------------------------------------------------------
  585. __int16 sub_1000152F()
  586. {
  587.   return 0;
  588. }
  589.  
  590. //----- (10001552) --------------------------------------------------------
  591. signed __int16 __cdecl sub_10001552(int a1, int *a2, __int16 a3, __int16 a4, int a5, int a6, int a7)
  592. {
  593.   __int16 v8; // [esp+Ch] [ebp-Ch]@1
  594.   int v9; // [esp+10h] [ebp-8h]@3
  595.   signed int i; // [esp+14h] [ebp-4h]@5
  596.  
  597.   v8 = 0;
  598.   if ( !a2 )
  599.     return 2;
  600.   *a2 = sub_10001479(24);
  601.   v9 = *a2;
  602.   if ( !*a2 )
  603.     return 5;
  604.   for ( i = 0; a4 > i; ++i )
  605.   {
  606.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aWidth) )
  607.       dword_100393E4 = atoi(*(const char **)(a6 + 4 * i));
  608.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aHeight) )
  609.       dword_100393DC = atoi(*(const char **)(a6 + 4 * i));
  610.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aBkgr_r) )
  611.       dword_1002A03C = atoi(*(const char **)(a6 + 4 * i));
  612.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aBkgr_g) )
  613.       dword_1002A040 = atoi(*(const char **)(a6 + 4 * i));
  614.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aBkgr_b) )
  615.       dword_1002A044 = atoi(*(const char **)(a6 + 4 * i));
  616.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aShdw_r) )
  617.       dword_1002A048 = atoi(*(const char **)(a6 + 4 * i));
  618.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aShdw_g) )
  619.       dword_1002A04C = atoi(*(const char **)(a6 + 4 * i));
  620.     if ( !_strcmpi(*(const char **)(a5 + 4 * i), aShdw_b) )
  621.       dword_1002A050 = atoi(*(const char **)(a6 + 4 * i));
  622.   }
  623.   *(_DWORD *)v9 = 0;
  624.   *(_DWORD *)(v9 + 4) = 0;
  625.   *(_WORD *)(v9 + 8) = a3;
  626.   *(_DWORD *)(v9 + 12) = 0;
  627.   *(_DWORD *)(v9 + 16) = a7;
  628.   *(_DWORD *)(v9 + 20) = 0;
  629.   return v8;
  630. }
  631.  
  632. //----- (100017D0) --------------------------------------------------------
  633. signed __int16 __cdecl sub_100017D0(int *a1, _DWORD *a2)
  634. {
  635.   int i; // [esp+Ch] [ebp-Ch]@11
  636.   __int16 v4; // [esp+10h] [ebp-8h]@1
  637.   int v5; // [esp+14h] [ebp-4h]@3
  638.  
  639.   v4 = 0;
  640.   if ( !a1 )
  641.     return 2;
  642.   v5 = *a1;
  643.   if ( *a1 )
  644.   {
  645.     if ( *(_DWORD *)(v5 + 4) )
  646.     {
  647.       if ( *(_DWORD *)(v5 + 12) )
  648.       {
  649.         SetWindowLongA(*(HWND *)(v5 + 4), -4, *(_DWORD *)(v5 + 12));
  650.         *(_DWORD *)(v5 + 12) = 0;
  651.       }
  652.       sub_10003824();
  653.     }
  654.     if ( dword_1002A054 )
  655.     {
  656.       if ( v5 == dword_1002A054 )
  657.       {
  658.         dword_1002A054 = *(_DWORD *)(v5 + 20);
  659.       }
  660.       else
  661.       {
  662.         for ( i = dword_1002A054; i; i = *(_DWORD *)(i + 20) )
  663.         {
  664.           if ( *(_DWORD *)(i + 20) == v5 )
  665.           {
  666.             *(_DWORD *)(i + 20) = *(_DWORD *)(v5 + 20);
  667.             break;
  668.           }
  669.         }
  670.       }
  671.     }
  672.     sub_10001498(*a1);
  673.     *a1 = 0;
  674.     *a2 = *(_DWORD *)(v5 + 16);
  675.   }
  676.   return v4;
  677. }
  678. // 1002A054: using guessed type int dword_1002A054;
  679.  
  680. //----- (100018EF) --------------------------------------------------------
  681. signed __int16 __cdecl sub_100018EF(int *a1, _DWORD *a2)
  682. {
  683.   __int16 v3; // [esp+10h] [ebp-Ch]@1
  684.   int v4; // [esp+14h] [ebp-8h]@3
  685.   BOOL v5; // [esp+18h] [ebp-4h]@16
  686.  
  687.   v3 = 0;
  688.   if ( !a1 )
  689.     return 2;
  690.   v4 = *a1;
  691.   if ( a2 )
  692.   {
  693.     if ( *a2 )
  694.     {
  695.       if ( *(_DWORD *)(v4 + 4) )
  696.       {
  697.         if ( *(_DWORD *)(v4 + 4) == *a2 )
  698.         {
  699.           if ( *(_DWORD *)(*(_DWORD *)v4 + 12) == a2[3] && *(_DWORD *)(*(_DWORD *)v4 + 16) == a2[4] )
  700.             *(_DWORD *)v4 = a2;
  701.           else
  702.             *(_DWORD *)v4 = a2;
  703.           v5 = *(_DWORD *)(*(_DWORD *)v4 + 4) != a2[1]
  704.             || *(_DWORD *)(*(_DWORD *)v4 + 8) != a2[2]
  705.             || *(_DWORD *)(*(_DWORD *)v4 + 12) != a2[3]
  706.             || *(_DWORD *)(*(_DWORD *)v4 + 16) != a2[4];
  707.         }
  708.         else
  709.         {
  710.           if ( *(_DWORD *)(v4 + 12) )
  711.           {
  712.             SetWindowLongA(*(HWND *)(v4 + 4), -4, *(_DWORD *)(v4 + 12));
  713.             *(_DWORD *)(v4 + 12) = 0;
  714.           }
  715.           *(_DWORD *)v4 = a2;
  716.           *(_DWORD *)(v4 + 4) = **(_DWORD **)v4;
  717.           *(_DWORD *)(v4 + 12) = SetWindowLongA(*(HWND *)(v4 + 4), -4, (LONG)sub_10001FAF);
  718.           sub_10001C27(*(_DWORD *)(v4 + 4), v4);
  719.           v5 = 1;
  720.         }
  721.       }
  722.       else
  723.       {
  724.         *(_DWORD *)v4 = a2;
  725.         *(_DWORD *)(v4 + 4) = **(_DWORD **)v4;
  726.         sub_10001C27(*(_DWORD *)(v4 + 4), v4);
  727.         *(_DWORD *)(v4 + 12) = SetWindowLongA(*(HWND *)(v4 + 4), -4, (LONG)sub_10001FAF);
  728.         v5 = 1;
  729.       }
  730.       if ( *(_DWORD *)(v4 + 4) )
  731.       {
  732.         if ( v5 )
  733.           SetWindowPos(
  734.             *(HWND *)(v4 + 4),
  735.             0,
  736.             *(_DWORD *)(*(_DWORD *)v4 + 4),
  737.             *(_DWORD *)(*(_DWORD *)v4 + 8),
  738.             *(_DWORD *)(*(_DWORD *)v4 + 12),
  739.             *(_DWORD *)(*(_DWORD *)v4 + 16),
  740.             0x14u);
  741.         InvalidateRect(*(HWND *)(v4 + 4), 0, 0);
  742.       }
  743.     }
  744.     else if ( *(_DWORD *)(v4 + 4) )
  745.     {
  746.       if ( *(_DWORD *)(v4 + 12) )
  747.       {
  748.         SetWindowLongA(*(HWND *)(v4 + 4), -4, *(_DWORD *)(v4 + 12));
  749.         *(_DWORD *)(v4 + 12) = 0;
  750.       }
  751.       *(_DWORD *)(v4 + 4) = 0;
  752.       v3 = 0;
  753.     }
  754.     else
  755.     {
  756.       v3 = 0;
  757.     }
  758.   }
  759.   else if ( *(_DWORD *)(v4 + 4) )
  760.   {
  761.     if ( *(_DWORD *)(v4 + 12) )
  762.     {
  763.       SetWindowLongA(*(HWND *)(v4 + 4), -4, *(_DWORD *)(v4 + 12));
  764.       *(_DWORD *)(v4 + 12) = 0;
  765.     }
  766.     *(_DWORD *)(v4 + 4) = 0;
  767.     v3 = 0;
  768.   }
  769.   else
  770.   {
  771.     v3 = 0;
  772.   }
  773.   return v3;
  774. }
  775.  
  776. //----- (10001C27) --------------------------------------------------------
  777. int __cdecl sub_10001C27(int a1, int a2)
  778. {
  779.   int result; // eax@2
  780.   int i; // [esp+Ch] [ebp-4h]@3
  781.  
  782.   *(_DWORD *)(a2 + 4) = a1;
  783.   if ( dword_1002A054 )
  784.   {
  785.     result = dword_1002A054;
  786.     if ( a2 != dword_1002A054 )
  787.     {
  788.       for ( i = dword_1002A054; *(_DWORD *)(i + 20); i = *(_DWORD *)(i + 20) )
  789.       {
  790.         result = i;
  791.         if ( *(_DWORD *)(i + 20) == a2 )
  792.           return result;
  793.       }
  794.       result = a2;
  795.       *(_DWORD *)(i + 20) = a2;
  796.     }
  797.   }
  798.   else
  799.   {
  800.     result = a2;
  801.     dword_1002A054 = a2;
  802.   }
  803.   return result;
  804. }
  805. // 1002A054: using guessed type int dword_1002A054;
  806.  
  807. //----- (10001CB5) --------------------------------------------------------
  808. signed __int16 __cdecl sub_10001CB5(int *a1, int a2, int a3, int a4, _WORD *a5)
  809. {
  810.   int v5; // ST10_4@3
  811.   __int16 v7; // [esp+Ch] [ebp-8h]@1
  812.  
  813.   v7 = 0;
  814.   if ( !a1 )
  815.     return 2;
  816.   v5 = *a1;
  817.   *a5 = 3;
  818.   return v7;
  819. }
  820.  
  821. //----- (10001D01) --------------------------------------------------------
  822. int __cdecl sub_10001D01(int *a1)
  823. {
  824.   int v1; // ST0C_4@2
  825.  
  826.   if ( a1 )
  827.     v1 = *a1;
  828.   return dword_1002A058;
  829. }
  830. // 1002A058: using guessed type int dword_1002A058;
  831.  
  832. //----- (10001D2B) --------------------------------------------------------
  833. int __cdecl sub_10001D2B(int *a1, int a2, int a3, int a4)
  834. {
  835.   int v4; // ST10_4@2
  836.  
  837.   if ( a1 )
  838.     v4 = *a1;
  839.   return a4;
  840. }
  841.  
  842. //----- (10001D59) --------------------------------------------------------
  843. signed __int16 __cdecl sub_10001D59(int *a1)
  844. {
  845.   int v1; // eax@3
  846.   __int16 v3; // [esp+Ch] [ebp-8h]@1
  847.  
  848.   v3 = 0;
  849.   if ( !a1 )
  850.     return 2;
  851.   v1 = *a1;
  852.   return v3;
  853. }
  854.  
  855. //----- (10001D9D) --------------------------------------------------------
  856. char *__cdecl sub_10001D9D(int a1, int a2, char *Source)
  857. {
  858.   char *result; // eax@1
  859.   size_t v4; // [esp+Ch] [ebp-108h]@1
  860.   char Dest; // [esp+14h] [ebp-100h]@1
  861.  
  862.   v4 = strlen(Source) + 1;
  863.   result = strcpy(&Dest, Source);
  864.   if ( a1 )
  865.   {
  866.     result = *(char **)a1;
  867.     if ( v4 )
  868.     {
  869.       result = (char *)sub_10003780(
  870.                          (int)&Dest,
  871.                          *(HWND *)(*(_DWORD *)a1 + 4),
  872.                          dword_100393E4,
  873.                          dword_100393DC,
  874.                          dword_1002A03C,
  875.                          dword_1002A040,
  876.                          dword_1002A044,
  877.                          dword_1002A048,
  878.                          dword_1002A04C,
  879.                          dword_1002A050);
  880.       if ( !result )
  881.         dword_1002A038 = 1;
  882.     }
  883.   }
  884.   return result;
  885. }
  886. // 1002A038: using guessed type int dword_1002A038;
  887.  
  888. //----- (10001E74) --------------------------------------------------------
  889. void __cdecl sub_10001E74(int *a1, int a2)
  890. {
  891.   HDC v2; // ST24_4@5
  892.   HGDIOBJ v3; // ST20_4@5
  893.   LOGBRUSH plbrush; // [esp+18h] [ebp-24h]@5
  894.   int *v5; // [esp+24h] [ebp-18h]@5
  895.   HGDIOBJ h; // [esp+28h] [ebp-14h]@5
  896.   int v7; // [esp+2Ch] [ebp-10h]@5
  897.   int v8; // [esp+30h] [ebp-Ch]@4
  898.   char v9; // [esp+34h] [ebp-8h]@4
  899.   int v10; // [esp+38h] [ebp-4h]@3
  900.  
  901.   if ( a2 && a1 )
  902.   {
  903.     v10 = *a1;
  904.     if ( *(_WORD *)a2 == 2 )
  905.     {
  906.       v8 = *(_DWORD *)(a2 + 8);
  907.       v9 = *(_BYTE *)(a2 + 5);
  908.       *(_BYTE *)(a2 + 4) = 0;
  909.     }
  910.     else
  911.     {
  912.       v5 = (int *)(a2 + 4);
  913.       v2 = *(HDC *)(a2 + 32);
  914.       plbrush.lbStyle = 0;
  915.       plbrush.lbColor = 8421504;
  916.       plbrush.lbHatch = 0;
  917.       h = ExtCreatePen(0, 1u, &plbrush, 0, 0);
  918.       v3 = SelectObject(v2, h);
  919.       v7 = Rectangle(v2, v5[1], v5[2], v5[3] + v5[1], v5[4] + v5[2]);
  920.       SelectObject(v2, v3);
  921.       DeleteObject(h);
  922.     }
  923.   }
  924. }
  925.  
  926. //----- (10001FAF) --------------------------------------------------------
  927. LRESULT __stdcall sub_10001FAF(HWND hWnd, int a2, int a3, LPARAM lParam)
  928. {
  929.   int v5; // [esp+Ch] [ebp-4h]@1
  930.  
  931.   v5 = sub_10002026((int)hWnd);
  932.   if ( dword_1002A038 )
  933.     sub_10003842(hWnd, (unsigned __int16)a2, (unsigned __int16)a3, lParam);
  934.   return CallWindowProcA(*(WNDPROC *)(v5 + 12), hWnd, (unsigned __int16)a2, (unsigned __int16)a3, lParam);
  935. }
  936. // 1002A038: using guessed type int dword_1002A038;
  937.  
  938. //----- (10002026) --------------------------------------------------------
  939. int __cdecl sub_10002026(int a1)
  940. {
  941.   int v2; // [esp+Ch] [ebp-8h]@1
  942.   int i; // [esp+10h] [ebp-4h]@1
  943.  
  944.   v2 = 0;
  945.   for ( i = dword_1002A054; i; i = *(_DWORD *)(i + 20) )
  946.   {
  947.     if ( *(_DWORD *)(i + 4) == a1 )
  948.       return i;
  949.   }
  950.   return v2;
  951. }
  952. // 1002A054: using guessed type int dword_1002A054;
  953.  
  954. //----- (100020B0) --------------------------------------------------------
  955. void *__cdecl sub_100020B0(size_t Size)
  956. {
  957.   return malloc(Size);
  958. }
  959.  
  960. //----- (100020E8) --------------------------------------------------------
  961. int __cdecl sub_100020E8(int a1, int a2, DWORD nNumberOfBytesToRead)
  962. {
  963.   return _read(a1, a2, nNumberOfBytesToRead);
  964. }
  965.  
  966. //----- (1000210C) --------------------------------------------------------
  967. int __cdecl sub_1000210C(int a1, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite)
  968. {
  969.   return _write(a1, lpBuffer, nNumberOfBytesToWrite);
  970. }
  971.  
  972. //----- (10002130) --------------------------------------------------------
  973. int __cdecl sub_10002130(int a1, LONG lDistanceToMove, DWORD dwMoveMethod)
  974. {
  975.   return _lseek(a1, lDistanceToMove, dwMoveMethod);
  976. }
  977.  
  978. //----- (10002154) --------------------------------------------------------
  979. int __cdecl sub_10002154(int a1)
  980. {
  981.   return _tell(a1);
  982. }
  983. // 10027180: using guessed type _DWORD __cdecl _tell(_DWORD);
  984.  
  985. //----- (10002170) --------------------------------------------------------
  986. void __cdecl sub_10002170(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
  987. {
  988.   const CHAR *v9; // eax@20
  989.   int Size; // ST1C_4@21
  990.   const CHAR *v11; // eax@22
  991.   void *v12; // eax@26
  992.   int v13; // eax@28
  993.   void *Memory; // [esp+10h] [ebp-8h]@26
  994.   void *v15; // [esp+14h] [ebp-4h]@24
  995.  
  996.   if ( a2 > 0 )
  997.     *(_DWORD *)&dword_1002A0A0 = a2;
  998.   if ( a3 > 0 )
  999.     *(_DWORD *)&dword_1002A0A4 = a3;
  1000.   if ( a4 >= 0 )
  1001.     dword_1002A0A8 = a4;
  1002.   if ( a5 >= 0 )
  1003.     dword_1002A0AC = a5;
  1004.   if ( a6 >= 0 )
  1005.     dword_1002A0B0 = a6;
  1006.   if ( a7 >= 0 )
  1007.     dword_1002A0B4 = a7;
  1008.   if ( a8 >= 0 )
  1009.     dword_1002A0B8 = a8;
  1010.   if ( a9 >= 0 )
  1011.     dword_1002A0BC = a9;
  1012.   if ( byte_1002A0E4 )
  1013.     sub_10002439();
  1014.   if ( sub_10003E80(&off_1002A0C0) )
  1015.   {
  1016.     v9 = (const CHAR *)sub_10003F10();
  1017.     sub_10003C72(v9);
  1018.   }
  1019.   word_100394E0 = dword_1002A0A0;
  1020.   word_100394E2 = dword_1002A0A4;
  1021.   byte_100394E4 = 2;
  1022.   Size = 2 * *(_DWORD *)&dword_1002A0A0 * *(_DWORD *)&dword_1002A0A4;
  1023.   lpvBits = malloc(2 * *(_DWORD *)&dword_1002A0A0 * *(_DWORD *)&dword_1002A0A4);
  1024.   Dst = malloc(Size);
  1025.   memset(Dst, 255, Size);
  1026.   dword_100393F8 = (int)sub_100063D0(a1);
  1027.   _close(a1);
  1028.   if ( !dword_100393F8 )
  1029.   {
  1030.     v11 = (const CHAR *)sub_10003F10();
  1031.     sub_10003C72(v11);
  1032.   }
  1033.   LOWORD(word_1002A0E8) = sub_100029CC(dword_1002A0A8, dword_1002A0AC, dword_1002A0B0);
  1034.   LOWORD(word_1002A0EC) = sub_100029CC(dword_1002A0B4, dword_1002A0B8, dword_1002A0BC);
  1035.   if ( *(_DWORD *)(dword_100393F8 + 16) )
  1036.   {
  1037.     v15 = (void *)(*(_DWORD *)(dword_100393F8 + 16) + 4);
  1038.   }
  1039.   else
  1040.   {
  1041.     v15 = malloc(0x2000u);
  1042.     sub_10003490((int)v15, *(_DWORD *)(dword_100393F8 + 12));
  1043.   }
  1044.   v12 = malloc(0x20000u);
  1045.   Memory = v12;
  1046.   LOWORD(v12) = word_1002A0EC;
  1047.   sub_100036F1(Memory, (int)v12, 0x10000u);
  1048.   dword_100394D0 = (int)sub_10003F20(0, v15, Memory, (int)&lpvBits);
  1049.   if ( !dword_100394D0 )
  1050.     sub_10003C72(Text);
  1051.   v13 = (unsigned __int16)word_100394E2 * (unsigned __int16)word_100394E0;
  1052.   LOWORD(v13) = word_1002A0E8;
  1053.   sub_100036F1(lpvBits, v13, (unsigned __int16)word_100394E2 * (unsigned __int16)word_100394E0);
  1054.   free(Memory);
  1055.   if ( !*(_DWORD *)(dword_100393F8 + 16) )
  1056.     free(v15);
  1057.   sub_10002A07();
  1058.   byte_1002A0E4 = 1;
  1059.   sub_100024B8(0);
  1060. }
  1061. // 10022490: using guessed type _DWORD __cdecl _close(_DWORD);
  1062. // 1002A0A8: using guessed type int dword_1002A0A8;
  1063. // 1002A0AC: using guessed type int dword_1002A0AC;
  1064. // 1002A0B0: using guessed type int dword_1002A0B0;
  1065. // 1002A0B4: using guessed type int dword_1002A0B4;
  1066. // 1002A0B8: using guessed type int dword_1002A0B8;
  1067. // 1002A0BC: using guessed type int dword_1002A0BC;
  1068. // 1002A0C0: using guessed type int (__cdecl *off_1002A0C0)(size_t Size);
  1069. // 1002A0E4: using guessed type char byte_1002A0E4;
  1070. // 100393F8: using guessed type int dword_100393F8;
  1071. // 100394D0: using guessed type int dword_100394D0;
  1072. // 100394E4: using guessed type char byte_100394E4;
  1073.  
  1074. //----- (10002439) --------------------------------------------------------
  1075. void sub_10002439()
  1076. {
  1077.   if ( byte_1002A0E4 )
  1078.   {
  1079.     sub_10006570((_DWORD *)dword_100393F8);
  1080.     if ( dword_100394D0 )
  1081.     {
  1082.       sub_10004180(dword_100394D0);
  1083.       dword_100394D0 = 0;
  1084.     }
  1085.     sub_10003EF0();
  1086.     free(Dst);
  1087.     free(lpvBits);
  1088.     byte_1002A0E4 = 0;
  1089.   }
  1090. }
  1091. // 1002A0E4: using guessed type char byte_1002A0E4;
  1092. // 100393F8: using guessed type int dword_100393F8;
  1093. // 100394D0: using guessed type int dword_100394D0;
  1094.  
  1095. //----- (100024B8) --------------------------------------------------------
  1096. void __cdecl sub_100024B8(int a1)
  1097. {
  1098.   int v1; // eax@19
  1099.   int v2; // eax@33
  1100.   signed __int16 v3; // [esp+10h] [ebp-18h]@31
  1101.   signed __int16 v4; // [esp+10h] [ebp-18h]@34
  1102.   int v5; // [esp+14h] [ebp-14h]@20
  1103.   int v6; // [esp+18h] [ebp-10h]@20
  1104.   int v7; // [esp+1Ch] [ebp-Ch]@20
  1105.   signed __int16 v8; // [esp+20h] [ebp-8h]@1
  1106.   char *Dst; // [esp+24h] [ebp-4h]@31
  1107.   char *Dsta; // [esp+24h] [ebp-4h]@34
  1108.  
  1109.   v8 = 0;
  1110.   if ( byte_1002A0E4 )
  1111.   {
  1112.     switch ( a1 )
  1113.     {
  1114.       case 0:
  1115.         word_1002A0F0 = 0;
  1116.         sub_10002E35(3);
  1117.         dword_100394D4 = (int (__cdecl *)(_DWORD, _DWORD))sub_10002E35;
  1118.         sub_1000375D(10);
  1119.         v8 = 1;
  1120.         break;
  1121.       case 1:
  1122.         if ( *(_DWORD *)(dword_100393F8 + 24) == ++word_1002A0F0 )
  1123.           word_1002A0F0 = 0;
  1124.         break;
  1125.       case 2:
  1126.         sub_10003CA1(lpvBits, word_100394E0, word_100394E2, 0, 0, word_100394E0, word_100394E2);
  1127.         return;
  1128.       case 10:
  1129.         dword_100394D4 = (int (__cdecl *)(_DWORD, _DWORD))sub_10002E35;
  1130.         sub_1000375D(10);
  1131.         break;
  1132.       case 11:
  1133.         dword_100394D4 = (int (__cdecl *)(_DWORD, _DWORD))sub_10002F85;
  1134.         dword_10039458 = (int)&dword_10039468;
  1135.         sub_1000375D(20);
  1136.         break;
  1137.       case 12:
  1138.         dword_100394D4 = sub_100030DA;
  1139.         dword_10039458 = (int)&dword_10039468;
  1140.         sub_1000375D(30);
  1141.         break;
  1142.       case 13:
  1143.         dword_100394D4 = (int (__cdecl *)(_DWORD, _DWORD))sub_1000325B;
  1144.         dword_10039458 = (int)&dword_10039468;
  1145.         sub_1000375D(40);
  1146.         break;
  1147.       case 14:
  1148.         dword_100394D4 = (int (__cdecl *)(_DWORD, _DWORD))sub_10003399;
  1149.         dword_10039458 = (int)&dword_10039468;
  1150.         sub_1000375D(50);
  1151.         break;
  1152.       case 15:
  1153.         sub_10003768(71);
  1154.         byte_100394B8 = 0;
  1155.         break;
  1156.       case 16:
  1157.         sub_10003768(72);
  1158.         byte_100394B8 = 1;
  1159.         break;
  1160.       case 17:
  1161.         sub_10003768(73);
  1162.         byte_100394B8 = 2;
  1163.         break;
  1164.       case 18:
  1165.         sub_10003768(72);
  1166.         dword_100394D4 = (int (__cdecl *)(_DWORD, _DWORD))sub_10002E35;
  1167.         sub_1000375D(10);
  1168.         sub_10002A07();
  1169.         v8 = 1;
  1170.         break;
  1171.       default:
  1172.         break;
  1173.     }
  1174.     if ( v8 )
  1175.     {
  1176.       word_1003945C = 0;
  1177.       word_100394F0 = 0;
  1178.       word_100393E8 = word_100394E0 - 1;
  1179.       word_100394EC = word_100394E2 - 1;
  1180.       v1 = (unsigned __int16)word_100394E2 * (unsigned __int16)word_100394E0;
  1181.       LOWORD(v1) = word_1002A0E8;
  1182.       sub_100036F1(lpvBits, v1, (unsigned __int16)word_100394E2 * (unsigned __int16)word_100394E0);
  1183.     }
  1184.     dword_100394D4(a1, dword_10039458);
  1185.     sub_100042B0(dword_100394D0, (int)&dword_10039468, (int)&flt_10039408, word_1002A0F0);
  1186.     v5 = *(_DWORD *)(dword_100394D0 + 8);
  1187.     v6 = *(_DWORD *)(dword_100394D0 + 12);
  1188.     v7 = *(_DWORD *)(dword_100394D0 + 16);
  1189.     if ( v7 )
  1190.     {
  1191.       if ( (signed __int16)v5 < word_1003945C )
  1192.         word_1003945C = *(_DWORD *)(dword_100394D0 + 8);
  1193.       if ( (signed __int16)v6 > word_100393E8 )
  1194.         word_100393E8 = v6;
  1195.       if ( SHIWORD(v5) < word_100394F0 )
  1196.         word_100394F0 = HIWORD(v5);
  1197.       if ( SHIWORD(v6) > word_100394EC )
  1198.         word_100394EC = HIWORD(v6);
  1199.     }
  1200.     word_10039460 = word_100393E8 - word_1003945C + 1;
  1201.     word_10039400 = word_100394EC - word_100394F0 + 1;
  1202.     sub_10003CA1(
  1203.       lpvBits,
  1204.       dword_1002A0A0,
  1205.       dword_1002A0A4,
  1206.       word_1003945C,
  1207.       word_100394F0,
  1208.       word_100393E8 - word_1003945C + 1,
  1209.       word_100394EC - word_100394F0 + 1);
  1210.     if ( (_WORD)v7 && HIWORD(v7) )
  1211.     {
  1212.       Dst = (char *)lpvBits
  1213.           + (unsigned __int8)byte_100394E4 * ((signed __int16)v5 + (unsigned __int16)word_100394E0 * SHIWORD(v5));
  1214.       v3 = 0;
  1215.       while ( SHIWORD(v7) > v3 )
  1216.       {
  1217.         v2 = (signed __int16)v7;
  1218.         LOWORD(v2) = word_1002A0E8;
  1219.         sub_100036F1(Dst, v2, (signed __int16)v7);
  1220.         ++v3;
  1221.         Dst += (unsigned __int16)word_100394E0 * (unsigned __int8)byte_100394E4;
  1222.       }
  1223.       Dsta = (char *)::Dst + 2 * ((signed __int16)v5 + (unsigned __int16)word_100394E0 * SHIWORD(v5));
  1224.       v4 = 0;
  1225.       while ( SHIWORD(v7) > v4 )
  1226.       {
  1227.         memset(Dsta, 255, 2 * (signed __int16)v7);
  1228.         ++v4;
  1229.         Dsta += 2 * (unsigned __int16)word_100394E0;
  1230.       }
  1231.       word_100394F0 = HIWORD(v5);
  1232.       word_1003945C = v5;
  1233.       word_100394EC = HIWORD(v6);
  1234.       word_100393E8 = v6;
  1235.     }
  1236.   }
  1237. }
  1238. // 1000375D: using guessed type int __cdecl sub_1000375D(_DWORD);
  1239. // 10003768: using guessed type int __cdecl sub_10003768(_DWORD);
  1240. // 1002A0E4: using guessed type char byte_1002A0E4;
  1241. // 1002A0F0: using guessed type __int16 word_1002A0F0;
  1242. // 100393E8: using guessed type __int16 word_100393E8;
  1243. // 100393F8: using guessed type int dword_100393F8;
  1244. // 10039408: using guessed type float flt_10039408;
  1245. // 10039458: using guessed type int dword_10039458;
  1246. // 10039468: using guessed type int dword_10039468;
  1247. // 100394B8: using guessed type char byte_100394B8;
  1248. // 100394D0: using guessed type int dword_100394D0;
  1249. // 100394D4: using guessed type int (__cdecl *dword_100394D4)(_DWORD, _DWORD);
  1250. // 100394E4: using guessed type char byte_100394E4;
  1251. // 100394EC: using guessed type __int16 word_100394EC;
  1252.  
  1253. //----- (100029CC) --------------------------------------------------------
  1254. int __cdecl sub_100029CC(unsigned __int8 a1, unsigned __int8 a2, unsigned __int8 a3)
  1255. {
  1256.   return (unsigned __int16)((signed int)a3 >> 3) | 32 * (unsigned __int16)((signed int)a2 >> 3) | ((unsigned __int16)((signed int)a1 >> 3) << 10);
  1257. }
  1258.  
  1259. //----- (10002A07) --------------------------------------------------------
  1260. int sub_10002A07()
  1261. {
  1262.   double v0; // st7@1
  1263.   double v1; // st7@1
  1264.   double v2; // st7@1
  1265.   double v3; // st7@2
  1266.   double v4; // st7@3
  1267.   double v5; // st7@4
  1268.   double v6; // st7@5
  1269.   double v7; // st7@5
  1270.   float v9; // [esp+18h] [ebp-18h]@1
  1271.   float v10; // [esp+1Ch] [ebp-14h]@1
  1272.   float v11; // [esp+20h] [ebp-10h]@1
  1273.   float v12; // [esp+24h] [ebp-Ch]@1
  1274.   float v13; // [esp+28h] [ebp-8h]@1
  1275.   float v14; // [esp+2Ch] [ebp-4h]@1
  1276.  
  1277.   dword_10039468 = *(_DWORD *)(dword_100393F8 + 28);
  1278.   dword_1003946C = *(_DWORD *)(dword_100393F8 + 24);
  1279.   dword_10039474 = *(_DWORD *)(dword_100393F8 + 36);
  1280.   dword_10039470 = *(_DWORD *)(dword_100393F8 + 40);
  1281.   dword_1002A0D8 = 0;
  1282.   dword_1002A0DC = 0;
  1283.   dword_1002A0E0 = 0;
  1284.   sub_100072D0((float *)&dword_1002A0D8, (float *)&dword_10039468 + 7);
  1285.   dword_100394A8 = 1065353216;
  1286.   dword_100394AC = 0;
  1287.   dword_100394B0 = 0;
  1288.   dword_100394B4 = 1065353216;
  1289.   dword_100394BA = 1050253722;
  1290.   dword_100394BE = 1050253722;
  1291.   dword_100394C2 = -1082130432;
  1292.   byte_100394B9 = 1;
  1293.   byte_100394B8 = 1;
  1294.   sub_10003768(72);
  1295.   dword_100394C6 = 0;
  1296.   sub_10005960((int)&dword_10039468, 0, &v12, &v9);
  1297.   flt_10039478 = -((v9 + v12) * 0.5);
  1298.   flt_1003947C = -((v10 + v13) * 0.5);
  1299.   flt_10039480 = -v14;
  1300.   word_100394CA = 0;
  1301.   word_100394CC = 0;
  1302.   word_100394CE = 0;
  1303.   v0 = v11 - v14;
  1304.   fabs(v0);
  1305.   flt_100393F4 = v0 * 0.5;
  1306.   v1 = v9 - v12;
  1307.   fabs(v1);
  1308.   flt_100393FC = v1;
  1309.   v2 = v10 - v13;
  1310.   fabs(v2);
  1311.   if ( v2 > flt_100393FC )
  1312.   {
  1313.     v3 = v10 - v13;
  1314.     fabs(v3);
  1315.     flt_100393FC = v3;
  1316.   }
  1317.   v4 = v11 - v14;
  1318.   fabs(v4);
  1319.   if ( v4 > flt_100393FC )
  1320.   {
  1321.     v5 = v11 - v14;
  1322.     fabs(v5);
  1323.     flt_100393FC = v5;
  1324.   }
  1325.   v6 = flt_100393FC * 10.0;
  1326.   flt_100393FC = v6;
  1327.   flt_100394E8 = v6 / 40.0;
  1328.   flt_10039438 = *(float *)(*(_DWORD *)dword_10039474 + 8) * 0.050000001;
  1329.   flt_1003943C = 10.0 / flt_100393FC;
  1330.   v7 = flt_100393FC * 1.9;
  1331.   flt_100393FC = v7;
  1332.   word_1003944C = 0;
  1333.   word_1003944E = 0;
  1334.   word_10039450 = dword_1002A0A0 - 1;
  1335.   word_10039452 = dword_1002A0A4 - 1;
  1336.   word_10039454 = dword_1002A0A0;
  1337.   word_10039456 = dword_1002A0A4;
  1338.   flt_10039440 = v7 / 20.0;
  1339.   flt_10039444 = flt_100393FC * 7.0;
  1340.   word_10039448 = 0;
  1341.   word_1003944A = -1;
  1342.   dword_100393F0 = -1085731242;
  1343.   dword_100393EC = 1057360271;
  1344.   return sub_10002CEE();
  1345. }
  1346. // 10003768: using guessed type int __cdecl sub_10003768(_DWORD);
  1347. // 1002A0D8: using guessed type int dword_1002A0D8;
  1348. // 1002A0DC: using guessed type int dword_1002A0DC;
  1349. // 1002A0E0: using guessed type int dword_1002A0E0;
  1350. // 100393EC: using guessed type int dword_100393EC;
  1351. // 100393F0: using guessed type int dword_100393F0;
  1352. // 100393F4: using guessed type float flt_100393F4;
  1353. // 100393F8: using guessed type int dword_100393F8;
  1354. // 100393FC: using guessed type float flt_100393FC;
  1355. // 10039438: using guessed type float flt_10039438;
  1356. // 1003943C: using guessed type float flt_1003943C;
  1357. // 10039440: using guessed type float flt_10039440;
  1358. // 10039444: using guessed type float flt_10039444;
  1359. // 10039448: using guessed type __int16 word_10039448;
  1360. // 1003944A: using guessed type __int16 word_1003944A;
  1361. // 1003944C: using guessed type __int16 word_1003944C;
  1362. // 1003944E: using guessed type __int16 word_1003944E;
  1363. // 10039450: using guessed type __int16 word_10039450;
  1364. // 10039452: using guessed type __int16 word_10039452;
  1365. // 10039454: using guessed type __int16 word_10039454;
  1366. // 10039456: using guessed type __int16 word_10039456;
  1367. // 10039468: using guessed type int dword_10039468;
  1368. // 1003946C: using guessed type int dword_1003946C;
  1369. // 10039470: using guessed type int dword_10039470;
  1370. // 10039474: using guessed type int dword_10039474;
  1371. // 10039478: using guessed type float flt_10039478;
  1372. // 1003947C: using guessed type float flt_1003947C;
  1373. // 10039480: using guessed type float flt_10039480;
  1374. // 100394A8: using guessed type int dword_100394A8;
  1375. // 100394AC: using guessed type int dword_100394AC;
  1376. // 100394B0: using guessed type int dword_100394B0;
  1377. // 100394B4: using guessed type int dword_100394B4;
  1378. // 100394B8: using guessed type char byte_100394B8;
  1379. // 100394B9: using guessed type char byte_100394B9;
  1380. // 100394BA: using guessed type int dword_100394BA;
  1381. // 100394BE: using guessed type int dword_100394BE;
  1382. // 100394C2: using guessed type int dword_100394C2;
  1383. // 100394C6: using guessed type int dword_100394C6;
  1384. // 100394CA: using guessed type __int16 word_100394CA;
  1385. // 100394CC: using guessed type __int16 word_100394CC;
  1386. // 100394CE: using guessed type __int16 word_100394CE;
  1387. // 100394E8: using guessed type float flt_100394E8;
  1388.  
  1389. //----- (10002CEE) --------------------------------------------------------
  1390. int sub_10002CEE()
  1391. {
  1392.   int result; // eax@1
  1393.   int v1; // [esp+14h] [ebp-40h]@1
  1394.   int v2; // [esp+18h] [ebp-3Ch]@1
  1395.   int v3; // [esp+1Ch] [ebp-38h]@1
  1396.   int v4; // [esp+20h] [ebp-34h]@1
  1397.   int v5; // [esp+24h] [ebp-30h]@1
  1398.   int v6; // [esp+28h] [ebp-2Ch]@1
  1399.   int v7; // [esp+2Ch] [ebp-28h]@1
  1400.   int v8; // [esp+30h] [ebp-24h]@1
  1401.   int v9; // [esp+34h] [ebp-20h]@1
  1402.   float v10; // [esp+38h] [ebp-1Ch]@1
  1403.   int v11; // [esp+3Ch] [ebp-18h]@1
  1404.   char v12; // [esp+40h] [ebp-14h]@1
  1405.   float v13; // [esp+4Ch] [ebp-8h]@1
  1406.   float v14; // [esp+50h] [ebp-4h]@1
  1407.  
  1408.   *(float *)&v11 = sub_1001009A(
  1409.                      COERCE_UNSIGNED_INT64(*(float *)&dword_100393F0),
  1410.                      COERCE_UNSIGNED_INT64(*(float *)&dword_100393F0) >> 32);
  1411.   v10 = sub_10010090(
  1412.           COERCE_UNSIGNED_INT64(*(float *)&dword_100393F0),
  1413.           COERCE_UNSIGNED_INT64(*(float *)&dword_100393F0) >> 32);
  1414.   v14 = sub_1001009A(
  1415.           COERCE_UNSIGNED_INT64(*(float *)&dword_100393EC),
  1416.           COERCE_UNSIGNED_INT64(*(float *)&dword_100393EC) >> 32);
  1417.   v13 = sub_10010090(
  1418.           COERCE_UNSIGNED_INT64(*(float *)&dword_100393EC),
  1419.           COERCE_UNSIGNED_INT64(*(float *)&dword_100393EC) >> 32);
  1420.   *(float *)&v1 = -(v14 * *(float *)&v11);
  1421.   *(float *)&v2 = -(v14 * v10);
  1422.   *(float *)&v3 = -v13;
  1423.   *(float *)&v7 = -v10;
  1424.   v8 = v11;
  1425.   v9 = 0;
  1426.   sub_10007700((float *)&v1, (float *)&v7, (float *)&v12);
  1427.   sub_10007670((float *)&v12, (float *)&v4);
  1428.   flt_10039408 = -(*(float *)&v1 * flt_100393FC);
  1429.   flt_1003940C = -(*(float *)&v2 * flt_100393FC);
  1430.   flt_10039410 = flt_100393F4 - *(float *)&v3 * flt_100393FC;
  1431.   dword_10039414 = v7;
  1432.   dword_10039418 = v8;
  1433.   dword_1003941C = v9;
  1434.   dword_10039420 = v4;
  1435.   dword_10039424 = v5;
  1436.   dword_10039428 = v6;
  1437.   dword_1003942C = v1;
  1438.   dword_10039430 = v2;
  1439.   result = v3;
  1440.   dword_10039434 = v3;
  1441.   return result;
  1442. }
  1443. // 10010090: using guessed type double __cdecl sub_10010090(_DWORD, _DWORD);
  1444. // 1001009A: using guessed type double __cdecl sub_1001009A(_DWORD, _DWORD);
  1445. // 100393EC: using guessed type int dword_100393EC;
  1446. // 100393F0: using guessed type int dword_100393F0;
  1447. // 100393F4: using guessed type float flt_100393F4;
  1448. // 100393FC: using guessed type float flt_100393FC;
  1449. // 10039408: using guessed type float flt_10039408;
  1450. // 1003940C: using guessed type float flt_1003940C;
  1451. // 10039410: using guessed type float flt_10039410;
  1452. // 10039414: using guessed type int dword_10039414;
  1453. // 10039418: using guessed type int dword_10039418;
  1454. // 1003941C: using guessed type int dword_1003941C;
  1455. // 10039420: using guessed type int dword_10039420;
  1456. // 10039424: using guessed type int dword_10039424;
  1457. // 10039428: using guessed type int dword_10039428;
  1458. // 1003942C: using guessed type int dword_1003942C;
  1459. // 10039430: using guessed type int dword_10039430;
  1460. // 10039434: using guessed type int dword_10039434;
  1461.  
  1462. //----- (10002E35) --------------------------------------------------------
  1463. int __cdecl sub_10002E35(int a1)
  1464. {
  1465.   int result; // eax@10
  1466.  
  1467.   result = a1;
  1468.   switch ( a1 )
  1469.   {
  1470.     case 3:
  1471.       return sub_10002CEE();
  1472.     case 4:
  1473.       *(float *)&dword_100393F0 = *(float *)&dword_100393F0 + flt_1002A0F4;
  1474.       return sub_10002CEE();
  1475.     case 5:
  1476.       *(float *)&dword_100393F0 = *(float *)&dword_100393F0 - flt_1002A0F4;
  1477.       return sub_10002CEE();
  1478.     case 6:
  1479.       *(float *)&dword_100393EC = *(float *)&dword_100393EC + flt_1002A0F4;
  1480.       return sub_10002CEE();
  1481.     case 7:
  1482.       *(float *)&dword_100393EC = *(float *)&dword_100393EC - flt_1002A0F4;
  1483.       return sub_10002CEE();
  1484.     case 8:
  1485.       flt_100393FC = flt_100393FC - flt_100394E8;
  1486.       return sub_10002CEE();
  1487.     case 9:
  1488.       flt_100393FC = flt_100394E8 + flt_100393FC;
  1489.       return sub_10002CEE();
  1490.     case 10:
  1491.     case 11:
  1492.     case 12:
  1493.     case 13:
  1494.     case 14:
  1495.     case 15:
  1496.     case 16:
  1497.     case 17:
  1498.     case 18:
  1499.       return result;
  1500.     case 19:
  1501.       flt_100393FC = flt_100393FC - flt_100394E8 * 0.5;
  1502.       break;
  1503.     case 20:
  1504.       flt_100393FC = flt_100394E8 * 0.5 + flt_100393FC;
  1505.       break;
  1506.   }
  1507.   return sub_10002CEE();
  1508. }
  1509. // 1002A0F4: using guessed type float flt_1002A0F4;
  1510. // 100393EC: using guessed type int dword_100393EC;
  1511. // 100393F0: using guessed type int dword_100393F0;
  1512. // 100393FC: using guessed type float flt_100393FC;
  1513. // 100394E8: using guessed type float flt_100394E8;
  1514.  
  1515. //----- (10002F85) --------------------------------------------------------
  1516. int __cdecl sub_10002F85(int a1, float *a2)
  1517. {
  1518.   int result; // eax@7
  1519.   double v3; // ST1C_8@8
  1520.   double v4; // ST14_8@8
  1521.   double v5; // st7@8
  1522.  
  1523.   result = a1 - 4;
  1524.   switch ( a1 )
  1525.   {
  1526.     case 4:
  1527.       flt_1002A0FC = flt_1002A100 + flt_1002A0FC;
  1528.       goto LABEL_8;
  1529.     case 5:
  1530.       flt_1002A0FC = flt_1002A0FC - flt_1002A100;
  1531.       goto LABEL_8;
  1532.     case 6:
  1533.       flt_1002A0F8 = flt_1002A100 + flt_1002A0F8;
  1534.       goto LABEL_8;
  1535.     case 7:
  1536.       flt_1002A0F8 = flt_1002A0F8 - flt_1002A100;
  1537.       goto LABEL_8;
  1538.     case 8:
  1539.     case 9:
  1540.       LODWORD(flt_1002A0FC) = 0;
  1541.       LODWORD(flt_1002A0F8) = 0;
  1542. LABEL_8:
  1543.       v3 = sub_1001009A(*(unsigned __int64 *)&flt_1002A0F8, *(unsigned __int64 *)&flt_1002A0F8 >> 32);
  1544.       a2[17] = sub_10010090(*(unsigned __int64 *)&flt_1002A0FC, *(unsigned __int64 *)&flt_1002A0FC >> 32) * v3;
  1545.       v4 = sub_1001009A(*(unsigned __int64 *)&flt_1002A0FC, *(unsigned __int64 *)&flt_1002A0FC >> 32);
  1546.       a2[19] = sub_1001009A(*(unsigned __int64 *)&flt_1002A0F8, *(unsigned __int64 *)&flt_1002A0F8 >> 32) * v4;
  1547.       v5 = sub_10010090(*(unsigned __int64 *)&flt_1002A0F8, *(unsigned __int64 *)&flt_1002A0F8 >> 32);
  1548.       result = (int)a2;
  1549.       a2[18] = v5;
  1550.       break;
  1551.     default:
  1552.       return result;
  1553.   }
  1554.   return result;
  1555. }
  1556. // 10010090: using guessed type double __cdecl sub_10010090(_DWORD, _DWORD);
  1557. // 1001009A: using guessed type double __cdecl sub_1001009A(_DWORD, _DWORD);
  1558. // 1002A0F8: using guessed type float flt_1002A0F8;
  1559. // 1002A0FC: using guessed type float flt_1002A0FC;
  1560. // 1002A100: using guessed type float flt_1002A100;
  1561.  
  1562. //----- (100030DA) --------------------------------------------------------
  1563. int __cdecl sub_100030DA(int a1, int a2)
  1564. {
  1565.   int result; // eax@10
  1566.   double v3; // ST1C_8@11
  1567.   double v4; // ST14_8@11
  1568.   double v5; // st7@11
  1569.  
  1570.   result = a1;
  1571.   switch ( a1 )
  1572.   {
  1573.     case 4:
  1574.       flt_1002A104 = flt_1002A10C + flt_1002A104;
  1575.       goto LABEL_11;
  1576.     case 5:
  1577.       flt_1002A104 = flt_1002A104 - flt_1002A10C;
  1578.       goto LABEL_11;
  1579.     case 6:
  1580.       flt_1002A108 = flt_1002A10C + flt_1002A108;
  1581.       goto LABEL_11;
  1582.     case 7:
  1583.       flt_1002A108 = flt_1002A108 - flt_1002A10C;
  1584.       goto LABEL_11;
  1585.     case 8:
  1586.     case 9:
  1587.     case 19:
  1588.     case 20:
  1589.       if ( *(_BYTE *)(a2 + 81) )
  1590.         *(_BYTE *)(a2 + 81) = 0;
  1591.       else
  1592.         *(_BYTE *)(a2 + 81) = 1;
  1593. LABEL_11:
  1594.       v3 = sub_1001009A(*(unsigned __int64 *)&flt_1002A108, *(unsigned __int64 *)&flt_1002A108 >> 32);
  1595.       *(float *)(a2 + 82) = sub_10010090(*(unsigned __int64 *)&flt_1002A104, *(unsigned __int64 *)&flt_1002A104 >> 32)
  1596.                           * v3;
  1597.       v4 = sub_10010090(*(unsigned __int64 *)&flt_1002A108, *(unsigned __int64 *)&flt_1002A108 >> 32);
  1598.       *(float *)(a2 + 86) = sub_10010090(*(unsigned __int64 *)&flt_1002A104, *(unsigned __int64 *)&flt_1002A104 >> 32)
  1599.                           * v4;
  1600.       v5 = sub_1001009A(*(unsigned __int64 *)&flt_1002A104, *(unsigned __int64 *)&flt_1002A104 >> 32);
  1601.       result = a2;
  1602.       *(float *)(a2 + 90) = v5;
  1603.       break;
  1604.     case 10:
  1605.     case 11:
  1606.     case 12:
  1607.     case 13:
  1608.     case 14:
  1609.     case 15:
  1610.     case 16:
  1611.     case 17:
  1612.     case 18:
  1613.       return result;
  1614.   }
  1615.   return result;
  1616. }
  1617. // 10010090: using guessed type double __cdecl sub_10010090(_DWORD, _DWORD);
  1618. // 1001009A: using guessed type double __cdecl sub_1001009A(_DWORD, _DWORD);
  1619. // 1002A104: using guessed type float flt_1002A104;
  1620. // 1002A108: using guessed type float flt_1002A108;
  1621. // 1002A10C: using guessed type float flt_1002A10C;
  1622.  
  1623. //----- (1000325B) --------------------------------------------------------
  1624. float *__cdecl sub_1000325B(float *a1, float *a2)
  1625. {
  1626.   float *result; // eax@2
  1627.   float v3; // [esp+14h] [ebp-4h]@1
  1628.  
  1629.   v3 = flt_100394E8 / 8.0;
  1630.   result = a1;
  1631.   switch ( a1 )
  1632.   {
  1633.     case 4u:
  1634.       result = a2;
  1635.       a2[4] = a2[4] + v3;
  1636.       break;
  1637.     case 5u:
  1638.       result = a2;
  1639.       a2[4] = a2[4] - v3;
  1640.       break;
  1641.     case 6u:
  1642.       result = a2;
  1643.       a2[5] = a2[5] + v3;
  1644.       break;
  1645.     case 7u:
  1646.       result = a2;
  1647.       a2[5] = a2[5] - v3;
  1648.       break;
  1649.     case 8u:
  1650.       result = a2;
  1651.       a2[6] = a2[6] + v3;
  1652.       break;
  1653.     case 9u:
  1654.       result = a2;
  1655.       a2[6] = a2[6] - v3;
  1656.       break;
  1657.     case 0xAu:
  1658.     case 0xBu:
  1659.     case 0xCu:
  1660.     case 0xDu:
  1661.     case 0xEu:
  1662.     case 0xFu:
  1663.     case 0x10u:
  1664.     case 0x11u:
  1665.     case 0x12u:
  1666.       return result;
  1667.     case 0x13u:
  1668.       result = a2;
  1669.       a2[6] = v3 * 0.1 + a2[6];
  1670.       break;
  1671.     case 0x14u:
  1672.       result = a2;
  1673.       a2[6] = a2[6] - v3 * 0.1;
  1674.       break;
  1675.   }
  1676.   return result;
  1677. }
  1678. // 100394E8: using guessed type float flt_100394E8;
  1679.  
  1680. //----- (10003399) --------------------------------------------------------
  1681. float *__cdecl sub_10003399(int a1, int a2)
  1682. {
  1683.   float *result; // eax@8
  1684.  
  1685.   result = (float *)(a1 - 4);
  1686.   switch ( a1 )
  1687.   {
  1688.     case 4:
  1689.       *(float *)&dword_1002A0D8 = *(float *)&dword_1002A0D8 + flt_1002A110;
  1690.       goto LABEL_9;
  1691.     case 5:
  1692.       *(float *)&dword_1002A0D8 = *(float *)&dword_1002A0D8 - flt_1002A110;
  1693.       goto LABEL_9;
  1694.     case 6:
  1695.       *(float *)&dword_1002A0E0 = *(float *)&dword_1002A0E0 + flt_1002A110;
  1696.       goto LABEL_9;
  1697.     case 7:
  1698.       *(float *)&dword_1002A0E0 = *(float *)&dword_1002A0E0 - flt_1002A110;
  1699.       goto LABEL_9;
  1700.     case 8:
  1701.       *(float *)&dword_1002A0DC = *(float *)&dword_1002A0DC + flt_1002A110;
  1702.       goto LABEL_9;
  1703.     case 9:
  1704.       *(float *)&dword_1002A0DC = *(float *)&dword_1002A0DC - flt_1002A110;
  1705. LABEL_9:
  1706.       result = sub_100072D0((float *)&dword_1002A0D8, (float *)(a2 + 28));
  1707.       break;
  1708.     default:
  1709.       return result;
  1710.   }
  1711.   return result;
  1712. }
  1713. // 1002A0D8: using guessed type int dword_1002A0D8;
  1714. // 1002A0DC: using guessed type int dword_1002A0DC;
  1715. // 1002A0E0: using guessed type int dword_1002A0E0;
  1716. // 1002A110: using guessed type float flt_1002A110;
  1717.  
  1718. //----- (10003490) --------------------------------------------------------
  1719. void *__cdecl sub_10003490(int a1, int a2)
  1720. {
  1721.   unsigned __int8 v2; // ST5C_1@3
  1722.   double v3; // st7@5
  1723.   float v4; // ST68_4@5
  1724.   float v5; // ST70_4@5
  1725.   float v6; // ST58_4@5
  1726.   float v7; // ST74_4@5
  1727.   void *result; // eax@7
  1728.   float v9; // [esp+44h] [ebp-40h]@3
  1729.   float v10; // [esp+48h] [ebp-3Ch]@3
  1730.   float v11; // [esp+4Ch] [ebp-38h]@3
  1731.   unsigned int j; // [esp+50h] [ebp-34h]@3
  1732.   unsigned int i; // [esp+54h] [ebp-30h]@1
  1733.   unsigned int k; // [esp+54h] [ebp-30h]@7
  1734.   float v15; // [esp+64h] [ebp-20h]@3
  1735.   float v16; // [esp+78h] [ebp-Ch]@3
  1736.   float v17; // [esp+7Ch] [ebp-8h]@3
  1737.   _WORD *v18; // [esp+80h] [ebp-4h]@7
  1738.  
  1739.   for ( i = 0; i < 0x100; ++i )
  1740.   {
  1741.     v2 = *(_BYTE *)(i + a2 + 4610);
  1742.     v17 = (double)*(unsigned __int8 *)(3 * v2 + a2 + 2);
  1743.     v15 = (double)*(unsigned __int8 *)(3 * v2 + a2 + 3);
  1744.     v10 = (double)*(unsigned __int8 *)(3 * v2 + a2 + 4);
  1745.     v9 = (double)*(unsigned __int8 *)(3 * v2 + a2 + 2) * 0.050000001;
  1746.     v16 = (double)*(unsigned __int8 *)(3 * v2 + a2 + 3) * 0.050000001;
  1747.     v11 = (double)*(unsigned __int8 *)(3 * v2 + a2 + 4) * 0.050000001;
  1748.     for ( j = 0; j < 0x10; ++j )
  1749.     {
  1750.       v3 = (double)j / 15.0;
  1751.       v4 = v3;
  1752.       v5 = (1.0 - v3) * v9 + v4 * v17;
  1753.       v6 = (1.0 - v4) * v16 + v4 * v15;
  1754.       v7 = (1.0 - v4) * v11 + v4 * v10;
  1755.       *(_WORD *)(a1 + 2 * (i + (j << 8))) = ((unsigned __int16)((signed int)(unsigned __int16)(signed __int64)v5 >> 3) << 10) | 32 * ((signed int)(unsigned __int16)(signed __int64)v6 >> 3) | ((signed int)(unsigned __int16)(signed __int64)v7 >> 3);
  1756.     }
  1757.   }
  1758.   result = lpvBits;
  1759.   v18 = lpvBits;
  1760.   for ( k = 0; k < 0x10000; ++k )
  1761.   {
  1762.     result = (void *)((k & 0x1F) << 10);
  1763.     v18[k] = (_WORD)result;
  1764.   }
  1765.   return result;
  1766. }
  1767.  
  1768. //----- (100036F1) --------------------------------------------------------
  1769. __int16 __cdecl sub_100036F1(void *Dst, int a2, size_t Size)
  1770. {
  1771.   __int16 result; // ax@2
  1772.   _WORD *v4; // [esp+Ch] [ebp-4h]@3
  1773.  
  1774.   if ( byte_100394E4 == 1 )
  1775.     return (unsigned int)memset(Dst, (unsigned __int16)a2, Size);
  1776.   result = (signed __int16)Dst;
  1777.   v4 = Dst;
  1778.   while ( Size )
  1779.   {
  1780.     result = a2;
  1781.     *v4 = a2;
  1782.     --Size;
  1783.     ++v4;
  1784.   }
  1785.   return result;
  1786. }
  1787. // 100394E4: using guessed type char byte_100394E4;
  1788.  
  1789. //----- (10003780) --------------------------------------------------------
  1790. int __cdecl sub_10003780(int a1, HWND hWnd, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10)
  1791. {
  1792.   int v11; // [esp+Ch] [ebp-4h]@1
  1793.  
  1794.   v11 = _open((LPCSTR)a1, 0x8000);
  1795.   if ( v11 == -1 )
  1796.     sub_10003C72(aFileOpenError);
  1797.   ::hWnd = hWnd;
  1798.   sub_10003D40();
  1799.   sub_10002170(v11, a3, a4, a5, a6, a7, a8, a9, a10);
  1800.   SetTimer(hWnd, 1u, 0x32u, 0);
  1801.   SetFocus(hWnd);
  1802.   return 0;
  1803. }
  1804.  
  1805. //----- (10003824) --------------------------------------------------------
  1806. void sub_10003824()
  1807. {
  1808.   KillTimer(hWnd, 1u);
  1809.   sub_10002439();
  1810. }
  1811.  
  1812. //----- (10003842) --------------------------------------------------------
  1813. LRESULT __stdcall sub_10003842(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1814. {
  1815.   HDC hdc; // ST28_4@30
  1816.  
  1817.   if ( Msg > 5 )
  1818.   {
  1819.     if ( Msg > 0xF )
  1820.     {
  1821.       if ( Msg > 0x113 )
  1822.       {
  1823.         if ( Msg != 513 )
  1824.           return DefWindowProcA(hWnd, Msg, wParam, lParam);
  1825.         SetFocus(hWnd);
  1826.       }
  1827.       else
  1828.       {
  1829.         if ( Msg == 275 )
  1830.         {
  1831. LABEL_34:
  1832.           sub_100024B8(1);
  1833.           return 0;
  1834.         }
  1835.         if ( Msg != 256 )
  1836.         {
  1837.           if ( Msg == 258 )
  1838.           {
  1839.             switch ( wParam )
  1840.             {
  1841.               case 0x41u:
  1842.               case 0x61u:
  1843.                 sub_100024B8(14);
  1844.                 break;
  1845.               case 0x43u:
  1846.               case 0x63u:
  1847.                 sub_100024B8(10);
  1848.                 break;
  1849.               case 0x44u:
  1850.               case 0x64u:
  1851.                 sub_100024B8(18);
  1852.                 break;
  1853.               case 0x46u:
  1854.               case 0x66u:
  1855.                 sub_100024B8(16);
  1856.                 break;
  1857.               case 0x4Bu:
  1858.               case 0x6Bu:
  1859.                 sub_100024B8(15);
  1860.                 break;
  1861.               case 0x4Cu:
  1862.               case 0x6Cu:
  1863.                 sub_100024B8(11);
  1864.                 break;
  1865.               case 0x50u:
  1866.               case 0x70u:
  1867.                 sub_100024B8(13);
  1868.                 break;
  1869.               case 0x53u:
  1870.               case 0x73u:
  1871.                 sub_100024B8(12);
  1872.                 break;
  1873.               case 0x54u:
  1874.               case 0x74u:
  1875.                 sub_100024B8(17);
  1876.                 break;
  1877.               default:
  1878.                 return 0;
  1879.             }
  1880.             return 0;
  1881.           }
  1882.           if ( Msg != 260 )
  1883.             return DefWindowProcA(hWnd, Msg, wParam, lParam);
  1884.         }
  1885.         switch ( wParam )
  1886.         {
  1887.           case 0x23u:
  1888.           case 0x61u:
  1889.             sub_100024B8(9);
  1890.             break;
  1891.           case 0x24u:
  1892.           case 0x67u:
  1893.             sub_100024B8(8);
  1894.             break;
  1895.           case 0x25u:
  1896.           case 0x64u:
  1897.             sub_100024B8(4);
  1898.             break;
  1899.           case 0x26u:
  1900.           case 0x68u:
  1901.             sub_100024B8(6);
  1902.             break;
  1903.           case 0x27u:
  1904.           case 0x66u:
  1905.             sub_100024B8(5);
  1906.             break;
  1907.           case 0x28u:
  1908.           case 0x62u:
  1909.             sub_100024B8(7);
  1910.             break;
  1911.           default:
  1912.             return 0;
  1913.         }
  1914.       }
  1915.     }
  1916.     else if ( Msg == 15 )
  1917.     {
  1918.       BeginPaint(::hWnd, (LPPAINTSTRUCT)&Paint);
  1919.       if ( ho )
  1920.       {
  1921.         SelectPalette(Paint, ho, 0);
  1922.         RealizePalette(Paint);
  1923.       }
  1924.       sub_100024B8(2);
  1925.       EndPaint(::hWnd, (const PAINTSTRUCT *)&Paint);
  1926.     }
  1927.     else
  1928.     {
  1929.       if ( Msg != 7 )
  1930.         return DefWindowProcA(hWnd, Msg, wParam, lParam);
  1931.       if ( ho )
  1932.         DeleteObject(ho);
  1933.       hdc = GetDC(::hWnd);
  1934.       ho = CreatePalette(&plpal);
  1935.       SelectPalette(hdc, ho, 0);
  1936.       RealizePalette(hdc);
  1937.       ReleaseDC(::hWnd, hdc);
  1938.     }
  1939.   }
  1940.   else
  1941.   {
  1942.     if ( Msg != 5 )
  1943.     {
  1944.       if ( Msg != 2 )
  1945.         return DefWindowProcA(hWnd, Msg, wParam, lParam);
  1946.       if ( ho )
  1947.         DeleteObject(ho);
  1948.       sub_10002439();
  1949.       PostQuitMessage(0);
  1950.       goto LABEL_34;
  1951.     }
  1952.     SetFocus(hWnd);
  1953.   }
  1954.   return 0;
  1955. }
  1956.  
  1957. //----- (10003C72) --------------------------------------------------------
  1958. void __cdecl __noreturn sub_10003C72(LPCSTR lpText)
  1959. {
  1960.   MessageBoxA(hWnd, lpText, Caption, 0x1000u);
  1961.   exit(0);
  1962. }
  1963.  
  1964. //----- (10003CA1) --------------------------------------------------------
  1965. void __cdecl sub_10003CA1(void *lpvBits, __int16 a2, __int16 a3, __int16 a4, __int16 a5, __int16 a6, __int16 a7)
  1966. {
  1967.   HDC hdc; // ST3C_4@2
  1968.  
  1969.   if ( lpvBits )
  1970.   {
  1971.     bmi.bmiHeader.biWidth = a2;
  1972.     bmi.bmiHeader.biHeight = -a3;
  1973.     bmi.bmiHeader.biBitCount = 16;
  1974.     hdc = GetDC(hWnd);
  1975.     SetDIBitsToDevice(hdc, a4, a5, a6, a7, a4, a3 - a5 - a7, 0, a3, lpvBits, &bmi, 0);
  1976.     ReleaseDC(hWnd, hdc);
  1977.   }
  1978. }
  1979.  
  1980. //----- (10003D40) --------------------------------------------------------
  1981. int sub_10003D40()
  1982. {
  1983.   int result; // eax@2
  1984.   __int16 i; // [esp+Ch] [ebp-4h]@1
  1985.  
  1986.   bmi.bmiHeader.biSize = 40;
  1987.   bmi.bmiHeader.biWidth = 0;
  1988.   bmi.bmiHeader.biHeight = 0;
  1989.   bmi.bmiHeader.biPlanes = 1;
  1990.   bmi.bmiHeader.biBitCount = 8;
  1991.   bmi.bmiHeader.biCompression = 0;
  1992.   bmi.bmiHeader.biSizeImage = 0;
  1993.   bmi.bmiHeader.biXPelsPerMeter = 0;
  1994.   bmi.bmiHeader.biYPelsPerMeter = 0;
  1995.   bmi.bmiHeader.biClrUsed = 0;
  1996.   bmi.bmiHeader.biClrImportant = 0;
  1997.   dword_10039768 = 0;
  1998.   for ( i = 0; ; ++i )
  1999.   {
  2000.     result = i;
  2001.     if ( i >= 256 )
  2002.       break;
  2003.     *((_WORD *)&bmi.bmiColors[0].rgbBlue + i) = i;
  2004.   }
  2005.   return result;
  2006. }
  2007. // 10039768: using guessed type int dword_10039768;
  2008.  
  2009. //----- (10003E80) --------------------------------------------------------
  2010. char __cdecl sub_10003E80(_DWORD *a1)
  2011. {
  2012.   char result; // al@2
  2013.  
  2014.   if ( a1 )
  2015.   {
  2016.     if ( *a1 && a1[1] && a1[2] && a1[3] && a1[4] && a1[5] )
  2017.     {
  2018.       qmemcpy(&dword_10039FF0, a1, 0x18u);
  2019.       result = 0;
  2020.     }
  2021.     else
  2022.     {
  2023.       sub_10005D20(aSetupIsEmpty);
  2024.       result = 1;
  2025.     }
  2026.   }
  2027.   else
  2028.   {
  2029.     sub_10005D20(aNoSetupParamet);
  2030.     result = 1;
  2031.   }
  2032.   return result;
  2033. }
  2034. // 10039FF0: using guessed type int (__cdecl *dword_10039FF0)(_DWORD);
  2035.  
  2036. //----- (10003EF0) --------------------------------------------------------
  2037. int sub_10003EF0()
  2038. {
  2039.   int result; // eax@1
  2040.  
  2041.   result = dword_1002A29C;
  2042.   if ( dword_1002A29C )
  2043.   {
  2044.     result = dword_10039FF4(dword_1002A29C);
  2045.     dword_1002A29C = 0;
  2046.   }
  2047.   return result;
  2048. }
  2049. // 1002A29C: using guessed type int dword_1002A29C;
  2050. // 10039FF4: using guessed type int (__cdecl *dword_10039FF4)(_DWORD);
  2051.  
  2052. //----- (10003F10) --------------------------------------------------------
  2053. void *sub_10003F10()
  2054. {
  2055.   return &unk_10039E00;
  2056. }
  2057.  
  2058. //----- (10003F20) --------------------------------------------------------
  2059. _DWORD *__cdecl sub_10003F20(int a1, const void *a2, const void *a3, int a4)
  2060. {
  2061.   _DWORD *result; // eax@2
  2062.   int v5; // eax@4
  2063.   _DWORD *v6; // ebx@7
  2064.   int v7; // eax@9
  2065.   void *v8; // eax@12
  2066.   const void *v9; // esi@14
  2067.   void *v10; // edi@15
  2068.   signed int v11; // ecx@15
  2069.   void *v12; // eax@16
  2070.   __int16 v13; // ax@21
  2071.   __int16 v14; // ax@23
  2072.  
  2073.   if ( !a2 )
  2074.   {
  2075.     sub_10005D20(aNoColortabPara);
  2076.     return 0;
  2077.   }
  2078.   if ( !dword_1002A29C )
  2079.   {
  2080.     dword_1002A160 = 0;
  2081.     v5 = dword_10039FF0(262156);
  2082.     dword_1002A29C = v5;
  2083.     if ( !v5 )
  2084.     {
  2085.       sub_10005D20(aNoRoomForInter);
  2086.       return 0;
  2087.     }
  2088.     sub_10007C9B(v5, 0, 0, 256, 256);
  2089.     *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  2090.     *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  2091.     *(_WORD *)(dword_1002A29C + 262148) = -1;
  2092.     *(_WORD *)(dword_1002A29C + 262150) = -1;
  2093.     *(_WORD *)(dword_1002A29C + 262152) = 0;
  2094.     *(_WORD *)(dword_1002A29C + 262154) = 0;
  2095.   }
  2096.   v6 = (_DWORD *)dword_10039FF0(44);
  2097.   if ( !v6 )
  2098.   {
  2099.     sub_10005D20(aNoRoomForHandl);
  2100.     return 0;
  2101.   }
  2102.   memset(v6, 0, 0x2Cu);
  2103.   *v6 = a1;
  2104.   v6[1] = a4;
  2105.   v7 = *(unsigned __int8 *)(a4 + 12);
  2106.   if ( v7 == 1 )
  2107.   {
  2108.     v8 = (void *)dword_10039FF0(6144);
  2109.     v6[9] = v8;
  2110.     if ( !v8 )
  2111.     {
  2112.       sub_10005D20(aNoRoomForColor);
  2113.       return 0;
  2114.     }
  2115.     qmemcpy(v8, a2, 0x1800u);
  2116.     v9 = a3;
  2117.     if ( !a3 )
  2118.       goto LABEL_21;
  2119.     v10 = (void *)dword_10039FF0(256);
  2120.     v11 = 64;
  2121.     v6[10] = v10;
  2122.     goto LABEL_20;
  2123.   }
  2124.   if ( v7 != 2 )
  2125.   {
  2126.     sub_10005D20(off_1002A18C);
  2127.     return 0;
  2128.   }
  2129.   v12 = (void *)dword_10039FF0(12288);
  2130.   v6[9] = v12;
  2131.   if ( !v12 )
  2132.   {
  2133.     sub_10005D20(aNoRoomForColor);
  2134.     return 0;
  2135.   }
  2136.   qmemcpy(v12, a2, 0x3000u);
  2137.   v9 = a3;
  2138.   if ( a3 )
  2139.   {
  2140.     v10 = (void *)dword_10039FF0(0x20000);
  2141.     v11 = 0x8000;
  2142.     v6[10] = v10;
  2143. LABEL_20:
  2144.     qmemcpy(v10, v9, 4 * v11);
  2145.   }
  2146. LABEL_21:
  2147.   *((_WORD *)v6 + 4) = 0x7FFF;
  2148.   *((_WORD *)v6 + 5) = 0x7FFF;
  2149.   *((_WORD *)v6 + 6) = -1;
  2150.   *((_WORD *)v6 + 7) = -1;
  2151.   *((_WORD *)v6 + 8) = 0;
  2152.   *((_WORD *)v6 + 9) = 0;
  2153.   *((_WORD *)v6 + 10) = 0;
  2154.   *((_WORD *)v6 + 11) = 0;
  2155.   *((_WORD *)v6 + 12) = *(_WORD *)(a4 + 8) - 1;
  2156.   *((_WORD *)v6 + 13) = *(_WORD *)(a4 + 10) - 1;
  2157.   v6[8] = *(unsigned __int16 *)(a4 + 8);
  2158.   v13 = *((_WORD *)v6 + 12);
  2159.   if ( v13 < 0 || *((_WORD *)v6 + 13) < 0 )
  2160.   {
  2161.     v14 = 0;
  2162.     *((_WORD *)v6 + 14) = 0;
  2163.   }
  2164.   else
  2165.   {
  2166.     *((_WORD *)v6 + 14) = v13 - *((_WORD *)v6 + 10) + 1;
  2167.     v14 = *((_WORD *)v6 + 13) - *((_WORD *)v6 + 11) + 1;
  2168.   }
  2169.   *((_WORD *)v6 + 15) = v14;
  2170.   result = v6;
  2171.   ++dword_1002A160;
  2172.   return result;
  2173. }
  2174. // 10039FF0: invalid function type has been ignored
  2175. // 1002A160: using guessed type int dword_1002A160;
  2176. // 1002A18C: using guessed type char *off_1002A18C;
  2177. // 10039FF0: using guessed type int (__cdecl *dword_10039FF0)(_DWORD);
  2178.  
  2179. //----- (10004180) --------------------------------------------------------
  2180. int __cdecl sub_10004180(int a1)
  2181. {
  2182.   int result; // eax@5
  2183.  
  2184.   if ( *(_DWORD *)(a1 + 36) )
  2185.     dword_10039FF4(*(_DWORD *)(a1 + 36));
  2186.   if ( *(_DWORD *)(a1 + 40) )
  2187.     dword_10039FF4(*(_DWORD *)(a1 + 40));
  2188.   result = dword_10039FF4(a1);
  2189.   if ( !dword_1002A160 || (--dword_1002A160, !dword_1002A160) )
  2190.   {
  2191.     result = dword_10039FF4(dword_1002A29C);
  2192.     dword_1002A29C = 0;
  2193.   }
  2194.   return result;
  2195. }
  2196. // 1002A160: using guessed type int dword_1002A160;
  2197. // 10039FF4: using guessed type int (__cdecl *dword_10039FF4)(_DWORD);
  2198.  
  2199. //----- (100042B0) --------------------------------------------------------
  2200. int __cdecl sub_100042B0(int a1, int a2, int a3, int a4)
  2201. {
  2202.   int v4; // ebx@2
  2203.   int v5; // ecx@2
  2204.   int *v6; // ecx@2
  2205.   int v7; // ebp@2
  2206.   double v8; // st7@2
  2207.   float *v9; // eax@2
  2208.   float v10; // ST1C_4@2
  2209.   double v11; // st7@2
  2210.   char v13; // c0@5
  2211.   double v14; // st7@8
  2212.   double v15; // st7@11
  2213.   double v16; // st7@15
  2214.   _DWORD *v17; // eax@15
  2215.   int v18; // ecx@15
  2216.   bool v19; // zf@18
  2217.   int v20; // eax@19
  2218.   double v21; // st7@19
  2219.   int v22; // esi@22
  2220.   __int16 v23; // ax@22
  2221.   double v24; // st7@22
  2222.   __int16 v25; // ax@22
  2223.   double v26; // st7@22
  2224.   char v27; // t0@25
  2225.   double v28; // st7@25
  2226.   unsigned int v29; // et0@25
  2227.   double v30; // st7@29
  2228.   double v31; // st7@31
  2229.   double v32; // st7@34
  2230.   double v33; // st7@38
  2231.   char v34; // cl@38
  2232.   int v35; // eax@38
  2233.   double v36; // st7@41
  2234.   __int16 v37; // ax@44
  2235.   double v38; // st7@44
  2236.   __int16 v39; // ax@44
  2237.   double v40; // st7@44
  2238.   char v41; // t0@47
  2239.   double v42; // st7@47
  2240.   unsigned int v43; // et0@47
  2241.   double v44; // st7@51
  2242.   double v45; // st7@55
  2243.   _DWORD *v46; // esi@67
  2244.   double v47; // st7@68
  2245.   float *v48; // eax@68
  2246.   int v49; // eax@68
  2247.   double v50; // st7@68
  2248.   signed int v51; // ecx@71
  2249.   signed int v52; // edx@71
  2250.   double v53; // st7@71
  2251.   signed int v54; // ecx@74
  2252.   double v55; // st7@74
  2253.   double v56; // st7@77
  2254.   char v57; // t0@80
  2255.   double v58; // st7@80
  2256.   unsigned int v59; // et0@80
  2257.   double v60; // st7@84
  2258.   double v61; // st7@87
  2259.   char v62; // cl@87
  2260.   double v63; // st7@99
  2261.   signed int v64; // edx@102
  2262.   signed int v65; // ST38_4@102
  2263.   char v66; // t0@102
  2264.   signed int v67; // ecx@102
  2265.   double v68; // st7@102
  2266.   double v69; // st7@102
  2267.   unsigned int v70; // et0@102
  2268.   double v71; // st7@105
  2269.   unsigned int v72; // et0@105
  2270.   double v73; // st7@109
  2271.   double v74; // st7@113
  2272.   __int16 v75; // ax@127
  2273.   _DWORD *v76; // ecx@129
  2274.   int result; // eax@129
  2275.   int v78; // ebx@129
  2276.   int v79; // edx@129
  2277.   unsigned int v80; // [esp-4h] [ebp-108h]@25
  2278.   unsigned int v81; // [esp-4h] [ebp-108h]@47
  2279.   unsigned int v82; // [esp-4h] [ebp-108h]@80
  2280.   unsigned int v83; // [esp-4h] [ebp-108h]@102
  2281.   unsigned int v84; // [esp-4h] [ebp-108h]@105
  2282.   signed __int16 v85; // [esp+12h] [ebp-F2h]@38
  2283.   signed __int16 v86; // [esp+12h] [ebp-F2h]@87
  2284.   int v87; // [esp+14h] [ebp-F0h]@2
  2285.   float v88; // [esp+14h] [ebp-F0h]@11
  2286.   signed int v89; // [esp+14h] [ebp-F0h]@22
  2287.   signed int v90; // [esp+14h] [ebp-F0h]@44
  2288.   signed int v91; // [esp+14h] [ebp-F0h]@71
  2289.   signed int v92; // [esp+14h] [ebp-F0h]@77
  2290.   signed int v93; // [esp+14h] [ebp-F0h]@102
  2291.   int v94; // [esp+18h] [ebp-ECh]@2
  2292.   float v95; // [esp+1Ch] [ebp-E8h]@2
  2293.   float v96; // [esp+20h] [ebp-E4h]@2
  2294.   float v97; // [esp+24h] [ebp-E0h]@34
  2295.   int v98; // [esp+28h] [ebp-DCh]@2
  2296.   float v99; // [esp+2Ch] [ebp-D8h]@2
  2297.   float v100; // [esp+30h] [ebp-D4h]@2
  2298.   float v101; // [esp+34h] [ebp-D0h]@5
  2299.   int v102; // [esp+38h] [ebp-CCh]@2
  2300.   int v103; // [esp+3Ch] [ebp-C8h]@2
  2301.   int v104; // [esp+40h] [ebp-C4h]@2
  2302.   float v105; // [esp+44h] [ebp-C0h]@37
  2303.   _DWORD *v106; // [esp+48h] [ebp-BCh]@2
  2304.   float v107; // [esp+4Ch] [ebp-B8h]@2
  2305.   int v108; // [esp+50h] [ebp-B4h]@2
  2306.   float v109; // [esp+54h] [ebp-B0h]@14
  2307.   float v110; // [esp+58h] [ebp-ACh]@14
  2308.   float v111; // [esp+5Ch] [ebp-A8h]@14
  2309.   float v112; // [esp+60h] [ebp-A4h]@14
  2310.   int v113; // [esp+64h] [ebp-A0h]@2
  2311.   int v114; // [esp+68h] [ebp-9Ch]@2
  2312.   float v115; // [esp+6Ch] [ebp-98h]@2
  2313.   float v116; // [esp+70h] [ebp-94h]@2
  2314.   int v117; // [esp+74h] [ebp-90h]@38
  2315.   int v118; // [esp+98h] [ebp-6Ch]@2
  2316.   char v119; // [esp+BCh] [ebp-48h]@14
  2317.   char v120; // [esp+E0h] [ebp-24h]@14
  2318.  
  2319.   while ( byte_1002A2B8 )
  2320.     ;
  2321.   byte_1002A2B8 = 1;
  2322.   *(_WORD *)(a1 + 8) = 0x7FFF;
  2323.   *(_WORD *)(a1 + 10) = 0x7FFF;
  2324.   *(_WORD *)(a1 + 12) = -1;
  2325.   *(_WORD *)(a1 + 14) = -1;
  2326.   *(_WORD *)(a1 + 16) = 0;
  2327.   *(_WORD *)(a1 + 18) = 0;
  2328.   v4 = *(_DWORD *)(a1 + 12);
  2329.   v5 = *(_DWORD *)(a1 + 16);
  2330.   v102 = *(_DWORD *)(a1 + 8);
  2331.   v103 = v4;
  2332.   v104 = v5;
  2333.   v6 = *(int **)(a2 + 12);
  2334.   v7 = a3;
  2335.   v106 = *(_DWORD **)(a2 + 8);
  2336.   v108 = *v6;
  2337.   sub_100074D0(a3 + 12, a2 + 28, (int)&v118);
  2338.   sub_100075F0((float *)a3, (float *)(a2 + 16), (float *)&v94);
  2339.   *(float *)&v114 = *(float *)(a2 + 52) * v96 + *(float *)(a2 + 40) * v95 + *(float *)(a2 + 28) * *(float *)&v94;
  2340.   v115 = *(float *)(a2 + 44) * v95 + *(float *)(a2 + 32) * *(float *)&v94 + *(float *)(a2 + 56) * v96;
  2341.   v116 = *(float *)(a2 + 60) * v96 + *(float *)(a2 + 48) * v95 + *(float *)(a2 + 36) * *(float *)&v94;
  2342.   v8 = *(float *)(a2 + 64);
  2343.   v9 = (float *)(12 * a4 + v106[1]);
  2344.   v113 = 12 * a4;
  2345.   *(float *)&v98 = v8 * *v9;
  2346.   v10 = *(float *)(a3 + 52);
  2347.   v99 = v9[1] * *(float *)(a2 + 64);
  2348.   v100 = v9[2] * *(float *)(a2 + 64);
  2349.   v107 = sub_10005C80((float *)&v98, (float *)&v118, (float *)&v114, v10, (int)&v94);
  2350.   v11 = *(float *)(v7 + 60) - *(float *)(v7 + 56);
  2351.   v87 = *(unsigned __int16 *)(v7 + 66) - *(unsigned __int16 *)(v7 + 64);
  2352.   if ( dword_10036C7C )
  2353.     unknown_libname_12(v87);
  2354.   else
  2355.     v11 = v11 / (double)v87;
  2356.   v101 = v11;
  2357.   if ( v13 )
  2358.     v101 = -v101;
  2359.   if ( *(_BYTE *)(a2 + 81) )
  2360.   {
  2361.     v14 = *(float *)(a2 + 82);
  2362.     if ( dword_10036C7C )
  2363.       unknown_libname_9(*(_DWORD *)(a2 + 90));
  2364.     else
  2365.       v14 = v14 / *(float *)(a2 + 90);
  2366.     v88 = v14;
  2367.     v15 = *(float *)(a2 + 86);
  2368.     if ( dword_10036C7C )
  2369.       unknown_libname_9(*(_DWORD *)(a2 + 90));
  2370.     else
  2371.       v15 = v15 / *(float *)(a2 + 90);
  2372.     v109 = v15;
  2373.     flt_1002A170 = -v88;
  2374.     flt_1002A17C = -v109;
  2375.     sub_10007560((float *)&unk_1002A168, (float *)(a2 + 16), &v110);
  2376.     v110 = *(float *)(a2 + 94) * v88 + v110;
  2377.     v111 = *(float *)(a2 + 94) * v109 + v111;
  2378.     v112 = *(float *)(a2 + 94) + v112;
  2379.     sub_100075F0(&v110, (float *)a3, (float *)&v98);
  2380.     sub_10007560((float *)(a3 + 12), (float *)&v98, &v110);
  2381.     v110 = v107 * v110;
  2382.     v111 = v107 * v111;
  2383.     sub_100074D0(a3 + 12, (int)&unk_1002A168, (int)&v120);
  2384.     sub_100074D0((int)&v120, a2 + 28, (int)&v119);
  2385.   }
  2386.   v16 = *(float *)(a2 + 64) * v107;
  2387.   v17 = v106;
  2388.   v18 = a4;
  2389.   if ( dword_10036C7C )
  2390.     unknown_libname_13(*(_DWORD *)(a3 + 48));
  2391.   else
  2392.     v16 = *(float *)(a3 + 48) / v16;
  2393.   v19 = (*(_BYTE *)(*v17 + v18) & 0x80) == 0;
  2394.   v109 = v16;
  2395.   if ( v19 )
  2396.   {
  2397.     v20 = sub_10006690(v108, v109, *(_BYTE *)(a2 + 80));
  2398.     v21 = *(float *)&v94;
  2399.     if ( dword_10036C7C )
  2400.       unknown_libname_9(*(_DWORD *)(a3 + 48));
  2401.     else
  2402.       v21 = v21 / *(float *)(a3 + 48);
  2403.     v22 = v20;
  2404.     v23 = *(_WORD *)(a3 + 76) >> 1;
  2405.     *(float *)&v94 = v21 + (double)*(signed __int16 *)(a2 + 98);
  2406.     v89 = *(signed __int16 *)(a2 + 100);
  2407.     v24 = (double)v23 + *(float *)&v94 + 0.5;
  2408.     v25 = *(_WORD *)(a3 + 78);
  2409.     *(float *)&v94 = v24;
  2410.     v26 = v95;
  2411.     if ( dword_10036C7C )
  2412.       unknown_libname_9(*(_DWORD *)(a3 + 48));
  2413.     else
  2414.       v26 = v26 / *(float *)(a3 + 48);
  2415.     v27 = *(_BYTE *)a1;
  2416.     v95 = v26 + (double)v89;
  2417.     v95 = (double)(signed __int16)(v25 >> 1) + v95 + 0.5;
  2418.     v28 = v96 - *(float *)(a3 + 56);
  2419.     v29 = __readeflags();
  2420.     v80 = v29;
  2421.     if ( dword_10036C7C )
  2422.       unknown_libname_9(LODWORD(v101));
  2423.     else
  2424.       v28 = v28 / v101;
  2425.     __writeeflags(v80);
  2426.     v30 = v19 ? v28 + (double)*(unsigned __int16 *)(a3 + 64) : (double)*(unsigned __int16 *)(a3 + 64) - v28;
  2427.     v96 = v30;
  2428.     v96 = (double)*(signed __int16 *)(a2 + 102) + v96;
  2429.     v31 = *(float *)(v22 + 8);
  2430.     if ( dword_10036C7C )
  2431.       unknown_libname_9(LODWORD(v109));
  2432.     else
  2433.       v31 = v31 / v109;
  2434.     v97 = v31;
  2435.     v32 = *(float *)(v22 + 8);
  2436.     if ( dword_10036C7C )
  2437.       unknown_libname_9(LODWORD(v101));
  2438.     else
  2439.       v32 = v32 / v101;
  2440.     v105 = v32 * *(float *)(a2 + 64);
  2441.     if ( sub_10007970((int)&v94, v97, a3) )
  2442.     {
  2443.       v85 = 0;
  2444.     }
  2445.     else
  2446.     {
  2447.       sub_100074D0((int)&v118, 36 * a4 + v106[2], (int)&v117);
  2448.       v33 = sub_100061C0((float *)&v117);
  2449.       v34 = *(_BYTE *)(a2 + 80);
  2450.       v85 = 1;
  2451.       v97 = v97 * v33;
  2452.       v105 = v33 * v105;
  2453.       sub_10004F50(a1, v22, (int)&v94, (int)&v117, a3 + 68, a2 + 68, v97, v105, v34);
  2454.       v102 = *(_DWORD *)(a1 + 8);
  2455.       v35 = *(_DWORD *)(a1 + 16);
  2456.       v103 = *(_DWORD *)(a1 + 12);
  2457.       v104 = v35;
  2458.     }
  2459.     if ( *(_BYTE *)(a2 + 81) )
  2460.     {
  2461.       sub_10007560((float *)&v119, (float *)(v113 + v106[1]), (float *)&v98);
  2462.       *(float *)&v98 = *(float *)(a2 + 64) * *(float *)&v98;
  2463.       v99 = *(float *)(a2 + 64) * v99;
  2464.       v100 = *(float *)(a2 + 64) * v100;
  2465.       *(float *)&v98 = v107 * *(float *)&v98;
  2466.       v99 = v107 * v99;
  2467.       sub_100075C0(&v110, (float *)&v98, (float *)&v94);
  2468.       v36 = *(float *)&v94;
  2469.       if ( dword_10036C7C )
  2470.         unknown_libname_9(*(_DWORD *)(a3 + 48));
  2471.       else
  2472.         v36 = v36 / *(float *)(a3 + 48);
  2473.       v37 = *(_WORD *)(a3 + 76) >> 1;
  2474.       *(float *)&v94 = v36 + (double)*(signed __int16 *)(a2 + 98);
  2475.       v90 = *(signed __int16 *)(a2 + 100);
  2476.       v38 = (double)v37 + *(float *)&v94 + 0.5;
  2477.       v39 = *(_WORD *)(a3 + 78);
  2478.       *(float *)&v94 = v38;
  2479.       v40 = v95;
  2480.       if ( dword_10036C7C )
  2481.         unknown_libname_9(*(_DWORD *)(a3 + 48));
  2482.       else
  2483.         v40 = v40 / *(float *)(a3 + 48);
  2484.       v41 = *(_BYTE *)a1;
  2485.       v95 = v40 + (double)v90;
  2486.       v95 = (double)(signed __int16)(v39 >> 1) + v95 + 0.5;
  2487.       v42 = v96 - *(float *)(a3 + 56);
  2488.       v43 = __readeflags();
  2489.       v81 = v43;
  2490.       if ( dword_10036C7C )
  2491.         unknown_libname_9(LODWORD(v101));
  2492.       else
  2493.         v42 = v42 / v101;
  2494.       __writeeflags(v81);
  2495.       v44 = v19 ? v42 + (double)*(unsigned __int16 *)(a3 + 64) : (double)*(unsigned __int16 *)(a3 + 64) - v42;
  2496.       v96 = v44;
  2497.       v96 = (double)*(signed __int16 *)(a2 + 102) + v96;
  2498.       if ( !sub_10007970((int)&v94, v97, a3) )
  2499.       {
  2500.         sub_100074D0((int)&v119, 36 * a4 + v106[2], (int)&v117);
  2501.         if ( !v85 )
  2502.         {
  2503.           v45 = sub_100061C0((float *)&v117);
  2504.           v97 = v97 * v45;
  2505.           v105 = v45 * v105;
  2506.         }
  2507.         sub_100053E0(a1, v22, (int)&v94, (int)&v117, a3 + 68, v97, v105, *(_BYTE *)(a2 + 80));
  2508.         if ( *(_WORD *)(a1 + 16) && *(_WORD *)(a1 + 18) )
  2509.         {
  2510.           if ( (signed __int16)v102 > *(_WORD *)(a1 + 8) )
  2511.             LOWORD(v102) = *(_WORD *)(a1 + 8);
  2512.           if ( SHIWORD(v102) > *(_WORD *)(a1 + 10) )
  2513.             HIWORD(v102) = *(_WORD *)(a1 + 10);
  2514.           if ( (signed __int16)v103 < *(_WORD *)(a1 + 12) )
  2515.             LOWORD(v103) = *(_WORD *)(a1 + 12);
  2516.           if ( SHIWORD(v103) < *(_WORD *)(a1 + 14) )
  2517.             HIWORD(v103) = *(_WORD *)(a1 + 14);
  2518.         }
  2519.       }
  2520.     }
  2521.   }
  2522.   LOWORD(v106) = 1;
  2523.   if ( *(_DWORD *)a2 > 1 )
  2524.   {
  2525.     do
  2526.     {
  2527.       v46 = (_DWORD *)(*(_DWORD *)(a2 + 8) + 12 * (signed __int16)v106);
  2528.       if ( !(*(_BYTE *)(*v46 + a4) & 0x80) )
  2529.       {
  2530.         v47 = *(float *)(a2 + 64);
  2531.         v48 = (float *)(v113 + v46[1]);
  2532.         v108 = *(_DWORD *)(*(_DWORD *)(a2 + 12) + 4 * (signed __int16)v106);
  2533.         *(float *)&v98 = v47 * *v48;
  2534.         v99 = v48[1] * *(float *)(a2 + 64);
  2535.         v100 = v48[2] * *(float *)(a2 + 64);
  2536.         sub_10005C30((int)&v98, (int)&v118, (int)&v114, v107, (int)&v94);
  2537.         v49 = sub_10006690(v108, v109, *(_BYTE *)(a2 + 80));
  2538.         v50 = *(float *)(v49 + 8);
  2539.         if ( dword_10036C7C )
  2540.           unknown_libname_9(LODWORD(v109));
  2541.         else
  2542.           v50 = v50 / v109;
  2543.         v51 = *(signed __int16 *)(a2 + 98);
  2544.         v108 = v49;
  2545.         v91 = v51;
  2546.         v52 = *(signed __int16 *)(a2 + 100);
  2547.         v97 = v50;
  2548.         v53 = *(float *)(v49 + 8);
  2549.         if ( dword_10036C7C )
  2550.           unknown_libname_9(LODWORD(v101));
  2551.         else
  2552.           v53 = v53 / v101;
  2553.         v54 = (signed __int16)(*(_WORD *)(a3 + 76) >> 1);
  2554.         v105 = v53 * *(float *)(a2 + 64);
  2555.         v55 = *(float *)&v94;
  2556.         if ( dword_10036C7C )
  2557.           unknown_libname_9(*(_DWORD *)(a3 + 48));
  2558.         else
  2559.           v55 = v55 / *(float *)(a3 + 48);
  2560.         *(float *)&v94 = v55 + (double)v91;
  2561.         v92 = v52;
  2562.         *(float *)&v94 = (double)v54 + *(float *)&v94 + 0.5;
  2563.         v56 = v95;
  2564.         if ( dword_10036C7C )
  2565.           unknown_libname_9(*(_DWORD *)(a3 + 48));
  2566.         else
  2567.           v56 = v56 / *(float *)(a3 + 48);
  2568.         v95 = v56 + (double)v92;
  2569.         v57 = *(_BYTE *)a1;
  2570.         v95 = (double)(signed __int16)(*(_WORD *)(a3 + 78) >> 1) + v95 + 0.5;
  2571.         v58 = v96 - *(float *)(a3 + 56);
  2572.         v59 = __readeflags();
  2573.         v82 = v59;
  2574.         if ( dword_10036C7C )
  2575.           unknown_libname_9(LODWORD(v101));
  2576.         else
  2577.           v58 = v58 / v101;
  2578.         __writeeflags(v82);
  2579.         if ( v19 )
  2580.           v60 = v58 + (double)*(unsigned __int16 *)(a3 + 64);
  2581.         else
  2582.           v60 = (double)*(unsigned __int16 *)(a3 + 64) - v58;
  2583.         v96 = v60;
  2584.         v96 = (double)*(signed __int16 *)(a2 + 102) + v96;
  2585.         if ( sub_10007970((int)&v94, v97, a3) )
  2586.         {
  2587.           v86 = 0;
  2588.         }
  2589.         else
  2590.         {
  2591.           sub_100074D0((int)&v118, 36 * a4 + v46[2], (int)&v117);
  2592.           v61 = sub_100061C0((float *)&v117);
  2593.           v86 = 1;
  2594.           v62 = *(_BYTE *)(a2 + 80);
  2595.           v97 = v61 * v97;
  2596.           sub_10004F50(a1, v108, (int)&v94, (int)&v117, a3 + 68, a2 + 68, v97, v105, v62);
  2597.           if ( *(_WORD *)(a1 + 16) && *(_WORD *)(a1 + 18) )
  2598.           {
  2599.             if ( (signed __int16)v102 > *(_WORD *)(a1 + 8) )
  2600.               LOWORD(v102) = *(_WORD *)(a1 + 8);
  2601.             if ( SHIWORD(v102) > *(_WORD *)(a1 + 10) )
  2602.               HIWORD(v102) = *(_WORD *)(a1 + 10);
  2603.             if ( (signed __int16)v103 < *(_WORD *)(a1 + 12) )
  2604.               LOWORD(v103) = *(_WORD *)(a1 + 12);
  2605.             if ( SHIWORD(v103) < *(_WORD *)(a1 + 14) )
  2606.               HIWORD(v103) = *(_WORD *)(a1 + 14);
  2607.           }
  2608.         }
  2609.         if ( *(_BYTE *)(a2 + 81) )
  2610.         {
  2611.           sub_10007560((float *)&v119, (float *)&v98, (float *)&v94);
  2612.           *(float *)&v94 = v107 * *(float *)&v94;
  2613.           v95 = v107 * v95;
  2614.           sub_100075C0(&v110, (float *)&v94, (float *)&v98);
  2615.           v63 = *(float *)&v98;
  2616.           if ( dword_10036C7C )
  2617.             unknown_libname_9(*(_DWORD *)(a3 + 48));
  2618.           else
  2619.             v63 = v63 / *(float *)(a3 + 48);
  2620.           v64 = *(signed __int16 *)(a2 + 100);
  2621.           v65 = (signed __int16)(*(_WORD *)(a3 + 76) >> 1);
  2622.           v66 = *(_BYTE *)a1;
  2623.           v67 = (signed __int16)(*(_WORD *)(a3 + 78) >> 1);
  2624.           *(float *)&v98 = v63 + (double)*(signed __int16 *)(a2 + 98);
  2625.           v68 = (double)v65;
  2626.           v93 = v64;
  2627.           *(float *)&v98 = v68 + *(float *)&v98 + 0.5;
  2628.           v69 = v99;
  2629.           v70 = __readeflags();
  2630.           v83 = v70;
  2631.           if ( dword_10036C7C )
  2632.             unknown_libname_9(*(_DWORD *)(a3 + 48));
  2633.           else
  2634.             v69 = v69 / *(float *)(a3 + 48);
  2635.           __writeeflags(v83);
  2636.           v99 = v69 + (double)v93;
  2637.           v99 = (double)v67 + v99 + 0.5;
  2638.           v71 = v100 - *(float *)(a3 + 56);
  2639.           v72 = __readeflags();
  2640.           v84 = v72;
  2641.           if ( dword_10036C7C )
  2642.             unknown_libname_9(LODWORD(v101));
  2643.           else
  2644.             v71 = v71 / v101;
  2645.           __writeeflags(v84);
  2646.           v73 = v19 ? v71 + (double)*(unsigned __int16 *)(a3 + 64) : (double)*(unsigned __int16 *)(a3 + 64) - v71;
  2647.           v100 = v73;
  2648.           v100 = (double)*(signed __int16 *)(a2 + 102) + v100;
  2649.           if ( !sub_10007970((int)&v98, v97, a3) )
  2650.           {
  2651.             sub_100074D0((int)&v119, 36 * a4 + v46[2], (int)&v117);
  2652.             if ( !v86 )
  2653.             {
  2654.               v74 = sub_100061C0((float *)&v117);
  2655.               v97 = v97 * v74;
  2656.               v105 = v74 * v105;
  2657.             }
  2658.             sub_100053E0(a1, v108, (int)&v98, (int)&v117, a3 + 68, v97, v105, *(_BYTE *)(a2 + 80));
  2659.             if ( *(_WORD *)(a1 + 16) && *(_WORD *)(a1 + 18) )
  2660.             {
  2661.               if ( (signed __int16)v102 > *(_WORD *)(a1 + 8) )
  2662.                 LOWORD(v102) = *(_WORD *)(a1 + 8);
  2663.               if ( SHIWORD(v102) > *(_WORD *)(a1 + 10) )
  2664.                 HIWORD(v102) = *(_WORD *)(a1 + 10);
  2665.               if ( (signed __int16)v103 < *(_WORD *)(a1 + 12) )
  2666.                 LOWORD(v103) = *(_WORD *)(a1 + 12);
  2667.               if ( SHIWORD(v103) < *(_WORD *)(a1 + 14) )
  2668.                 HIWORD(v103) = *(_WORD *)(a1 + 14);
  2669.             }
  2670.           }
  2671.         }
  2672.       }
  2673.       LOWORD(v106) = (_WORD)v106 + 1;
  2674.     }
  2675.     while ( (signed int)(signed __int16)v106 < *(_DWORD *)a2 );
  2676.   }
  2677.   if ( (signed __int16)v103 < 0 || SHIWORD(v103) < 0 )
  2678.   {
  2679.     v75 = 0;
  2680.     LOWORD(v104) = 0;
  2681.   }
  2682.   else
  2683.   {
  2684.     LOWORD(v104) = v103 - v102 + 1;
  2685.     v75 = HIWORD(v103) - HIWORD(v102) + 1;
  2686.   }
  2687.   HIWORD(v104) = v75;
  2688.   v76 = (_DWORD *)(a1 + 8);
  2689.   result = v102;
  2690.   v78 = v103;
  2691.   v79 = v104;
  2692.   *v76 = v102;
  2693.   v76[1] = v78;
  2694.   v76[2] = v79;
  2695.   byte_1002A2B8 = 0;
  2696.   return result;
  2697. }
  2698. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  2699. // 10010D88: using guessed type double __stdcall unknown_libname_12(_DWORD);
  2700. // 10010DBC: using guessed type double __stdcall unknown_libname_13(_DWORD);
  2701. // 1002A170: using guessed type float flt_1002A170;
  2702. // 1002A17C: using guessed type float flt_1002A17C;
  2703. // 1002A2B8: using guessed type char byte_1002A2B8;
  2704. // 10036C7C: using guessed type int dword_10036C7C;
  2705.  
  2706. //----- (10004F50) --------------------------------------------------------
  2707. int __cdecl sub_10004F50(int a1, int a2, int a3, int a4, int a5, int a6, float a7, float a8, char a9)
  2708. {
  2709.   int v9; // edx@1
  2710.   float v10; // ebx@1
  2711.   bool v11; // zf@1
  2712.   int result; // eax@3
  2713.   double v13; // st7@7
  2714.   int v14; // ebp@11
  2715.   int v15; // edx@11
  2716.   __int16 v16; // ax@23
  2717.   signed __int16 *v17; // edi@26
  2718.   int v18; // eax@48
  2719.   __int16 v19; // ax@51
  2720.   _DWORD *v20; // esi@53
  2721.   int v21; // edx@53
  2722.   int v22; // ecx@53
  2723.   int v23; // ecx@61
  2724.   float v24; // [esp+10h] [ebp-48h]@3
  2725.   int v25; // [esp+14h] [ebp-44h]@11
  2726.   int v26; // [esp+18h] [ebp-40h]@11
  2727.   int v27; // [esp+1Ch] [ebp-3Ch]@11
  2728.   __int16 v28; // [esp+20h] [ebp-38h]@26
  2729.   __int16 v29; // [esp+22h] [ebp-36h]@26
  2730.   __int16 v30; // [esp+24h] [ebp-34h]@26
  2731.   __int16 v31; // [esp+26h] [ebp-32h]@26
  2732.   __int16 v32; // [esp+28h] [ebp-30h]@51
  2733.   __int16 v33; // [esp+2Ah] [ebp-2Eh]@53
  2734.   int v34; // [esp+2Ch] [ebp-2Ch]@27
  2735.   int v35; // [esp+30h] [ebp-28h]@27
  2736.   float v36; // [esp+34h] [ebp-24h]@27
  2737.   float v37; // [esp+38h] [ebp-20h]@27
  2738.   int v38; // [esp+3Ch] [ebp-1Ch]@1
  2739.   int v39; // [esp+40h] [ebp-18h]@1
  2740.   float v40; // [esp+44h] [ebp-14h]@1
  2741.   unsigned int v41; // [esp+48h] [ebp-10h]@26
  2742.   float v42; // [esp+4Ch] [ebp-Ch]@27
  2743.   float v43; // [esp+50h] [ebp-8h]@27
  2744.   float v44; // [esp+54h] [ebp-4h]@27
  2745.  
  2746.   v9 = *(_DWORD *)(a3 + 4);
  2747.   v10 = *(float *)(a3 + 8);
  2748.   v11 = (*(_BYTE *)a1 & 1) == 0;
  2749.   v38 = *(_DWORD *)a3;
  2750.   v39 = v9;
  2751.   v40 = v10;
  2752.   if ( !v11 )
  2753.     v40 = 65535.0 - v40;
  2754.   result = LODWORD(a7);
  2755.   v24 = a7;
  2756.   if ( a9 )
  2757.   {
  2758.     if ( a9 != 2 )
  2759.       goto LABEL_11;
  2760.     if ( SLODWORD(a7) > 1068827777 )
  2761.       return result;
  2762.     v13 = a7 * 0.5;
  2763.     goto LABEL_10;
  2764.   }
  2765.   if ( SLODWORD(a7) > 1060439169 )
  2766.   {
  2767.     v13 = a7 * 1.4142271;
  2768. LABEL_10:
  2769.     v24 = v13;
  2770.   }
  2771. LABEL_11:
  2772.   v11 = *(_WORD *)(a1 + 28) == 0;
  2773.   v14 = *(_DWORD *)(a5 + 4);
  2774.   v15 = *(_DWORD *)(a5 + 8);
  2775.   v25 = *(_DWORD *)a5;
  2776.   v26 = v14;
  2777.   v27 = v15;
  2778.   if ( !v11 && *(_WORD *)(a1 + 30) )
  2779.   {
  2780.     if ( (signed __int16)v25 < *(_WORD *)(a1 + 20) )
  2781.       LOWORD(v25) = *(_WORD *)(a1 + 20);
  2782.     if ( SHIWORD(v25) < *(_WORD *)(a1 + 22) )
  2783.       HIWORD(v25) = *(_WORD *)(a1 + 22);
  2784.     if ( (signed __int16)v26 > *(_WORD *)(a1 + 24) )
  2785.       LOWORD(v26) = *(_WORD *)(a1 + 24);
  2786.     if ( SHIWORD(v26) > *(_WORD *)(a1 + 26) )
  2787.       HIWORD(v26) = *(_WORD *)(a1 + 26);
  2788.   }
  2789.   if ( (signed __int16)v26 < 0 || SHIWORD(v26) < 0 )
  2790.   {
  2791.     v16 = 0;
  2792.     LOWORD(v27) = 0;
  2793.   }
  2794.   else
  2795.   {
  2796.     LOWORD(v27) = v26 - v25 + 1;
  2797.     v16 = HIWORD(v26) - HIWORD(v25) + 1;
  2798.   }
  2799.   HIWORD(v27) = v16;
  2800.   if ( *(_BYTE *)a2 & 2 )
  2801.   {
  2802.     v17 = (signed __int16 *)(a2 + 42);
  2803.     v28 = 0x7FFF;
  2804.     v41 = 0;
  2805.     v11 = *(_DWORD *)(a2 + 38) == 0;
  2806.     v29 = 0x7FFF;
  2807.     v30 = -1;
  2808.     v31 = -1;
  2809.     if ( !v11 )
  2810.     {
  2811.       do
  2812.       {
  2813.         v34 = *v17;
  2814.         *(float *)&v35 = (double)v34;
  2815.         v34 = v17[1];
  2816.         v36 = (double)v34;
  2817.         v34 = v17[2];
  2818.         v37 = (double)v34;
  2819.         sub_10007560((float *)a4, (float *)&v35, &v42);
  2820.         v42 = v42 * a7;
  2821.         v43 = v43 * a7;
  2822.         v44 = v44 * a8;
  2823.         sub_100075C0((float *)&v38, &v42, (float *)&v35);
  2824.         if ( a9 )
  2825.         {
  2826.           if ( a9 == 1 )
  2827.           {
  2828.             sub_1000A3D0((int)v17, a4, a7, a8, (int)&v35, a6);
  2829.             if ( SLODWORD(v24) <= 1065353216 )
  2830.               sub_10007E30(a1, (float *)&v35, &v25);
  2831.             else
  2832.               sub_100082A0(a1, (int)&v35, (int)&v25, v24);
  2833.           }
  2834.           else if ( a9 == 2 )
  2835.           {
  2836.             sub_1000A580((int)v17, a4, v24, a8, (int)&v35, a6);
  2837.             sub_10008940((int)&v25, a1, a1, (float *)&v35, &v25);
  2838.           }
  2839.         }
  2840.         else
  2841.         {
  2842.           sub_1000A230((int)v17, a4, a7, a8, (int)&v35, a6);
  2843.           if ( SLODWORD(v24) <= 1065353216 )
  2844.             sub_10007E30(a1, (float *)&v35, &v25);
  2845.           else
  2846.             sub_100082A0(a1, (int)&v35, (int)&v25, v24);
  2847.         }
  2848.         if ( *(_WORD *)(a1 + 16) && *(_WORD *)(a1 + 18) )
  2849.         {
  2850.           if ( v28 > *(_WORD *)(a1 + 8) )
  2851.             v28 = *(_WORD *)(a1 + 8);
  2852.           if ( v29 > *(_WORD *)(a1 + 10) )
  2853.             v29 = *(_WORD *)(a1 + 10);
  2854.           if ( v30 < *(_WORD *)(a1 + 12) )
  2855.             v30 = *(_WORD *)(a1 + 12);
  2856.           if ( v31 < *(_WORD *)(a1 + 14) )
  2857.             v31 = *(_WORD *)(a1 + 14);
  2858.         }
  2859.         v18 = *((_DWORD *)v17 + 6);
  2860.         v41 += v18;
  2861.         v17 = (signed __int16 *)((char *)v17 + 3 * v18 + 32);
  2862.       }
  2863.       while ( *(_DWORD *)(a2 + 38) > v41 );
  2864.     }
  2865.     if ( v30 < 0 || v31 < 0 )
  2866.     {
  2867.       v19 = 0;
  2868.       v32 = 0;
  2869.     }
  2870.     else
  2871.     {
  2872.       v32 = v30 - v28 + 1;
  2873.       v19 = v31 - v29 + 1;
  2874.     }
  2875.     v33 = v19;
  2876.     v20 = (_DWORD *)(a1 + 8);
  2877.     result = *(_DWORD *)&v28;
  2878.     v21 = *(_DWORD *)&v30;
  2879.     v22 = *(_DWORD *)&v32;
  2880.     *v20 = *(_DWORD *)&v28;
  2881.     v20[1] = v21;
  2882.     v20[2] = v22;
  2883.   }
  2884.   else
  2885.   {
  2886.     if ( a9 )
  2887.     {
  2888.       if ( a9 == 1 )
  2889.       {
  2890.         sub_10009F20(a2, a4, a7, a8, (int)&v38, a6);
  2891.       }
  2892.       else if ( a9 == 2 )
  2893.       {
  2894.         sub_1000A0D0(a2, a4, v24, a8, (int)&v38, a6);
  2895.         return sub_10008940(v23, a1, a1, (float *)a3, &v25);
  2896.       }
  2897.     }
  2898.     else
  2899.     {
  2900.       sub_10009D80(a2, a4, a7, a8, (int)&v38, a6);
  2901.     }
  2902.     if ( SLODWORD(v24) <= 1065353216 )
  2903.       result = sub_10007E30(a1, (float *)&v38, &v25);
  2904.     else
  2905.       result = sub_100082A0(a1, (int)&v38, (int)&v25, v24);
  2906.   }
  2907.   return result;
  2908. }
  2909.  
  2910. //----- (100053E0) --------------------------------------------------------
  2911. int __cdecl sub_100053E0(int a1, int a2, int a3, int a4, int a5, float a6, float a7, char a8)
  2912. {
  2913.   int v8; // ebx@1
  2914.   float v9; // ecx@1
  2915.   bool v10; // zf@1
  2916.   int result; // eax@3
  2917.   int v12; // ebp@6
  2918.   int v13; // ecx@6
  2919.   __int16 v14; // ax@18
  2920.   signed __int16 *v15; // ebp@21
  2921.   int v16; // eax@39
  2922.   __int16 v17; // ax@42
  2923.   _DWORD *v18; // esi@44
  2924.   int v19; // edx@44
  2925.   int v20; // ecx@44
  2926.   int v21; // [esp+10h] [ebp-48h]@6
  2927.   int v22; // [esp+14h] [ebp-44h]@6
  2928.   int v23; // [esp+18h] [ebp-40h]@6
  2929.   __int16 v24; // [esp+1Ch] [ebp-3Ch]@21
  2930.   __int16 v25; // [esp+1Eh] [ebp-3Ah]@21
  2931.   __int16 v26; // [esp+20h] [ebp-38h]@21
  2932.   __int16 v27; // [esp+22h] [ebp-36h]@21
  2933.   __int16 v28; // [esp+24h] [ebp-34h]@42
  2934.   __int16 v29; // [esp+26h] [ebp-32h]@44
  2935.   int v30; // [esp+28h] [ebp-30h]@22
  2936.   float v31; // [esp+2Ch] [ebp-2Ch]@3
  2937.   int v32; // [esp+30h] [ebp-28h]@22
  2938.   float v33; // [esp+34h] [ebp-24h]@22
  2939.   float v34; // [esp+38h] [ebp-20h]@22
  2940.   int v35; // [esp+3Ch] [ebp-1Ch]@1
  2941.   int v36; // [esp+40h] [ebp-18h]@1
  2942.   float v37; // [esp+44h] [ebp-14h]@1
  2943.   unsigned int v38; // [esp+48h] [ebp-10h]@21
  2944.   float v39; // [esp+4Ch] [ebp-Ch]@22
  2945.   float v40; // [esp+50h] [ebp-8h]@22
  2946.   float v41; // [esp+54h] [ebp-4h]@22
  2947.  
  2948.   v8 = *(_DWORD *)(a3 + 4);
  2949.   v9 = *(float *)(a3 + 8);
  2950.   v35 = *(_DWORD *)a3;
  2951.   v36 = v8;
  2952.   v10 = (*(_BYTE *)a1 & 1) == 0;
  2953.   v37 = v9;
  2954.   if ( !v10 )
  2955.     v37 = 65535.0 - v37;
  2956.   result = LODWORD(a6);
  2957.   v31 = a6;
  2958.   if ( a8 == 2 )
  2959.   {
  2960.     if ( SLODWORD(a6) > 1068827777 )
  2961.       return result;
  2962.     v31 = a6 * 0.5;
  2963.   }
  2964.   v10 = *(_WORD *)(a1 + 28) == 0;
  2965.   v12 = *(_DWORD *)(a5 + 4);
  2966.   v13 = *(_DWORD *)(a5 + 8);
  2967.   v21 = *(_DWORD *)a5;
  2968.   v22 = v12;
  2969.   v23 = v13;
  2970.   if ( !v10 && *(_WORD *)(a1 + 30) )
  2971.   {
  2972.     if ( (signed __int16)v21 < *(_WORD *)(a1 + 20) )
  2973.       LOWORD(v21) = *(_WORD *)(a1 + 20);
  2974.     if ( SHIWORD(v21) < *(_WORD *)(a1 + 22) )
  2975.       HIWORD(v21) = *(_WORD *)(a1 + 22);
  2976.     if ( (signed __int16)v22 > *(_WORD *)(a1 + 24) )
  2977.       LOWORD(v22) = *(_WORD *)(a1 + 24);
  2978.     if ( SHIWORD(v22) > *(_WORD *)(a1 + 26) )
  2979.       HIWORD(v22) = *(_WORD *)(a1 + 26);
  2980.   }
  2981.   if ( (signed __int16)v22 < 0 || SHIWORD(v22) < 0 )
  2982.   {
  2983.     v14 = 0;
  2984.     LOWORD(v23) = 0;
  2985.   }
  2986.   else
  2987.   {
  2988.     LOWORD(v23) = v22 - v21 + 1;
  2989.     v14 = HIWORD(v22) - HIWORD(v21) + 1;
  2990.   }
  2991.   HIWORD(v23) = v14;
  2992.   if ( *(_BYTE *)a2 & 2 )
  2993.   {
  2994.     v24 = 0x7FFF;
  2995.     v15 = (signed __int16 *)(a2 + 42);
  2996.     v25 = 0x7FFF;
  2997.     v38 = 0;
  2998.     v10 = *(_DWORD *)(a2 + 38) == 0;
  2999.     v26 = -1;
  3000.     v27 = -1;
  3001.     if ( !v10 )
  3002.     {
  3003.       do
  3004.       {
  3005.         v30 = *v15;
  3006.         *(float *)&v32 = (double)v30;
  3007.         v30 = v15[1];
  3008.         v33 = (double)v30;
  3009.         v30 = v15[2];
  3010.         v34 = (double)v30;
  3011.         sub_10007560((float *)a4, (float *)&v32, &v39);
  3012.         v39 = v39 * a6;
  3013.         v40 = v40 * a6;
  3014.         v41 = v41 * a7;
  3015.         sub_100075C0((float *)&v35, &v39, (float *)&v32);
  3016.         if ( (signed int)(unsigned __int8)a8 <= 1 )
  3017.         {
  3018.           sub_1000A880((int)v15, a4, a6, a7, (int)&v32);
  3019.           if ( SLODWORD(v31) <= 1065353216 )
  3020.             sub_10008DE0(a1, (float *)&v32, &v21);
  3021.           else
  3022.             sub_10009250(a1, (int)&v32, (int)&v21, v31);
  3023.         }
  3024.         else if ( a8 == 2 )
  3025.         {
  3026.           sub_1000A880((int)v15, a4, v31, a7, (int)&v32);
  3027.           sub_100098E0((int)&v21, a1, a1, (float *)&v32, &v21);
  3028.         }
  3029.         if ( *(_WORD *)(a1 + 16) && *(_WORD *)(a1 + 18) )
  3030.         {
  3031.           if ( v24 > *(_WORD *)(a1 + 8) )
  3032.             v24 = *(_WORD *)(a1 + 8);
  3033.           if ( v25 > *(_WORD *)(a1 + 10) )
  3034.             v25 = *(_WORD *)(a1 + 10);
  3035.           if ( v26 < *(_WORD *)(a1 + 12) )
  3036.             v26 = *(_WORD *)(a1 + 12);
  3037.           if ( v27 < *(_WORD *)(a1 + 14) )
  3038.             v27 = *(_WORD *)(a1 + 14);
  3039.         }
  3040.         v16 = *((_DWORD *)v15 + 6);
  3041.         v38 += v16;
  3042.         v15 = (signed __int16 *)((char *)v15 + 3 * v16 + 32);
  3043.       }
  3044.       while ( *(_DWORD *)(a2 + 38) > v38 );
  3045.     }
  3046.     if ( v26 < 0 || v27 < 0 )
  3047.     {
  3048.       v17 = 0;
  3049.       v28 = 0;
  3050.     }
  3051.     else
  3052.     {
  3053.       v28 = v26 - v24 + 1;
  3054.       v17 = v27 - v25 + 1;
  3055.     }
  3056.     v29 = v17;
  3057.     v18 = (_DWORD *)(a1 + 8);
  3058.     result = *(_DWORD *)&v24;
  3059.     v19 = *(_DWORD *)&v26;
  3060.     v20 = *(_DWORD *)&v28;
  3061.     *v18 = *(_DWORD *)&v24;
  3062.     v18[1] = v19;
  3063.     v18[2] = v20;
  3064.   }
  3065.   else if ( a8 == 2 )
  3066.   {
  3067.     sub_1000A6E0(a2, a4, v31, a7, (int)&v35);
  3068.     result = sub_100098E0((int)&v35, a1, a1, (float *)&v35, &v21);
  3069.   }
  3070.   else
  3071.   {
  3072.     sub_1000A6E0(a2, a4, a6, a7, (int)&v35);
  3073.     if ( SLODWORD(a6) <= 1065353216 )
  3074.       result = sub_10008DE0(a1, (float *)&v35, &v21);
  3075.     else
  3076.       result = sub_10009250(a1, (int)&v35, (int)&v21, a6);
  3077.   }
  3078.   return result;
  3079. }
  3080.  
  3081. //----- (10005960) --------------------------------------------------------
  3082. int __cdecl sub_10005960(int a1, __int16 a2, float *a3, float *a4)
  3083. {
  3084.   int v4; // ebp@3
  3085.   int v5; // ST2C_4@3
  3086.   float v6; // ST30_4@3
  3087.   double v7; // st7@3
  3088.   double v8; // st7@3
  3089.   double v9; // st7@3
  3090.   float v10; // edx@16
  3091.   float v11; // ecx@16
  3092.   float v12; // edx@16
  3093.   float v13; // ecx@16
  3094.   int result; // eax@17
  3095.   __int16 v15; // [esp+12h] [ebp-7Eh]@1
  3096.   float v16; // [esp+1Ch] [ebp-74h]@3
  3097.   float v17; // [esp+20h] [ebp-70h]@3
  3098.   float v18; // [esp+24h] [ebp-6Ch]@3
  3099.   float v19; // [esp+28h] [ebp-68h]@3
  3100.   float v20; // [esp+2Ch] [ebp-64h]@12
  3101.   float v21; // [esp+30h] [ebp-60h]@14
  3102.   int v22; // [esp+34h] [ebp-5Ch]@3
  3103.   float v23; // [esp+38h] [ebp-58h]@3
  3104.   float v24; // [esp+3Ch] [ebp-54h]@3
  3105.   int v25; // [esp+40h] [ebp-50h]@2
  3106.   int v26; // [esp+44h] [ebp-4Ch]@2
  3107.   float v27; // [esp+48h] [ebp-48h]@3
  3108.   float v28; // [esp+4Ch] [ebp-44h]@3
  3109.   float v29; // [esp+50h] [ebp-40h]@3
  3110.   float v30; // [esp+54h] [ebp-3Ch]@3
  3111.   float v31; // [esp+58h] [ebp-38h]@3
  3112.   float v32; // [esp+5Ch] [ebp-34h]@3
  3113.   int v33; // [esp+60h] [ebp-30h]@3
  3114.   float v34; // [esp+6Ch] [ebp-24h]@3
  3115.   float v35; // [esp+70h] [ebp-20h]@3
  3116.   float v36; // [esp+74h] [ebp-1Ch]@3
  3117.   float v37; // [esp+78h] [ebp-18h]@3
  3118.   float v38; // [esp+7Ch] [ebp-14h]@3
  3119.   float v39; // [esp+80h] [ebp-10h]@3
  3120.   float v40; // [esp+84h] [ebp-Ch]@3
  3121.   float v41; // [esp+88h] [ebp-8h]@3
  3122.   float v42; // [esp+8Ch] [ebp-4h]@3
  3123.  
  3124.   v15 = 0;
  3125.   if ( *(_DWORD *)a1 > 0 )
  3126.   {
  3127.     v25 = 12 * a2;
  3128.     v26 = 36 * a2;
  3129.     do
  3130.     {
  3131.       v4 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * v15);
  3132.       v5 = *(_DWORD *)(a1 + 8) + 12 * v15;
  3133.       v6 = *(float *)(v4 + 8) * *(float *)(a1 + 64);
  3134.       sub_10007560((float *)(a1 + 28), (float *)(v25 + *(_DWORD *)(v5 + 4)), (float *)&v22);
  3135.       sub_10007620((int)&v22, *(float *)(a1 + 64), (int)&v33);
  3136.       sub_100075C0((float *)&v33, (float *)(a1 + 16), (float *)&v22);
  3137.       sub_100074D0(a1 + 28, v26 + *(_DWORD *)(v5 + 8), (int)&v34);
  3138.       v16 = (double)*(signed __int16 *)(v4 + 26) * v6;
  3139.       v17 = (double)*(signed __int16 *)(v4 + 28) * v6;
  3140.       v18 = (double)*(signed __int16 *)(v4 + 30) * v6;
  3141.       sub_10007560(&v34, &v16, &v19);
  3142.       sub_100075C0(&v19, (float *)&v22, (float *)&v33);
  3143.       v7 = (double)*(signed __int16 *)(v4 + 20) * v6;
  3144.       *(float *)&v22 = v34 * v7;
  3145.       v23 = v37 * v7;
  3146.       v24 = v7 * v40;
  3147.       v8 = (double)*(signed __int16 *)(v4 + 22) * v6;
  3148.       v30 = v35 * v8;
  3149.       v31 = v38 * v8;
  3150.       v32 = v8 * v41;
  3151.       v9 = (double)*(signed __int16 *)(v4 + 24) * v6;
  3152.       v27 = v36 * v9;
  3153.       v28 = v39 * v9;
  3154.       v29 = v9 * v42;
  3155.       sub_10005D50((float *)&v33, (float *)&v22, &v30, &v27, &v16, &v19);
  3156.       if ( v15 )
  3157.       {
  3158.         if ( *a3 > (double)v16 )
  3159.           *a3 = v16;
  3160.         if ( a3[1] > (double)v17 )
  3161.           a3[1] = v17;
  3162.         if ( a3[2] > (double)v18 )
  3163.           a3[2] = v18;
  3164.         if ( *a4 < (double)v19 )
  3165.           *a4 = v19;
  3166.         if ( a4[1] < (double)v20 )
  3167.           a4[1] = v20;
  3168.         if ( a4[2] < (double)v21 )
  3169.           a4[2] = v21;
  3170.       }
  3171.       else
  3172.       {
  3173.         v10 = v17;
  3174.         v11 = v18;
  3175.         *a3 = v16;
  3176.         a3[1] = v10;
  3177.         a3[2] = v11;
  3178.         v12 = v20;
  3179.         v13 = v21;
  3180.         *a4 = v19;
  3181.         a4[1] = v12;
  3182.         a4[2] = v13;
  3183.       }
  3184.       result = ++v15;
  3185.     }
  3186.     while ( (signed int)v15 < *(_DWORD *)a1 );
  3187.   }
  3188.   return result;
  3189. }
  3190.  
  3191. //----- (10005C30) --------------------------------------------------------
  3192. float *__cdecl sub_10005C30(int a1, int a2, int a3, float a4, int a5)
  3193. {
  3194.   float *v5; // esi@1
  3195.   float *result; // eax@1
  3196.   char v7; // [esp+4h] [ebp-Ch]@1
  3197.  
  3198.   sub_100075F0((float *)a1, (float *)a3, (float *)&v7);
  3199.   v5 = (float *)a5;
  3200.   result = sub_10007560((float *)a2, (float *)&v7, (float *)a5);
  3201.   *v5 = *v5 * a4;
  3202.   v5[1] = v5[1] * a4;
  3203.   return result;
  3204. }
  3205.  
  3206. //----- (10005C80) --------------------------------------------------------
  3207. double __cdecl sub_10005C80(float *a1, float *a2, float *a3, float a4, int a5)
  3208. {
  3209.   double v6; // st7@5
  3210.   float v7; // [esp+4h] [ebp-Ch]@1
  3211.  
  3212.   sub_100075F0(a1, a3, &v7);
  3213.   sub_10007560(a2, &v7, (float *)a5);
  3214.   if ( *(_DWORD *)(a5 + 8) <= 0 )
  3215.     return 1.0;
  3216.   if ( SLODWORD(a4) > 0 )
  3217.   {
  3218.     v6 = *(float *)(a5 + 8) * a4 + 1.0;
  3219.     if ( dword_10036C7C )
  3220.       unknown_libname_13(1065353216);
  3221.     else
  3222.       v6 = 1.0 / v6;
  3223.     v7 = v6;
  3224.   }
  3225.   else
  3226.   {
  3227.     v7 = 1.0;
  3228.   }
  3229.   *(float *)a5 = *(float *)a5 * v7;
  3230.   *(float *)(a5 + 4) = *(float *)(a5 + 4) * v7;
  3231.   return v7;
  3232. }
  3233. // 10010DBC: using guessed type double __stdcall unknown_libname_13(_DWORD);
  3234. // 10036C7C: using guessed type int dword_10036C7C;
  3235.  
  3236. //----- (10005D20) --------------------------------------------------------
  3237. unsigned int __cdecl sub_10005D20(const char *a1)
  3238. {
  3239.   unsigned int result; // eax@1
  3240.  
  3241.   result = strlen(a1) + 1;
  3242.   qmemcpy(&unk_10039E00, a1, result);
  3243.   return result;
  3244. }
  3245.  
  3246. //----- (10005D50) --------------------------------------------------------
  3247. void __cdecl sub_10005D50(float *a1, float *a2, float *a3, float *a4, float *a5, float *a6)
  3248. {
  3249.   float v6; // [esp+Ch] [ebp-Ch]@1
  3250.   float v7; // [esp+10h] [ebp-8h]@3
  3251.   float v8; // [esp+14h] [ebp-4h]@5
  3252.  
  3253.   *a5 = *a1;
  3254.   a5[1] = a1[1];
  3255.   a5[2] = a1[2];
  3256.   *a6 = *a1;
  3257.   a6[1] = a1[1];
  3258.   a6[2] = a1[2];
  3259.   sub_100075C0(a1, a2, &v6);
  3260.   if ( *a5 > (double)v6 )
  3261.     *a5 = v6;
  3262.   if ( a5[1] > (double)v7 )
  3263.     a5[1] = v7;
  3264.   if ( a5[2] > (double)v8 )
  3265.     a5[2] = v8;
  3266.   if ( *a6 < (double)v6 )
  3267.     *a6 = v6;
  3268.   if ( a6[1] < (double)v7 )
  3269.     a6[1] = v7;
  3270.   if ( a6[2] < (double)v8 )
  3271.     a6[2] = v8;
  3272.   v6 = *a3 + v6;
  3273.   v7 = a3[1] + v7;
  3274.   v8 = a3[2] + v8;
  3275.   if ( *a5 > (double)v6 )
  3276.     *a5 = v6;
  3277.   if ( a5[1] > (double)v7 )
  3278.     a5[1] = v7;
  3279.   if ( a5[2] > (double)v8 )
  3280.     a5[2] = v8;
  3281.   if ( *a6 < (double)v6 )
  3282.     *a6 = v6;
  3283.   if ( a6[1] < (double)v7 )
  3284.     a6[1] = v7;
  3285.   if ( a6[2] < (double)v8 )
  3286.     a6[2] = v8;
  3287.   v6 = v6 - *a2;
  3288.   v7 = v7 - a2[1];
  3289.   v8 = v8 - a2[2];
  3290.   if ( *a5 > (double)v6 )
  3291.     *a5 = v6;
  3292.   if ( a5[1] > (double)v7 )
  3293.     a5[1] = v7;
  3294.   if ( a5[2] > (double)v8 )
  3295.     a5[2] = v8;
  3296.   if ( *a6 < (double)v6 )
  3297.     *a6 = v6;
  3298.   if ( a6[1] < (double)v7 )
  3299.     a6[1] = v7;
  3300.   if ( a6[2] < (double)v8 )
  3301.     a6[2] = v8;
  3302.   v6 = *a4 + v6;
  3303.   v7 = a4[1] + v7;
  3304.   v8 = a4[2] + v8;
  3305.   if ( *a5 > (double)v6 )
  3306.     *a5 = v6;
  3307.   if ( a5[1] > (double)v7 )
  3308.     a5[1] = v7;
  3309.   if ( a5[2] > (double)v8 )
  3310.     a5[2] = v8;
  3311.   if ( *a6 < (double)v6 )
  3312.     *a6 = v6;
  3313.   if ( a6[1] < (double)v7 )
  3314.     a6[1] = v7;
  3315.   if ( a6[2] < (double)v8 )
  3316.     a6[2] = v8;
  3317.   v6 = *a2 + v6;
  3318.   v7 = a2[1] + v7;
  3319.   v8 = a2[2] + v8;
  3320.   if ( *a5 > (double)v6 )
  3321.     *a5 = v6;
  3322.   if ( a5[1] > (double)v7 )
  3323.     a5[1] = v7;
  3324.   if ( a5[2] > (double)v8 )
  3325.     a5[2] = v8;
  3326.   if ( *a6 < (double)v6 )
  3327.     *a6 = v6;
  3328.   if ( a6[1] < (double)v7 )
  3329.     a6[1] = v7;
  3330.   if ( a6[2] < (double)v8 )
  3331.     a6[2] = v8;
  3332.   v6 = v6 - *a3;
  3333.   v7 = v7 - a3[1];
  3334.   v8 = v8 - a3[2];
  3335.   if ( *a5 > (double)v6 )
  3336.     *a5 = v6;
  3337.   if ( a5[1] > (double)v7 )
  3338.     a5[1] = v7;
  3339.   if ( a5[2] > (double)v8 )
  3340.     a5[2] = v8;
  3341.   if ( *a6 < (double)v6 )
  3342.     *a6 = v6;
  3343.   if ( a6[1] < (double)v7 )
  3344.     a6[1] = v7;
  3345.   if ( a6[2] < (double)v8 )
  3346.     a6[2] = v8;
  3347.   v6 = v6 - *a2;
  3348.   v7 = v7 - a2[1];
  3349.   v8 = v8 - a2[2];
  3350.   if ( *a5 > (double)v6 )
  3351.     *a5 = v6;
  3352.   if ( a5[1] > (double)v7 )
  3353.     a5[1] = v7;
  3354.   if ( a5[2] > (double)v8 )
  3355.     a5[2] = v8;
  3356.   if ( *a6 < (double)v6 )
  3357.     *a6 = v6;
  3358.   if ( a6[1] < (double)v7 )
  3359.     a6[1] = v7;
  3360.   if ( a6[2] < (double)v8 )
  3361.     a6[2] = v8;
  3362. }
  3363.  
  3364. //----- (100061C0) --------------------------------------------------------
  3365. double __cdecl sub_100061C0(float *a1)
  3366. {
  3367.   float *v1; // ecx@1
  3368.   int v2; // eax@1
  3369.   double v4; // st7@5
  3370.   double v5; // st6@6
  3371.   float v6; // ST04_4@10
  3372.   char v8; // c3@10
  3373.   double v9; // st6@14
  3374.   int v10; // ST00_4@16
  3375.   float v11; // [esp+0h] [ebp-Ch]@1
  3376.   float v12; // [esp+0h] [ebp-Ch]@10
  3377.   float v13; // [esp+4h] [ebp-8h]@1
  3378.   float v14; // [esp+8h] [ebp-4h]@1
  3379.  
  3380.   v1 = a1;
  3381.   v11 = *a1 * *a1 + a1[1] * a1[1] + a1[2] * a1[2];
  3382.   v14 = a1[3] * a1[3] + a1[4] * a1[4] + a1[5] * a1[5];
  3383.   HIWORD(v2) = 16257;
  3384.   v13 = a1[6] * a1[6] + a1[7] * a1[7] + a1[8] * a1[8];
  3385.   if ( SLODWORD(v11) < 1065437102 && SLODWORD(v14) < 1065437102 && SLODWORD(v13) < 1065437102 )
  3386.     return 1.0;
  3387.   v4 = v13;
  3388.   if ( v14 >= (double)v11 )
  3389.   {
  3390.     v5 = v14;
  3391.     if ( v14 < v4 )
  3392.       goto LABEL_10;
  3393.   }
  3394.   else
  3395.   {
  3396.     v5 = v11;
  3397.     if ( v11 < v4 )
  3398.       goto LABEL_10;
  3399.   }
  3400.   v4 = v5;
  3401. LABEL_10:
  3402.   v6 = v4;
  3403.   v12 = sqrt(v6);
  3404.   if ( v8 )
  3405.     return 1.0;
  3406.   LOWORD(v2) = 9;
  3407.   while ( 1 )
  3408.   {
  3409.     v9 = *v1;
  3410.     if ( dword_10036C7C )
  3411.     {
  3412.       unknown_libname_6(v1, v2);
  3413.       v2 = v10;
  3414.     }
  3415.     else
  3416.     {
  3417.       v9 = v9 / v12;
  3418.     }
  3419.     ++v1;
  3420.     LOWORD(v2) = v2 - 1;
  3421.     if ( !(_WORD)v2 )
  3422.       break;
  3423.     *(v1 - 1) = v9;
  3424.   }
  3425.   *(v1 - 1) = v9;
  3426.   return v12;
  3427. }
  3428. // 100107F7: using guessed type int __thiscall unknown_libname_6(_DWORD, _DWORD);
  3429. // 10036C7C: using guessed type int dword_10036C7C;
  3430.  
  3431. //----- (100063D0) --------------------------------------------------------
  3432. void *__cdecl sub_100063D0(int a1)
  3433. {
  3434.   void *result; // eax@2
  3435.   int v2; // ebx@5
  3436.   void *v3; // [esp+Ch] [ebp-Ch]@5
  3437.   int v4; // [esp+10h] [ebp-8h]@1
  3438.   int v5; // [esp+14h] [ebp-4h]@5
  3439.  
  3440.   if ( sub_10006840(a1, (int)&v4, 8) )
  3441.     return 0;
  3442.   if ( v4 == 5396035 )
  3443.   {
  3444.     v2 = v5 - 8;
  3445.     if ( sub_10006810(44, (int *)&v3) )
  3446.     {
  3447.       result = 0;
  3448.     }
  3449.     else
  3450.     {
  3451.       memset(v3, 0, 0x2Cu);
  3452.       while ( v2 )
  3453.       {
  3454.         if ( sub_10006840(a1, (int)&v4, 8) )
  3455.           return 0;
  3456.         v2 -= v5;
  3457.         if ( v2 < 0 )
  3458.         {
  3459.           sub_10006880(off_1002A26C[0]);
  3460.           return 0;
  3461.         }
  3462.         if ( v4 > 0x2000000 )
  3463.         {
  3464.           if ( v4 == 50331648 )
  3465.           {
  3466.             if ( sub_10006940(a1, (int *)v3, v5) )
  3467.               return 0;
  3468.           }
  3469.           else
  3470.           {
  3471.             if ( v4 != 0x4000000 )
  3472.             {
  3473. LABEL_14:
  3474.               sub_10006880(off_1002A26C[0]);
  3475.               return 0;
  3476.             }
  3477.             if ( sub_10006AE0(a1, (int *)v3, v5) )
  3478.               return 0;
  3479.           }
  3480.         }
  3481.         else if ( v4 == 0x2000000 )
  3482.         {
  3483.           if ( sub_100068E0(a1, (int)v3, v5) )
  3484.             return 0;
  3485.         }
  3486.         else
  3487.         {
  3488.           if ( v4 != 0x1000000 )
  3489.             goto LABEL_14;
  3490.           if ( (unsigned __int16)sub_100068B0(a1, (int)v3) )
  3491.             return 0;
  3492.         }
  3493.       }
  3494.       result = v3;
  3495.     }
  3496.   }
  3497.   else
  3498.   {
  3499.     sub_10006880(off_1002A26C[0]);
  3500.     result = 0;
  3501.   }
  3502.   return result;
  3503. }
  3504. // 1002A26C: using guessed type char *off_1002A26C[4];
  3505.  
  3506. //----- (10006570) --------------------------------------------------------
  3507. int __cdecl sub_10006570(_DWORD *a1)
  3508. {
  3509.   int result; // eax@7
  3510.   int v2; // edi@9
  3511.   int v3; // ebx@11
  3512.   int v4; // ebx@14
  3513.   int v5; // edi@16
  3514.   int v6; // edi@25
  3515.   int i; // ebx@26
  3516.  
  3517.   if ( a1[1] )
  3518.     dword_10039FF4(a1[1]);
  3519.   if ( a1[2] )
  3520.     dword_10039FF4(a1[2]);
  3521.   if ( a1[3] )
  3522.     dword_10039FF4(a1[3]);
  3523.   result = a1[5];
  3524.   if ( result )
  3525.     result = dword_10039FF4(a1[5]);
  3526.   v2 = 0;
  3527.   if ( a1[8] )
  3528.   {
  3529.     if ( a1[7] > 0 )
  3530.     {
  3531.       v3 = 0;
  3532.       do
  3533.       {
  3534.         v3 += 4;
  3535.         ++v2;
  3536.         dword_10039FF4(*(_DWORD *)(a1[8] + v3 - 4));
  3537.       }
  3538.       while ( a1[7] > v2 );
  3539.     }
  3540.     result = dword_10039FF4(a1[8]);
  3541.   }
  3542.   v4 = 0;
  3543.   if ( a1[10] )
  3544.   {
  3545.     if ( a1[7] > 0 )
  3546.     {
  3547.       v5 = 0;
  3548.       do
  3549.       {
  3550.         if ( *(_DWORD *)(a1[10] + v5) )
  3551.           dword_10039FF4(*(_DWORD *)(a1[10] + v5));
  3552.         if ( *(_DWORD *)(a1[10] + v5 + 4) )
  3553.           dword_10039FF4(*(_DWORD *)(a1[10] + v5 + 4));
  3554.         if ( *(_DWORD *)(a1[10] + v5 + 8) )
  3555.           dword_10039FF4(*(_DWORD *)(a1[10] + v5 + 8));
  3556.         v5 += 12;
  3557.         ++v4;
  3558.       }
  3559.       while ( a1[7] > v4 );
  3560.     }
  3561.     result = dword_10039FF4(a1[10]);
  3562.   }
  3563.   v6 = 0;
  3564.   if ( a1[9] )
  3565.   {
  3566.     for ( i = 0; a1[7] > i; ++i )
  3567.     {
  3568.       if ( *(_DWORD *)(a1[9] + v6) )
  3569.         dword_10039FF4(*(_DWORD *)(a1[9] + v6));
  3570.       v6 += 4;
  3571.     }
  3572.     result = dword_10039FF4(a1[9]);
  3573.   }
  3574.   return result;
  3575. }
  3576. // 10039FF4: using guessed type int (__cdecl *dword_10039FF4)(_DWORD);
  3577.  
  3578. //----- (10006690) --------------------------------------------------------
  3579. int __cdecl sub_10006690(int a1, float a2, char a3)
  3580. {
  3581.   double v3; // st7@4
  3582.   int v4; // edx@7
  3583.   double v5; // st7@8
  3584.   int v6; // ecx@10
  3585.  
  3586.   if ( !a3 )
  3587.   {
  3588.     v3 = a2 * 0.70709997;
  3589. LABEL_6:
  3590.     a2 = v3;
  3591.     goto LABEL_7;
  3592.   }
  3593.   if ( a3 == 2 )
  3594.   {
  3595.     v3 = a2 * 1.4141999;
  3596.     goto LABEL_6;
  3597.   }
  3598. LABEL_7:
  3599.   v4 = a1;
  3600.   if ( *(_BYTE *)a1 & 1 )
  3601.   {
  3602.     v5 = a2;
  3603.     do
  3604.     {
  3605.       if ( v5 <= *(float *)(v4 + 8) )
  3606.         break;
  3607.       v6 = v4 + *(_DWORD *)(v4 + 12);
  3608.       if ( v5 < *(float *)(v6 + 8) )
  3609.         break;
  3610.       v4 += *(_DWORD *)(v4 + 12);
  3611.     }
  3612.     while ( *(_BYTE *)v6 & 1 );
  3613.   }
  3614.   return v4;
  3615. }
  3616.  
  3617. //----- (10006810) --------------------------------------------------------
  3618. signed __int16 __cdecl sub_10006810(int a1, int *a2)
  3619. {
  3620.   int v2; // eax@1
  3621.  
  3622.   v2 = dword_10039FF0(a1);
  3623.   *a2 = v2;
  3624.   if ( v2 )
  3625.     return 0;
  3626.   sub_10006880(off_1002A274[0]);
  3627.   return -1;
  3628. }
  3629. // 1002A274: using guessed type char *off_1002A274[2];
  3630. // 10039FF0: using guessed type int (__cdecl *dword_10039FF0)(_DWORD);
  3631.  
  3632. //----- (10006840) --------------------------------------------------------
  3633. signed __int16 __cdecl sub_10006840(int a1, int a2, int a3)
  3634. {
  3635.   if ( dword_10039FF8(a1, a2, a3) == a3 )
  3636.     return 0;
  3637.   sub_10006880(off_1002A270[0]);
  3638.   return -1;
  3639. }
  3640. // 1002A270: using guessed type char *off_1002A270[3];
  3641. // 10039FF8: using guessed type int (__cdecl *dword_10039FF8)(_DWORD, _DWORD, _DWORD);
  3642.  
  3643. //----- (10006880) --------------------------------------------------------
  3644. unsigned int __cdecl sub_10006880(const char *a1)
  3645. {
  3646.   unsigned int result; // eax@1
  3647.  
  3648.   result = strlen(a1) + 1;
  3649.   qmemcpy(&unk_10039E00, a1, result);
  3650.   return result;
  3651. }
  3652.  
  3653. //----- (100068B0) --------------------------------------------------------
  3654. int __cdecl sub_100068B0(int a1, int a2)
  3655. {
  3656.   return ((unsigned __int16)sub_10006840(a1, a2, 4) < 1u) - 1;
  3657. }
  3658.  
  3659. //----- (100068E0) --------------------------------------------------------
  3660. signed __int16 __cdecl sub_100068E0(int a1, int a2, int a3)
  3661. {
  3662.   int v3; // esi@1
  3663.   int *v4; // edi@1
  3664.  
  3665.   v3 = a3 - 8;
  3666.   v4 = (int *)(a2 + 4);
  3667.   if ( sub_10006810(a3 - 8 + 1, (int *)(a2 + 4)) )
  3668.     return -1;
  3669.   if ( sub_10006840(a1, *v4, v3) )
  3670.     return -1;
  3671.   *(_BYTE *)(*v4 + v3) = 0;
  3672.   return 0;
  3673. }
  3674.  
  3675. //----- (10006940) --------------------------------------------------------
  3676. signed __int16 __cdecl sub_10006940(int a1, int *a2, int a3)
  3677. {
  3678.   int v3; // ebx@1
  3679.   int v5; // ebp@9
  3680.   int v6; // ebp@12
  3681.   int v7; // ebp@15
  3682.   int v8; // [esp+10h] [ebp-8h]@3
  3683.   int v9; // [esp+14h] [ebp-4h]@4
  3684.  
  3685.   v3 = a3 - 8;
  3686.   while ( v3 )
  3687.   {
  3688.     if ( sub_10006840(a1, (int)&v8, 8) )
  3689.       return -1;
  3690.     v3 -= v9;
  3691.     if ( v3 < 0 )
  3692.     {
  3693.       sub_10006880(off_1002A26C[0]);
  3694.       return -1;
  3695.     }
  3696.     if ( v8 == 16842752 )
  3697.     {
  3698.       v5 = v9 - 8;
  3699.       if ( sub_10006810(v9 - 7, a2 + 2) )
  3700.         return -1;
  3701.       if ( sub_10006840(a1, a2[2], v5) )
  3702.         return -1;
  3703.       *(_BYTE *)(a2[2] + v5) = 0;
  3704.     }
  3705.     else if ( v8 == 16908288 )
  3706.     {
  3707.       v6 = v9 - 8;
  3708.       if ( sub_10006810(v9 - 8, a2 + 3) )
  3709.         return -1;
  3710.       if ( sub_10006840(a1, a2[3], v6) )
  3711.         return -1;
  3712.     }
  3713.     else
  3714.     {
  3715.       if ( v8 != 16973824 )
  3716.       {
  3717.         sub_10006880(off_1002A26C[0]);
  3718.         return -1;
  3719.       }
  3720.       v7 = v9 - 8;
  3721.       if ( sub_10006810(v9 - 8, a2 + 4) )
  3722.         return -1;
  3723.       if ( sub_10006840(a1, a2[4], v7) )
  3724.         return -1;
  3725.     }
  3726.   }
  3727.   return 0;
  3728. }
  3729. // 1002A26C: using guessed type char *off_1002A26C[4];
  3730.  
  3731. //----- (10006AE0) --------------------------------------------------------
  3732. signed __int16 __cdecl sub_10006AE0(int a1, int *a2, int a3)
  3733. {
  3734.   int *v3; // esi@2
  3735.   int *v5; // ebp@12
  3736.   int v6; // edi@12
  3737.   unsigned int v7; // ebp@16
  3738.   unsigned int v8; // ebp@17
  3739.   unsigned int v9; // ebp@18
  3740.   int v10; // [esp+10h] [ebp-10h]@15
  3741.   int v11; // [esp+14h] [ebp-Ch]@1
  3742.   int v12; // [esp+18h] [ebp-8h]@3
  3743.   int v13; // [esp+1Ch] [ebp-4h]@4
  3744.  
  3745.   v11 = a3 - 8;
  3746.   if ( a3 != 8 )
  3747.   {
  3748.     v3 = a2;
  3749.     while ( 1 )
  3750.     {
  3751.       if ( sub_10006840(a1, (int)&v12, 8) )
  3752.         return -1;
  3753.       v11 -= v13;
  3754.       if ( v11 < 0 )
  3755.       {
  3756.         sub_10006880(off_1002A26C[0]);
  3757.         return -1;
  3758.       }
  3759.       if ( v12 > 67239936 )
  3760.       {
  3761.         if ( v12 == 67305472 )
  3762.         {
  3763.           if ( sub_10006840(a1, (int)(a2 + 6), 4) )
  3764.             return -1;
  3765.         }
  3766.         else
  3767.         {
  3768.           if ( v12 != 67371008 )
  3769.           {
  3770. LABEL_8:
  3771.             sub_10006880(off_1002A26C[0]);
  3772.             return -1;
  3773.           }
  3774.           if ( sub_10006D60(a1, a2, v13) )
  3775.             return -1;
  3776.           ++a2[7];
  3777.         }
  3778.       }
  3779.       else if ( v12 == 67239936 )
  3780.       {
  3781.         if ( sub_10006840(a1, (int)&v10, 4) )
  3782.           return -1;
  3783.         v7 = 4 * v10;
  3784.         if ( sub_10006810(4 * v10, a2 + 8) )
  3785.           return -1;
  3786.         memset((void *)a2[8], 0, v7);
  3787.         v8 = 4 * v10;
  3788.         if ( sub_10006810(4 * v10, a2 + 9) )
  3789.           return -1;
  3790.         memset((void *)a2[9], 0, v8);
  3791.         v9 = 12 * v10;
  3792.         if ( sub_10006810(12 * v10, a2 + 10) )
  3793.           return -1;
  3794.         memset((void *)a2[10], 0, v9);
  3795.         a2[7] = 0;
  3796.       }
  3797.       else
  3798.       {
  3799.         if ( v12 != 67174400 )
  3800.           goto LABEL_8;
  3801.         v5 = a2 + 5;
  3802.         v6 = v13 - 8;
  3803.         if ( sub_10006810(v13 - 7, a2 + 5) )
  3804.           return -1;
  3805.         if ( sub_10006840(a1, *v5, v6) )
  3806.           return -1;
  3807.         *(_BYTE *)(*v5 + v6) = 0;
  3808.       }
  3809.       if ( !v11 )
  3810.         goto LABEL_36;
  3811.     }
  3812.   }
  3813.   v3 = a2;
  3814. LABEL_36:
  3815.   if ( v3[7] == v10 )
  3816.     return 0;
  3817.   sub_10006880(aNumberOfObject);
  3818.   return -1;
  3819. }
  3820. // 1002A26C: using guessed type char *off_1002A26C[4];
  3821.  
  3822. //----- (10006D60) --------------------------------------------------------
  3823. signed __int16 __cdecl sub_10006D60(int a1, int *a2, int a3)
  3824. {
  3825.   int v3; // ebx@1
  3826.   int v5; // ebp@9
  3827.   int v6; // [esp+10h] [ebp-Ch]@3
  3828.   int v7; // [esp+14h] [ebp-8h]@4
  3829.   int v8; // [esp+18h] [ebp-4h]@1
  3830.  
  3831.   v8 = a3 - 8;
  3832.   v3 = a2[7];
  3833.   while ( v8 )
  3834.   {
  3835.     if ( sub_10006840(a1, (int)&v6, 8) )
  3836.       return -1;
  3837.     v8 -= v7;
  3838.     if ( v8 < 0 )
  3839.     {
  3840.       sub_10006880(off_1002A26C[0]);
  3841.       return -1;
  3842.     }
  3843.     if ( v6 == 67371264 )
  3844.     {
  3845.       v5 = v7 - 8;
  3846.       if ( sub_10006810(v7 - 8 + 1, (int *)(a2[8] + 4 * v3)) )
  3847.         return -1;
  3848.       if ( sub_10006840(a1, *(_DWORD *)(a2[8] + 4 * v3), v5) )
  3849.         return -1;
  3850.       *(_BYTE *)(*(_DWORD *)(a2[8] + 4 * v3) + v5) = 0;
  3851.     }
  3852.     else if ( v6 == 67371520 )
  3853.     {
  3854.       if ( sub_10006EE0(a1, (int *)(a2[9] + 4 * v3), v7) )
  3855.         return -1;
  3856.     }
  3857.     else
  3858.     {
  3859.       if ( v6 != 67371776 )
  3860.       {
  3861.         sub_10006880(off_1002A26C[0]);
  3862.         return -1;
  3863.       }
  3864.       if ( sub_10006FB0(a1, (int *)(a2[10] + 12 * v3), v7, a2[6]) )
  3865.         return -1;
  3866.     }
  3867.   }
  3868.   return 0;
  3869. }
  3870. // 1002A26C: using guessed type char *off_1002A26C[4];
  3871.  
  3872. //----- (10006EE0) --------------------------------------------------------
  3873. signed __int16 __cdecl sub_10006EE0(int a1, int *a2, int a3)
  3874. {
  3875.   int v3; // ebx@1
  3876.   int v4; // ebp@6
  3877.   int v6; // [esp+10h] [ebp-8h]@3
  3878.   int v7; // [esp+14h] [ebp-4h]@4
  3879.  
  3880.   v3 = a3 - 8;
  3881.   while ( v3 )
  3882.   {
  3883.     if ( sub_10006840(a1, (int)&v6, 8) )
  3884.       return -1;
  3885.     v3 -= v7;
  3886.     if ( v3 < 0 )
  3887.     {
  3888.       sub_10006880(off_1002A26C[0]);
  3889.       return -1;
  3890.     }
  3891.     if ( v6 != 67371521 )
  3892.     {
  3893.       sub_10006880(off_1002A26C[0]);
  3894.       return -1;
  3895.     }
  3896.     v4 = v7 - 8;
  3897.     if ( sub_10006810(v7 - 8, a2) )
  3898.       return -1;
  3899.     if ( sub_10006840(a1, *a2, v4) )
  3900.       return -1;
  3901.   }
  3902.   return 0;
  3903. }
  3904. // 1002A26C: using guessed type char *off_1002A26C[4];
  3905.  
  3906. //----- (10006FB0) --------------------------------------------------------
  3907. signed __int16 __cdecl sub_10006FB0(int a1, int *a2, int a3, int a4)
  3908. {
  3909.   int v5; // [esp+10h] [ebp-Ch]@1
  3910.   int v6; // [esp+14h] [ebp-8h]@3
  3911.   int v7; // [esp+18h] [ebp-4h]@4
  3912.  
  3913.   v5 = a3 - 8;
  3914.   while ( v5 )
  3915.   {
  3916.     if ( sub_10006840(a1, (int)&v6, 8) )
  3917.       return -1;
  3918.     v5 -= v7;
  3919.     if ( v5 < 0 )
  3920.     {
  3921.       sub_10006880(off_1002A26C[0]);
  3922.       return -1;
  3923.     }
  3924.     if ( v6 == 67371777 )
  3925.     {
  3926.       if ( sub_10006810(a4, a2) )
  3927.         return -1;
  3928.       if ( sub_10006840(a1, *a2, a4) )
  3929.         return -1;
  3930.     }
  3931.     else if ( v6 == 67371778 )
  3932.     {
  3933.       if ( sub_10006810(12 * a4, a2 + 1) )
  3934.         return -1;
  3935.       if ( sub_10006840(a1, a2[1], 12 * a4) )
  3936.         return -1;
  3937.     }
  3938.     else
  3939.     {
  3940.       if ( v6 != 67371779 )
  3941.       {
  3942.         sub_10006880(off_1002A26C[0]);
  3943.         return -1;
  3944.       }
  3945.       if ( sub_10006810(36 * a4, a2 + 2) )
  3946.         return -1;
  3947.       if ( sub_10006840(a1, a2[2], 36 * a4) )
  3948.         return -1;
  3949.     }
  3950.   }
  3951.   return 0;
  3952. }
  3953. // 1002A26C: using guessed type char *off_1002A26C[4];
  3954.  
  3955. //----- (10007150) --------------------------------------------------------
  3956. char __cdecl sub_10007150(int a1, unsigned __int8 *a2)
  3957. {
  3958.   __int16 v2; // dx@1
  3959.   float v3; // ST18_4@2
  3960.   float v4; // ST1C_4@2
  3961.   float v5; // ST0C_4@1
  3962.   char v6; // bl@1
  3963.   double v7; // st3@2
  3964.   __int64 v8; // ST0C_8@2
  3965.   char v10; // c0@2
  3966.  
  3967.   v2 = 0;
  3968.   v5 = (double)a2[2];
  3969.   v6 = LOBYTE(v5);
  3970.   do
  3971.   {
  3972.     v7 = (double)*(unsigned __int8 *)(3 * *(unsigned __int8 *)(v2 + a1 + 4610) + a1 + 3);
  3973.     v8 = *(unsigned __int8 *)(3 * *(unsigned __int8 *)(v2 + a1 + 4610) + a1 + 4);
  3974.     v3 = (double)*a2;
  3975.     v4 = (double)a2[1];
  3976.     if ( v10 )
  3977.       v6 = v2;
  3978.     ++v2;
  3979.   }
  3980.   while ( v2 < 256 );
  3981.   return v6;
  3982. }
  3983.  
  3984. //----- (10007240) --------------------------------------------------------
  3985. int __cdecl sub_10007240(int a1, int a2)
  3986. {
  3987.   int v2; // ebp@2
  3988.   unsigned int v3; // edi@2
  3989.   int v4; // eax@3
  3990.   int result; // eax@3
  3991.  
  3992.   if ( !(*(_BYTE *)a1 & 2) )
  3993.     return sub_100072A0(a1 + 42, a2, *(_DWORD *)(a1 + 38));
  3994.   v2 = a1 + 42;
  3995.   v3 = 0;
  3996.   if ( *(_DWORD *)(a1 + 38) )
  3997.   {
  3998.     do
  3999.     {
  4000.       sub_100072A0(v2 + 32, a2, *(_DWORD *)(v2 + 24));
  4001.       v4 = *(_DWORD *)(v2 + 24);
  4002.       v3 += v4;
  4003.       result = 3 * v4 + 32;
  4004.       v2 += result;
  4005.     }
  4006.     while ( *(_DWORD *)(a1 + 38) > v3 );
  4007.   }
  4008.   return result;
  4009. }
  4010.  
  4011. //----- (100072A0) --------------------------------------------------------
  4012. int __cdecl sub_100072A0(int a1, int a2, int a3)
  4013. {
  4014.   int v3; // edx@1
  4015.   int v4; // ecx@1
  4016.   int result; // eax@2
  4017.  
  4018.   v3 = a1 + 2;
  4019.   v4 = a3;
  4020.   if ( a3 > 0 )
  4021.   {
  4022.     result = a2;
  4023.     do
  4024.     {
  4025.       v3 += 3;
  4026.       --v4;
  4027.       *(_BYTE *)(v3 - 3) = *(_BYTE *)(*(unsigned __int8 *)(v3 - 3) + a2);
  4028.     }
  4029.     while ( v4 );
  4030.   }
  4031.   return result;
  4032. }
  4033.  
  4034. //----- (100072D0) --------------------------------------------------------
  4035. float *__cdecl sub_100072D0(float *a1, float *a2)
  4036. {
  4037.   long double v2; // st7@1
  4038.   long double v3; // st6@1
  4039.   long double v4; // st5@1
  4040.   long double v5; // st4@1
  4041.   long double v6; // st3@1
  4042.   float v7; // ST00_4@1
  4043.   long double v8; // st2@1
  4044.   float v9; // ST08_4@1
  4045.   float v10; // ST04_4@1
  4046.   int v11; // eax@1
  4047.   float *result; // eax@1
  4048.  
  4049.   v2 = cos(*a1);
  4050.   v3 = sin(*a1);
  4051.   v4 = cos(a1[1]);
  4052.   v5 = sin(a1[1]);
  4053.   v6 = cos(a1[2]);
  4054.   v7 = sin(a1[2]);
  4055.   *a2 = v4 * v2;
  4056.   v8 = v7 * v5;
  4057.   v9 = v8;
  4058.   a2[1] = v8 * v2 - v6 * v3;
  4059.   v10 = v6 * v5;
  4060.   v11 = (int)(a2 + 4);
  4061.   *(float *)(v11 - 8) = v7 * v3 + v10 * v2;
  4062.   *(float *)(v11 - 4) = v4 * v3;
  4063.   a2[4] = v6 * v2 + v9 * v3;
  4064.   result = a2 + 7;
  4065.   *(result - 2) = v3 * v10 - v7 * v2;
  4066.   *(result - 1) = -v5;
  4067.   *result = v7 * v4;
  4068.   result[1] = v6 * v4;
  4069.   return result;
  4070. }
  4071.  
  4072. //----- (100074D0) --------------------------------------------------------
  4073. int __cdecl sub_100074D0(int a1, int a2, int a3)
  4074. {
  4075.   int v3; // edi@2
  4076.   double v4; // st7@3
  4077.   int v5; // ecx@3
  4078.   __int16 v6; // bx@3
  4079.   int v7; // eax@4
  4080.   float v8; // ST14_4@5
  4081.   int result; // eax@5
  4082.   __int16 v10; // [esp+10h] [ebp-8h]@2
  4083.   __int16 v11; // [esp+12h] [ebp-6h]@1
  4084.  
  4085.   v11 = 0;
  4086.   do
  4087.   {
  4088.     v10 = 0;
  4089.     v3 = 3 * v11;
  4090.     do
  4091.     {
  4092.       v4 = 0.0;
  4093.       v5 = v10;
  4094.       v6 = 0;
  4095.       do
  4096.       {
  4097.         v7 = v6++;
  4098.         v4 = v4 + *(float *)(a2 + 4 * (v10 + 3 * v7)) * *(float *)(a1 + 4 * (v3 + v7));
  4099.       }
  4100.       while ( v6 < 3 );
  4101.       v8 = v4;
  4102.       ++v10;
  4103.       result = a3;
  4104.       *(float *)(a3 + 4 * (v3 + v5)) = v8;
  4105.     }
  4106.     while ( v10 < 3 );
  4107.     ++v11;
  4108.   }
  4109.   while ( v11 < 3 );
  4110.   return result;
  4111. }
  4112.  
  4113. //----- (10007560) --------------------------------------------------------
  4114. float *__cdecl sub_10007560(float *a1, float *a2, float *a3)
  4115. {
  4116.   float *v3; // ecx@1
  4117.   float *result; // eax@1
  4118.  
  4119.   v3 = a2;
  4120.   result = a1;
  4121.   *a3 = a1[1] * a2[1] + a1[2] * a2[2] + *a2 * *a1;
  4122.   a3[1] = result[4] * v3[1] + result[5] * v3[2] + result[3] * *v3;
  4123.   a3[2] = result[8] * v3[2] + result[6] * *v3 + a1[7] * a2[1];
  4124.   return result;
  4125. }
  4126.  
  4127. //----- (100075C0) --------------------------------------------------------
  4128. float *__cdecl sub_100075C0(float *a1, float *a2, float *a3)
  4129. {
  4130.   float *result; // eax@1
  4131.  
  4132.   result = a1;
  4133.   *a3 = *a1 + *a2;
  4134.   a3[1] = a2[1] + a1[1];
  4135.   a3[2] = a2[2] + a1[2];
  4136.   return result;
  4137. }
  4138.  
  4139. //----- (100075F0) --------------------------------------------------------
  4140. float *__cdecl sub_100075F0(float *a1, float *a2, float *a3)
  4141. {
  4142.   float *result; // eax@1
  4143.  
  4144.   result = a1;
  4145.   *a3 = *a1 - *a2;
  4146.   a3[1] = a1[1] - a2[1];
  4147.   a3[2] = a1[2] - a2[2];
  4148.   return result;
  4149. }
  4150.  
  4151. //----- (10007620) --------------------------------------------------------
  4152. int __cdecl sub_10007620(int a1, float a2, int a3)
  4153. {
  4154.   int result; // eax@1
  4155.  
  4156.   result = a1;
  4157.   *(float *)a3 = *(float *)a1 * a2;
  4158.   *(float *)(a3 + 4) = *(float *)(a1 + 4) * a2;
  4159.   *(float *)(a3 + 8) = *(float *)(a1 + 8) * a2;
  4160.   return result;
  4161. }
  4162.  
  4163. //----- (10007670) --------------------------------------------------------
  4164. void __cdecl sub_10007670(float *a1, float *a2)
  4165. {
  4166.   float *v2; // eax@1
  4167.   float *v3; // ecx@1
  4168.   double v4; // st7@1
  4169.   double v5; // st6@1
  4170.   float *v6; // ST00_4@3
  4171.   double v7; // st6@4
  4172.   float *v8; // ST00_4@6
  4173.  
  4174.   v2 = a1;
  4175.   v3 = a2;
  4176.   v4 = sqrt(*a1 * *a1 + a1[1] * a1[1] + a1[2] * a1[2]);
  4177.   v5 = *a1;
  4178.   if ( dword_10036C7C )
  4179.   {
  4180.     unknown_libname_6(a2, a1);
  4181.     v2 = v6;
  4182.   }
  4183.   else
  4184.   {
  4185.     v5 = v5 / v4;
  4186.   }
  4187.   *v3 = v5;
  4188.   v7 = v2[1];
  4189.   if ( dword_10036C7C )
  4190.   {
  4191.     unknown_libname_6(v3, v2);
  4192.     v2 = v8;
  4193.   }
  4194.   else
  4195.   {
  4196.     v7 = v7 / v4;
  4197.   }
  4198.   v3[1] = v7;
  4199.   if ( dword_10036C7C )
  4200.     unknown_libname_13(*((_DWORD *)v2 + 2));
  4201.   else
  4202.     v4 = v2[2] / v4;
  4203.   v3[2] = v4;
  4204. }
  4205. // 100107F7: using guessed type int __thiscall unknown_libname_6(_DWORD, _DWORD);
  4206. // 10010DBC: using guessed type double __stdcall unknown_libname_13(_DWORD);
  4207. // 10036C7C: using guessed type int dword_10036C7C;
  4208.  
  4209. //----- (10007700) --------------------------------------------------------
  4210. float *__cdecl sub_10007700(float *a1, float *a2, float *a3)
  4211. {
  4212.   float *result; // eax@1
  4213.  
  4214.   result = a1;
  4215.   *a3 = a1[1] * a2[2] - a1[2] * a2[1];
  4216.   a3[1] = result[2] * *a2 - a2[2] * *result;
  4217.   a3[2] = a2[1] * *a1 - a1[1] * *a2;
  4218.   return result;
  4219. }
  4220.  
  4221. //----- (10007970) --------------------------------------------------------
  4222. bool __cdecl sub_10007970(int a1, float a2, int a3)
  4223. {
  4224.   unsigned __int16 v3; // si@1
  4225.   unsigned __int16 v4; // ax@1
  4226.   bool result; // al@3
  4227.   double v6; // st7@10
  4228.   int v7; // et1@10
  4229.   float v9; // ST0C_4@14
  4230.   unsigned __int8 v10; // c0@10
  4231.   unsigned __int8 v11; // c3@10
  4232.   float v12; // [esp+8h] [ebp-8h]@10
  4233.  
  4234.   v3 = *(_WORD *)(a3 + 66);
  4235.   v4 = *(_WORD *)(a3 + 64);
  4236.   if ( v4 >= v3 )
  4237.   {
  4238.     if ( (double)v4 < *(float *)(a1 + 8) )
  4239.       return 1;
  4240.     if ( (double)v3 > *(float *)(a1 + 8) )
  4241.       return 1;
  4242.   }
  4243.   else
  4244.   {
  4245.     if ( (double)v4 > *(float *)(a1 + 8) )
  4246.       return 1;
  4247.     if ( (double)v3 < *(float *)(a1 + 8) )
  4248.       return 1;
  4249.   }
  4250.   v6 = a2 * 128.0;
  4251.   v12 = v6;
  4252.   v7 = *(_DWORD *)a1;
  4253.   if ( !(v10 | v11) )
  4254.     return 1;
  4255.   if ( (double)*(signed __int16 *)(a3 + 76) + v12 < *(float *)a1 )
  4256.     return 1;
  4257.   v9 = -v6;
  4258.   if ( *(float *)(a1 + 4) >= (double)v9 )
  4259.     result = (double)*(signed __int16 *)(a3 + 78) + v12 < *(float *)(a1 + 4);
  4260.   else
  4261.     result = 1;
  4262.   return result;
  4263. }
  4264.  
  4265. //----- (10007A80) --------------------------------------------------------
  4266. int __cdecl sub_10007A80(int a1, int a2, int a3, int a4, int *a5)
  4267. {
  4268.   int *v5; // esi@1
  4269.   int v6; // ebp@1
  4270.   unsigned int v7; // edi@1
  4271.   int v8; // edi@2
  4272.   int v9; // ecx@2
  4273.   int v10; // ebx@2
  4274.   int result; // eax@2
  4275.   int v12; // edx@3
  4276.   int v13; // ebx@3
  4277.   unsigned __int16 v14; // bx@3
  4278.   int v15; // edx@3
  4279.   unsigned int v16; // ecx@3
  4280.   int v17; // ecx@4
  4281.   bool v18; // zf@4
  4282.   int v19; // ecx@4
  4283.   int v20; // [esp-14h] [ebp-1Ch]@1
  4284.  
  4285.   v5 = a5;
  4286.   v20 = a4;
  4287.   v6 = dword_1002A29C;
  4288.   v7 = __ROL4__(a3, 8);
  4289.   while ( 1 )
  4290.   {
  4291.     v8 = __ROR4__(v7, 8);
  4292.     v9 = *v5;
  4293.     v10 = *v5 & 0xF8;
  4294.     result = v20-- - 1;
  4295.     if ( !v20 )
  4296.       break;
  4297.     while ( 1 )
  4298.     {
  4299.       v12 = *(int *)((char *)dword_10039F10 + v10);
  4300.       v13 = *(int *)((char *)&dword_10039F14 + v10);
  4301.       dword_10039F00 += v12;
  4302.       v7 = __ROL4__(v13 + v8, 8);
  4303.       LOBYTE(v14) = HIBYTE(dword_10039F00);
  4304.       HIBYTE(v14) = BYTE1(dword_10039F00);
  4305.       LOBYTE(v12) = BYTE1(v9);
  4306.       BYTE1(v12) = v9;
  4307.       v5 = (int *)((char *)v5 + 3);
  4308.       v15 = v12 & 0x7FF;
  4309.       v16 = (v9 << 8) & 0xFF000000;
  4310.       if ( *(_DWORD *)(v6 + 4 * v14) << 16 <= v7 )
  4311.         break;
  4312.       v8 = __ROR4__(v7, 8);
  4313.       v17 = v8 | v16;
  4314.       LOBYTE(v17) = *(_BYTE *)(dword_1002A298 + v15);
  4315.       v18 = v20 == 1;
  4316.       v19 = __ROR4__(v17, 8);
  4317.       --v20;
  4318.       result = 248;
  4319.       if ( v18 )
  4320.         return result;
  4321.       *(_DWORD *)(v6 + 4 * v14) = v19;
  4322.       v9 = *v5;
  4323.       v10 = *v5 & 0xF8;
  4324.     }
  4325.   }
  4326.   return result;
  4327. }
  4328. // 1002A298: using guessed type int dword_1002A298;
  4329. // 10039F00: using guessed type int dword_10039F00;
  4330. // 10039F10: using guessed type int dword_10039F10[];
  4331. // 10039F14: using guessed type int dword_10039F14;
  4332.  
  4333. //----- (10007B39) --------------------------------------------------------
  4334. int __cdecl sub_10007B39(int a1, int a2, int a3, int a4, unsigned int *a5)
  4335. {
  4336.   int v5; // edi@1
  4337.   unsigned int *v6; // esi@1
  4338.   int v7; // ebp@1
  4339.   int v8; // ebx@2
  4340.   unsigned __int32 v9; // eax@2
  4341.   int v10; // edx@2
  4342.   int v11; // ecx@2
  4343.   unsigned __int16 v12; // ax@2
  4344.   int v13; // ecx@2
  4345.   int v14; // ebx@2
  4346.   bool v15; // cf@2
  4347.   bool v16; // zf@2
  4348.   int v17; // edx@2
  4349.   int v18; // ebx@6
  4350.   int result; // eax@6
  4351.   int v20; // [esp-14h] [ebp-1Ch]@1
  4352.  
  4353.   v5 = a3;
  4354.   v6 = a5;
  4355.   v20 = a4;
  4356.   v7 = dword_1002A29C;
  4357.   while ( 1 )
  4358.   {
  4359.     v8 = *v6 & 0xF8;
  4360.     v9 = _byteswap_ulong(*v6);
  4361.     v10 = *(int *)((char *)dword_10039F10 + v8);
  4362.     v5 += *(int *)((char *)&dword_10039F14 + v8);
  4363.     v11 = v5 | ((*v6 & 0xFF0000) << 8);
  4364.     dword_10039F00 += v10;
  4365.     LOBYTE(v11) = *(_BYTE *)(dword_1002A298 + ((v9 >> 16) & 0x7FF));
  4366.     HIBYTE(v12) = BYTE1(dword_10039F00);
  4367.     LOBYTE(v12) = HIBYTE(dword_10039F00);
  4368.     dword_10039F04 += v10;
  4369.     v13 = __ROR4__(v11, 8);
  4370.     dword_10039FE0 += v10;
  4371.     HIWORD(v14) = 0;
  4372.     v17 = *(_DWORD *)(v7 + 4 * v12);
  4373.     BYTE1(v14) = BYTE1(dword_10039F04);
  4374.     LOBYTE(v14) = HIBYTE(dword_10039F04);
  4375.     v15 = (unsigned __int16)v17 < (unsigned __int16)v13;
  4376.     v16 = (_WORD)v17 == (_WORD)v13;
  4377.     LOBYTE(v17) = HIBYTE(dword_10039FE0);
  4378.     if ( !v15 && !v16 )
  4379.       *(_DWORD *)(v7 + 4 * v12) = v13;
  4380.     BYTE1(v17) = BYTE1(dword_10039FE0);
  4381.     v17 = (unsigned __int16)v17;
  4382.     if ( (unsigned __int16)*(_DWORD *)(v7 + 4 * v14) > (unsigned __int16)v13 )
  4383.       *(_DWORD *)(v7 + 4 * v14) = v13;
  4384.     v18 = *(_DWORD *)(v7 + 4 * v17);
  4385.     result = v20 - 1;
  4386.     v20 = result;
  4387.     if ( !result )
  4388.       break;
  4389.     v6 = (unsigned int *)((char *)v6 + 3);
  4390.     if ( (unsigned __int16)v18 > (unsigned __int16)v13 )
  4391.       *(_DWORD *)(v7 + 4 * v17) = v13;
  4392.   }
  4393.   return result;
  4394. }
  4395. // 1002A298: using guessed type int dword_1002A298;
  4396. // 10039F00: using guessed type int dword_10039F00;
  4397. // 10039F04: using guessed type int dword_10039F04;
  4398. // 10039F10: using guessed type int dword_10039F10[];
  4399. // 10039F14: using guessed type int dword_10039F14;
  4400. // 10039FE0: using guessed type int dword_10039FE0;
  4401.  
  4402. //----- (10007C34) --------------------------------------------------------
  4403. _WORD *__cdecl sub_10007C34(unsigned int a1, __int16 a2, unsigned int a3, _WORD *a4, int a5)
  4404. {
  4405.   _WORD *result; // eax@1
  4406.   unsigned int v6; // ebx@1
  4407.   char v7; // t0@1
  4408.   unsigned int v8; // ebx@1
  4409.   unsigned int v9; // edx@1
  4410.   int *v10; // esi@1
  4411.   char *v11; // ebp@1
  4412.   int v12; // edi@1
  4413.   bool v13; // zf@2
  4414.   int v14; // ecx@4
  4415.   _DWORD *v15; // eax@4
  4416.  
  4417.   result = a4;
  4418.   v6 = a1;
  4419.   v7 = BYTE1(v6);
  4420.   BYTE1(v6) = a1;
  4421.   LOBYTE(v6) = v7;
  4422.   v8 = _byteswap_ulong(v6);
  4423.   LOWORD(v8) = a2;
  4424.   v9 = a3;
  4425.   v10 = (int *)(a5 - 1);
  4426.   v11 = (char *)a4 + 1;
  4427.   v12 = dword_1002A29C;
  4428. LABEL_2:
  4429.   v13 = --v11 == 0;
  4430.   while ( !v13 )
  4431.   {
  4432.     v14 = *v10;
  4433.     v15 = (int *)((char *)dword_10039F10 + (BYTE1(v14) & 0xF8));
  4434.     v8 += *v15;
  4435.     v9 += v15[1];
  4436.     LOBYTE(v15) = _byteswap_ulong(v8);
  4437.     BYTE1(v15) = BYTE1(v8);
  4438.     result = (_WORD *)(v12 + 4 * (unsigned __int16)v15);
  4439.     v10 = (int *)((char *)v10 + 3);
  4440.     if ( *result < (unsigned __int16)(v9 >> 8) )
  4441.       goto LABEL_2;
  4442.     v13 = --v11 == 0;
  4443.     *(_DWORD *)result = v9 >> 8;
  4444.   }
  4445.   return result;
  4446. }
  4447. // 10039F10: using guessed type int dword_10039F10[];
  4448.  
  4449. //----- (10007C9B) --------------------------------------------------------
  4450. int __usercall sub_10007C9B@<eax>(int result@<eax>, int a2, char a3, int a4, int a5)
  4451. {
  4452.   int v5; // edx@2
  4453.   int v6; // eax@3
  4454.   _DWORD *v7; // edi@3
  4455.   int v8; // ecx@3
  4456.  
  4457.   if ( a4 > 0 )
  4458.   {
  4459.     v5 = a5;
  4460.     if ( a5 > 0 )
  4461.     {
  4462.       v6 = a2;
  4463.       BYTE1(v6) = a3;
  4464.       v7 = (_DWORD *)(4 * v6 + dword_1002A29C);
  4465.       v8 = a4;
  4466.       result = 4 * (256 - a4);
  4467.       while ( 1 )
  4468.       {
  4469.         do
  4470.         {
  4471.           *v7 = 0xFFFF;
  4472.           ++v7;
  4473.           --v8;
  4474.         }
  4475.         while ( v8 );
  4476.         if ( !--v5 )
  4477.           break;
  4478.         v7 = (_DWORD *)((char *)v7 + result);
  4479.         v8 = a4;
  4480.       }
  4481.     }
  4482.   }
  4483.   return result;
  4484. }
  4485.  
  4486. //----- (10007CF1) --------------------------------------------------------
  4487. unsigned int sub_10007CF1()
  4488. {
  4489.   int v0; // ecx@1
  4490.   unsigned int result; // eax@1
  4491.   int v2; // edi@1
  4492.   int v3; // ecx@1
  4493.   int v4; // edx@1
  4494.   int v5; // esi@1
  4495.   int v6; // [esp+0h] [ebp-20h]@1
  4496.   int v7; // [esp+4h] [ebp-1Ch]@1
  4497.  
  4498.   v0 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  4499.   v7 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  4500.   result = 4 * (256 - v0);
  4501.   v2 = 4 * (256 - v0);
  4502.   v3 = v0 + 1;
  4503.   v6 = v3;
  4504.   v4 = dword_1002A2B0;
  4505.   v5 = (*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  4506.      + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  4507.      + dword_1002A29C
  4508.      - 4;
  4509. LABEL_2:
  4510.   for ( v5 += 4; ; v5 += v2 )
  4511.   {
  4512.     while ( --v3 )
  4513.     {
  4514.       result = *(_DWORD *)v5;
  4515.       if ( (unsigned __int16)*(_DWORD *)v5 == -1 )
  4516.         goto LABEL_2;
  4517.       result >>= 16;
  4518.       LOBYTE(result) = *(_BYTE *)(result + v4);
  4519.       *(_BYTE *)(v5 + 2) = result;
  4520.       v5 += 4;
  4521.     }
  4522.     if ( !--v7 )
  4523.       break;
  4524.     v3 = v6;
  4525.   }
  4526.   return result;
  4527. }
  4528. // 1002A298: using guessed type int dword_1002A298;
  4529. // 1002A2B0: using guessed type int dword_1002A2B0;
  4530.  
  4531. //----- (10007D89) --------------------------------------------------------
  4532. unsigned int sub_10007D89()
  4533. {
  4534.   int v0; // ecx@1
  4535.   unsigned int result; // eax@1
  4536.   int v2; // edi@1
  4537.   int v3; // ecx@1
  4538.   int v4; // edx@1
  4539.   int v5; // esi@1
  4540.   int v6; // [esp+0h] [ebp-20h]@1
  4541.   int v7; // [esp+4h] [ebp-1Ch]@1
  4542.  
  4543.   v0 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  4544.   v7 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  4545.   result = 4 * (256 - v0);
  4546.   v2 = 4 * (256 - v0);
  4547.   v3 = v0 + 1;
  4548.   v6 = v3;
  4549.   v4 = dword_1002A2B0;
  4550.   v5 = (*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  4551.      + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  4552.      + dword_1002A29C
  4553.      - 4;
  4554. LABEL_2:
  4555.   for ( v5 += 4; ; v5 += v2 )
  4556.   {
  4557.     while ( --v3 )
  4558.     {
  4559.       result = *(_DWORD *)v5;
  4560.       if ( (unsigned __int16)*(_DWORD *)v5 == -1 )
  4561.         goto LABEL_2;
  4562.       result >>= 16;
  4563.       LOWORD(result) = *(_WORD *)(v4 + 2 * result);
  4564.       *(_WORD *)(v5 + 2) = result;
  4565.       v5 += 4;
  4566.     }
  4567.     if ( !--v7 )
  4568.       break;
  4569.     v3 = v6;
  4570.   }
  4571.   return result;
  4572. }
  4573. // 1002A298: using guessed type int dword_1002A298;
  4574. // 1002A2B0: using guessed type int dword_1002A2B0;
  4575.  
  4576. //----- (10007E30) --------------------------------------------------------
  4577. int __cdecl sub_10007E30(int a1, float *a2, _WORD *a3)
  4578. {
  4579.   __int16 v3; // si@3
  4580.   __int16 v4; // bp@3
  4581.   signed __int64 v5; // rax@3
  4582.   __int16 v6; // cx@3
  4583.   __int16 v7; // di@3
  4584.   __int16 v8; // bx@3
  4585.   __int16 v9; // dx@10
  4586.   __int16 v10; // ax@11
  4587.   __int16 v11; // di@12
  4588.   int v12; // ST00_4@12
  4589.   __int16 v13; // ax@13
  4590.   __int16 v14; // bx@14
  4591.   __int16 v15; // ax@17
  4592.   __int16 v16; // ax@21
  4593.   int v17; // ecx@22
  4594.   int v18; // eax@23
  4595.   int v19; // eax@28
  4596.   int v20; // ST24_4@33
  4597.   _DWORD *v21; // esi@33
  4598.   int result; // eax@33
  4599.   int v23; // [esp+10h] [ebp-18h]@3
  4600.   int v24; // [esp+18h] [ebp-10h]@17
  4601.   __int16 v25; // [esp+1Ch] [ebp-Ch]@2
  4602.   __int16 v26; // [esp+20h] [ebp-8h]@3
  4603.   __int16 v27; // [esp+24h] [ebp-4h]@1
  4604.  
  4605.   v27 = *(_WORD *)(dword_1002A29C + 262152);
  4606.   if ( v27 && (v25 = *(_WORD *)(dword_1002A29C + 262154)) != 0 )
  4607.   {
  4608.     v3 = (signed __int64)*a2;
  4609.     v4 = v3 + *(_WORD *)(dword_1002A29C + 0x40000) - 128;
  4610.     v26 = *(_WORD *)(dword_1002A29C + 0x40000);
  4611.     v5 = (signed __int64)a2[1];
  4612.     v6 = *(_WORD *)(dword_1002A29C + 262146);
  4613.     v7 = v3 + *(_WORD *)(dword_1002A29C + 262148) - 128;
  4614.     v8 = v5 + *(_WORD *)(dword_1002A29C + 262150) - 128;
  4615.     HIWORD(v23) = v6 + v5 - 128;
  4616.     if ( a3[4] <= v4 || v7 < 0 || a3[5] <= SHIWORD(v23) || v8 < 0 )
  4617.     {
  4618.       sub_10007C9B(v26, v26, v6, v27, v25);
  4619.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  4620.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  4621.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  4622.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  4623.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  4624.       result = dword_1002A29C;
  4625.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  4626.       *(_WORD *)(a1 + 8) = 0x7FFF;
  4627.       *(_WORD *)(a1 + 10) = 0x7FFF;
  4628.       *(_WORD *)(a1 + 12) = -1;
  4629.       *(_WORD *)(a1 + 14) = -1;
  4630.       *(_WORD *)(a1 + 16) = 0;
  4631.       *(_WORD *)(a1 + 18) = 0;
  4632.     }
  4633.     else
  4634.     {
  4635.       if ( v4 < 0 )
  4636.       {
  4637.         sub_10007C9B(-v4, v26, v6, -v4, v25);
  4638.         *(_WORD *)(dword_1002A29C + 0x40000) -= v4;
  4639.         *(_WORD *)(dword_1002A29C + 262152) += v4;
  4640.         v4 = 0;
  4641.       }
  4642.       if ( SHIWORD(v23) < 0 )
  4643.       {
  4644.         sub_10007C9B(
  4645.           *(signed __int16 *)(dword_1002A29C + 262146),
  4646.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  4647.           *(_WORD *)(dword_1002A29C + 262146),
  4648.           *(signed __int16 *)(dword_1002A29C + 262152),
  4649.           -SHIWORD(v23));
  4650.         v9 = HIWORD(v23);
  4651.         *(_WORD *)(dword_1002A29C + 262146) -= HIWORD(v23);
  4652.         HIWORD(v23) = 0;
  4653.         *(_WORD *)(dword_1002A29C + 262154) += v9;
  4654.       }
  4655.       v10 = a3[4];
  4656.       if ( v10 <= v7 )
  4657.       {
  4658.         v11 = v7 - v10 + 1;
  4659.         v12 = *(signed __int16 *)(dword_1002A29C + 262148) - v11;
  4660.         sub_10007C9B(v12, v12, *(_WORD *)(dword_1002A29C + 262146), v11, *(signed __int16 *)(dword_1002A29C + 262154));
  4661.         *(_WORD *)(dword_1002A29C + 262148) -= v11;
  4662.         *(_WORD *)(dword_1002A29C + 262152) -= v11;
  4663.         v7 = a3[4] - 1;
  4664.       }
  4665.       v13 = a3[5];
  4666.       if ( v13 <= v8 )
  4667.       {
  4668.         v14 = v8 - v13 + 1;
  4669.         sub_10007C9B(
  4670.           dword_1002A29C,
  4671.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  4672.           *(unsigned __int16 *)(dword_1002A29C + 262150) - v14,
  4673.           *(signed __int16 *)(dword_1002A29C + 262152),
  4674.           v14);
  4675.         *(_WORD *)(dword_1002A29C + 262150) -= v14;
  4676.         *(_WORD *)(dword_1002A29C + 262154) -= v14;
  4677.         v8 = a3[5] - 1;
  4678.       }
  4679.       if ( v7 < 0 || v8 < 0 )
  4680.       {
  4681.         v15 = 0;
  4682.         LOWORD(v24) = 0;
  4683.       }
  4684.       else
  4685.       {
  4686.         LOWORD(v24) = v7 - v4 + 1;
  4687.         v15 = v8 - HIWORD(v23) + 1;
  4688.       }
  4689.       HIWORD(v24) = v15;
  4690.       if ( (_WORD)v24 && v15 )
  4691.       {
  4692.         v4 += *a3;
  4693.         v16 = a3[1];
  4694.         v7 += *a3;
  4695.         v8 += v16;
  4696.         HIWORD(v23) += v16;
  4697.       }
  4698.       dword_1002A2A0 = *(_DWORD *)(*(_DWORD *)(a1 + 4) + 4);
  4699.       dword_1002A2A4 = **(_DWORD **)(a1 + 4);
  4700.       dword_1002A2A8 = *(_DWORD *)(a1 + 32);
  4701.       dword_1002A2B0 = *(_DWORD *)(a1 + 36);
  4702.       v17 = *(_DWORD *)(a1 + 4);
  4703.       if ( *(_BYTE *)a1 & 1 )
  4704.       {
  4705.         v18 = *(unsigned __int8 *)(v17 + 12);
  4706.         if ( v18 == 1 )
  4707.         {
  4708.           sub_1000D1C0(v4, SHIWORD(v23));
  4709.         }
  4710.         else if ( v18 == 2 )
  4711.         {
  4712.           sub_1000CB30(v4, SHIWORD(v23));
  4713.         }
  4714.       }
  4715.       else
  4716.       {
  4717.         v19 = *(unsigned __int8 *)(v17 + 12);
  4718.         if ( v19 == 1 )
  4719.         {
  4720.           sub_1000C4F0(v4, SHIWORD(v23));
  4721.         }
  4722.         else if ( v19 == 2 )
  4723.         {
  4724.           sub_1000BE70(v4, SHIWORD(v23));
  4725.         }
  4726.       }
  4727.       LOWORD(v23) = v4;
  4728.       LOWORD(v20) = v7;
  4729.       v21 = (_DWORD *)(a1 + 8);
  4730.       HIWORD(v20) = v8;
  4731.       *v21 = v23;
  4732.       v21[1] = v20;
  4733.       v21[2] = v24;
  4734.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  4735.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  4736.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  4737.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  4738.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  4739.       result = dword_1002A29C;
  4740.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  4741.     }
  4742.   }
  4743.   else
  4744.   {
  4745.     *(_WORD *)(a1 + 8) = 0x7FFF;
  4746.     *(_WORD *)(a1 + 10) = 0x7FFF;
  4747.     *(_WORD *)(a1 + 12) = -1;
  4748.     *(_WORD *)(a1 + 14) = -1;
  4749.     result = 0;
  4750.     *(_WORD *)(a1 + 16) = 0;
  4751.     *(_WORD *)(a1 + 18) = 0;
  4752.   }
  4753.   return result;
  4754. }
  4755. // 1002A2A0: using guessed type int dword_1002A2A0;
  4756. // 1002A2A4: using guessed type int dword_1002A2A4;
  4757. // 1002A2A8: using guessed type int dword_1002A2A8;
  4758. // 1002A2B0: using guessed type int dword_1002A2B0;
  4759.  
  4760. //----- (100082A0) --------------------------------------------------------
  4761. int __cdecl sub_100082A0(int a1, int a2, int a3, float a4)
  4762. {
  4763.   int v4; // esi@3
  4764.   int v5; // ebx@3
  4765.   double v6; // st7@3
  4766.   double v7; // st6@3
  4767.   __int16 v8; // bp@3
  4768.   __int16 v9; // ST34_2@3
  4769.   __int16 v10; // di@3
  4770.   __int16 v11; // ST38_2@3
  4771.   double v12; // st7@8
  4772.   __int16 v13; // bp@11
  4773.   double v14; // st7@13
  4774.   __int16 v15; // si@16
  4775.   signed __int16 v16; // ax@17
  4776.   double v17; // st7@18
  4777.   __int16 v18; // si@21
  4778.   int v19; // ST04_4@21
  4779.   __int16 v20; // ax@22
  4780.   double v21; // st7@23
  4781.   __int16 v22; // si@26
  4782.   __int16 v23; // bx@29
  4783.   __int16 v24; // bp@29
  4784.   __int16 v25; // ax@33
  4785.   int v26; // ecx@34
  4786.   double v27; // st7@34
  4787.   int v28; // ecx@37
  4788.   int v29; // eax@38
  4789.   int v30; // eax@43
  4790.   int v31; // ST30_4@48
  4791.   _DWORD *v32; // esi@48
  4792.   int result; // eax@48
  4793.   float v34; // [esp+10h] [ebp-20h]@37
  4794.   int v35; // [esp+14h] [ebp-1Ch]@3
  4795.   int v36; // [esp+18h] [ebp-18h]@3
  4796.   float v37; // [esp+20h] [ebp-10h]@3
  4797.   float v38; // [esp+24h] [ebp-Ch]@3
  4798.   __int16 v39; // [esp+28h] [ebp-8h]@2
  4799.   __int16 v40; // [esp+2Ch] [ebp-4h]@1
  4800.  
  4801.   v40 = *(_WORD *)(dword_1002A29C + 262152);
  4802.   if ( v40 && (v39 = *(_WORD *)(dword_1002A29C + 262154)) != 0 )
  4803.   {
  4804.     v4 = *(signed __int16 *)(dword_1002A29C + 0x40000);
  4805.     v5 = *(signed __int16 *)(dword_1002A29C + 262146);
  4806.     v6 = (double)(128 - v4) * a4;
  4807.     v7 = (double)(128 - v5) * a4;
  4808.     v8 = (signed __int64)*(float *)a2;
  4809.     v9 = (signed __int64)v6;
  4810.     LOWORD(v35) = v8 - v9;
  4811.     v10 = (signed __int64)*(float *)(a2 + 4);
  4812.     v11 = (signed __int64)v7;
  4813.     HIWORD(v35) = v10 - v11;
  4814.     LOWORD(v36) = v8
  4815.                 + (unsigned __int64)(signed __int64)((double)(*(signed __int16 *)(dword_1002A29C + 262148) - 128) * a4);
  4816.     HIWORD(v36) = v10
  4817.                 + (unsigned __int64)(signed __int64)((double)(*(signed __int16 *)(dword_1002A29C + 262150) - 128) * a4);
  4818.     v37 = v6 - (double)v9;
  4819.     v38 = v7 - (double)v11;
  4820.     if ( *(_WORD *)(a3 + 8) <= (signed __int16)v35
  4821.       || (signed __int16)v36 < 0
  4822.       || *(_WORD *)(a3 + 10) <= SHIWORD(v35)
  4823.       || SHIWORD(v36) < 0 )
  4824.     {
  4825.       sub_10007C9B(v39, v4, v5, v40, v39);
  4826.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  4827.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  4828.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  4829.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  4830.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  4831.       result = dword_1002A29C;
  4832.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  4833.       *(_WORD *)(a1 + 8) = 0x7FFF;
  4834.       *(_WORD *)(a1 + 10) = 0x7FFF;
  4835.       *(_WORD *)(a1 + 12) = -1;
  4836.       *(_WORD *)(a1 + 14) = -1;
  4837.       *(_WORD *)(a1 + 16) = 0;
  4838.       *(_WORD *)(a1 + 18) = 0;
  4839.     }
  4840.     else
  4841.     {
  4842.       if ( (signed __int16)v35 < 0 )
  4843.       {
  4844.         v12 = (double)(signed __int16)v35;
  4845.         if ( dword_10036C7C )
  4846.           unknown_libname_9(LODWORD(a4));
  4847.         else
  4848.           v12 = v12 / a4;
  4849.         v13 = (signed __int64)v12;
  4850.         sub_10007C9B(-v13, v4, v5, -v13, v39);
  4851.         *(_WORD *)(dword_1002A29C + 0x40000) -= v13;
  4852.         LOWORD(v35) = 0;
  4853.         *(_WORD *)(dword_1002A29C + 262152) += v13;
  4854.       }
  4855.       if ( SHIWORD(v35) < 0 )
  4856.       {
  4857.         v14 = (double)SHIWORD(v35);
  4858.         if ( dword_10036C7C )
  4859.           unknown_libname_9(LODWORD(a4));
  4860.         else
  4861.           v14 = v14 / a4;
  4862.         v15 = (signed __int64)v14;
  4863.         sub_10007C9B(
  4864.           *(signed __int16 *)(dword_1002A29C + 262146),
  4865.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  4866.           *(_WORD *)(dword_1002A29C + 262146),
  4867.           *(signed __int16 *)(dword_1002A29C + 262152),
  4868.           -v15);
  4869.         *(_WORD *)(dword_1002A29C + 262146) -= v15;
  4870.         HIWORD(v35) = 0;
  4871.         *(_WORD *)(dword_1002A29C + 262154) += v15;
  4872.       }
  4873.       v16 = *(_WORD *)(a3 + 8);
  4874.       if ( (signed __int16)v36 >= v16 )
  4875.       {
  4876.         v17 = (double)((signed __int16)v36 - (signed int)v16 + 1);
  4877.         if ( dword_10036C7C )
  4878.           unknown_libname_9(LODWORD(a4));
  4879.         else
  4880.           v17 = v17 / a4;
  4881.         v18 = (signed __int64)v17;
  4882.         v19 = *(signed __int16 *)(dword_1002A29C + 262148) - v18;
  4883.         sub_10007C9B(v19, v19, *(_WORD *)(dword_1002A29C + 262146), v18, *(signed __int16 *)(dword_1002A29C + 262154));
  4884.         *(_WORD *)(dword_1002A29C + 262148) -= v18;
  4885.         *(_WORD *)(dword_1002A29C + 262152) -= v18;
  4886.         LOWORD(v36) = *(_WORD *)(a3 + 8) - 1;
  4887.       }
  4888.       v20 = *(_WORD *)(a3 + 10);
  4889.       if ( SHIWORD(v36) >= v20 )
  4890.       {
  4891.         v21 = (double)(SHIWORD(v36) - (signed int)v20 + 1);
  4892.         if ( dword_10036C7C )
  4893.           unknown_libname_9(LODWORD(a4));
  4894.         else
  4895.           v21 = v21 / a4;
  4896.         v22 = (signed __int64)v21;
  4897.         sub_10007C9B(
  4898.           dword_1002A29C,
  4899.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  4900.           *(unsigned __int16 *)(dword_1002A29C + 262150) - v22,
  4901.           *(signed __int16 *)(dword_1002A29C + 262152),
  4902.           v22);
  4903.         *(_WORD *)(dword_1002A29C + 262150) -= v22;
  4904.         *(_WORD *)(dword_1002A29C + 262154) -= v22;
  4905.         HIWORD(v36) = *(_WORD *)(a3 + 10) - 1;
  4906.       }
  4907.       dword_1002A2B0 = *(_DWORD *)(a1 + 36);
  4908.       if ( (signed __int16)v36 < 0 || SHIWORD(v36) < 0 )
  4909.       {
  4910.         v24 = 0;
  4911.         v23 = 0;
  4912.       }
  4913.       else
  4914.       {
  4915.         v23 = v36 - v35 + 1;
  4916.         v24 = HIWORD(v36) - HIWORD(v35) + 1;
  4917.       }
  4918.       if ( v23 && v24 )
  4919.       {
  4920.         v25 = *(_WORD *)(a3 + 2);
  4921.         LOWORD(v35) = *(_WORD *)a3 + v35;
  4922.         HIWORD(v35) += v25;
  4923.         LOWORD(v36) = *(_WORD *)a3 + v36;
  4924.         HIWORD(v36) += v25;
  4925.       }
  4926.       v26 = *(_DWORD *)(*(_DWORD *)(a1 + 4) + 4);
  4927.       v27 = 256.0;
  4928.       if ( dword_10036C7C )
  4929.         unknown_libname_9(LODWORD(a4));
  4930.       else
  4931.         v27 = 256.0 / a4;
  4932.       dword_1002A2A0 = v26;
  4933.       dword_1002A2A4 = **(_DWORD **)(a1 + 4);
  4934.       dword_1002A2A8 = *(_DWORD *)(a1 + 32);
  4935.       v34 = v27;
  4936.       byte_1002A2BC = (signed __int64)(v27 * v37);
  4937.       byte_1002A2C0 = (signed __int64)(v38 * v34);
  4938.       v28 = *(_DWORD *)(a1 + 4);
  4939.       if ( *(_BYTE *)a1 & 1 )
  4940.       {
  4941.         v29 = *(unsigned __int8 *)(v28 + 12);
  4942.         if ( v29 == 1 )
  4943.         {
  4944.           sub_10007CF1();
  4945.           sub_1000D2A4((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  4946.         }
  4947.         else if ( v29 == 2 )
  4948.         {
  4949.           sub_10007D89();
  4950.           sub_1000CC1C((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  4951.         }
  4952.       }
  4953.       else
  4954.       {
  4955.         v30 = *(unsigned __int8 *)(v28 + 12);
  4956.         if ( v30 == 1 )
  4957.         {
  4958.           sub_10007CF1();
  4959.           sub_1000C5D0((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  4960.         }
  4961.         else if ( v30 == 2 )
  4962.         {
  4963.           sub_10007D89();
  4964.           sub_1000BF58((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  4965.         }
  4966.       }
  4967.       LOWORD(v31) = v23;
  4968.       HIWORD(v31) = v24;
  4969.       v32 = (_DWORD *)(a1 + 8);
  4970.       sub_10007C9B(
  4971.         dword_1002A29C,
  4972.         *(signed __int16 *)(dword_1002A29C + 0x40000),
  4973.         *(_WORD *)(dword_1002A29C + 262146),
  4974.         *(signed __int16 *)(dword_1002A29C + 262152),
  4975.         *(signed __int16 *)(dword_1002A29C + 262154));
  4976.       *v32 = v35;
  4977.       v32[1] = v36;
  4978.       v32[2] = v31;
  4979.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  4980.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  4981.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  4982.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  4983.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  4984.       result = dword_1002A29C;
  4985.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  4986.     }
  4987.   }
  4988.   else
  4989.   {
  4990.     *(_WORD *)(a1 + 8) = 0x7FFF;
  4991.     *(_WORD *)(a1 + 10) = 0x7FFF;
  4992.     *(_WORD *)(a1 + 12) = -1;
  4993.     *(_WORD *)(a1 + 14) = -1;
  4994.     result = 0;
  4995.     *(_WORD *)(a1 + 16) = 0;
  4996.     *(_WORD *)(a1 + 18) = 0;
  4997.   }
  4998.   return result;
  4999. }
  5000. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  5001. // 1002A2A0: using guessed type int dword_1002A2A0;
  5002. // 1002A2A4: using guessed type int dword_1002A2A4;
  5003. // 1002A2A8: using guessed type int dword_1002A2A8;
  5004. // 1002A2B0: using guessed type int dword_1002A2B0;
  5005. // 1002A2BC: using guessed type char byte_1002A2BC;
  5006. // 1002A2C0: using guessed type char byte_1002A2C0;
  5007. // 10036C7C: using guessed type int dword_10036C7C;
  5008.  
  5009. //----- (10008940) --------------------------------------------------------
  5010. int __usercall sub_10008940@<eax>(int a1@<ecx>, int a2@<esi>, int a3, float *a4, _WORD *a5)
  5011. {
  5012.   int v5; // edi@3
  5013.   signed __int64 v6; // rax@3
  5014.   int v7; // ebp@3
  5015.   signed __int64 v8; // rax@3
  5016.   int v9; // ecx@3
  5017.   int v10; // ebx@3
  5018.   int v11; // esi@3
  5019.   __int16 v12; // ST2C_2@10
  5020.   signed __int16 v13; // ax@11
  5021.   int v14; // ST00_4@12
  5022.   signed __int16 v15; // ax@13
  5023.   __int16 v16; // ax@17
  5024.   __int16 v17; // ax@21
  5025.   int v18; // ecx@22
  5026.   int v19; // ecx@22
  5027.   int v20; // eax@23
  5028.   int v21; // eax@28
  5029.   int v22; // ST24_4@33
  5030.   _DWORD *v23; // edi@33
  5031.   int result; // eax@33
  5032.   int v25; // [esp+10h] [ebp-1Ch]@3
  5033.   int v26; // [esp+18h] [ebp-14h]@17
  5034.   __int16 v27; // [esp+1Ch] [ebp-10h]@1
  5035.   __int16 v28; // [esp+20h] [ebp-Ch]@2
  5036.   __int16 v29; // [esp+24h] [ebp-8h]@3
  5037.   __int16 v30; // [esp+28h] [ebp-4h]@3
  5038.  
  5039.   v27 = *(_WORD *)(dword_1002A29C + 262152);
  5040.   if ( v27 && (v28 = *(_WORD *)(dword_1002A29C + 262154)) != 0 )
  5041.   {
  5042.     HIWORD(v5) = HIWORD(a4);
  5043.     v30 = *(_WORD *)(dword_1002A29C + 0x40000);
  5044.     v6 = (signed __int64)*a4;
  5045.     LOWORD(a2) = v6;
  5046.     LOWORD(v6) = *(_WORD *)(dword_1002A29C + 0x40000);
  5047.     v7 = a2 + 2 * v6 - 256;
  5048.     v29 = *(_WORD *)(dword_1002A29C + 262146);
  5049.     v8 = (signed __int64)a4[1];
  5050.     LOWORD(a1) = *(_WORD *)(dword_1002A29C + 262146);
  5051.     LOWORD(v5) = *(_WORD *)(dword_1002A29C + 262148);
  5052.     v9 = v8 + 2 * a1 - 256;
  5053.     HIWORD(v25) = v9;
  5054.     v10 = a2 + 2 * v5 - 256;
  5055.     LOWORD(v9) = *(_WORD *)(dword_1002A29C + 262150);
  5056.     v11 = v8 + 2 * v9 - 256;
  5057.     if ( a5[4] <= (signed __int16)v7 || (signed __int16)v10 < 0 || a5[5] <= SHIWORD(v25) || (signed __int16)v11 < 0 )
  5058.     {
  5059.       sub_10007C9B(v30, v30, v29, v27, v28);
  5060.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5061.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5062.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5063.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5064.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5065.       result = dword_1002A29C;
  5066.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5067.       *(_WORD *)(a3 + 8) = 0x7FFF;
  5068.       *(_WORD *)(a3 + 10) = 0x7FFF;
  5069.       *(_WORD *)(a3 + 12) = -1;
  5070.       *(_WORD *)(a3 + 14) = -1;
  5071.       *(_WORD *)(a3 + 16) = 0;
  5072.       *(_WORD *)(a3 + 18) = 0;
  5073.     }
  5074.     else
  5075.     {
  5076.       if ( (signed __int16)v7 < 0 )
  5077.       {
  5078.         v7 = -(signed __int16)v7 >> 1;
  5079.         sub_10007C9B(v30, v30, v29, (signed __int16)v7, v28);
  5080.         *(_WORD *)(dword_1002A29C + 0x40000) += v7;
  5081.         *(_WORD *)(dword_1002A29C + 262152) -= v7;
  5082.         LOWORD(v7) = 0;
  5083.       }
  5084.       if ( SHIWORD(v25) < 0 )
  5085.       {
  5086.         v12 = -SHIWORD(v25) >> 1;
  5087.         sub_10007C9B(
  5088.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5089.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5090.           *(_WORD *)(dword_1002A29C + 262146),
  5091.           *(signed __int16 *)(dword_1002A29C + 262152),
  5092.           v12);
  5093.         HIWORD(v25) = 0;
  5094.         *(_WORD *)(dword_1002A29C + 262146) += v12;
  5095.         *(_WORD *)(dword_1002A29C + 262154) -= v12;
  5096.       }
  5097.       v13 = a5[4];
  5098.       if ( v13 <= (signed __int16)v10 )
  5099.       {
  5100.         v10 = ((signed __int16)v10 - v13 + 1) >> 1;
  5101.         v14 = *(signed __int16 *)(dword_1002A29C + 262148) - (signed __int16)v10;
  5102.         sub_10007C9B(
  5103.           v14,
  5104.           v14,
  5105.           *(_WORD *)(dword_1002A29C + 262146),
  5106.           (signed __int16)v10,
  5107.           *(signed __int16 *)(dword_1002A29C + 262154));
  5108.         *(_WORD *)(dword_1002A29C + 262148) -= v10;
  5109.         *(_WORD *)(dword_1002A29C + 262152) -= v10;
  5110.         LOWORD(v10) = a5[4] - 1;
  5111.       }
  5112.       v15 = a5[5];
  5113.       if ( v15 <= (signed __int16)v11 )
  5114.       {
  5115.         v11 = ((signed __int16)v11 - v15 + 1) >> 1;
  5116.         sub_10007C9B(
  5117.           dword_1002A29C,
  5118.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5119.           *(unsigned __int16 *)(dword_1002A29C + 262150) - v11,
  5120.           *(signed __int16 *)(dword_1002A29C + 262152),
  5121.           (signed __int16)v11);
  5122.         *(_WORD *)(dword_1002A29C + 262150) -= v11;
  5123.         *(_WORD *)(dword_1002A29C + 262154) -= v11;
  5124.         LOWORD(v11) = a5[5] - 1;
  5125.       }
  5126.       if ( (signed __int16)v10 < 0 || (signed __int16)v11 < 0 )
  5127.       {
  5128.         v16 = 0;
  5129.         LOWORD(v26) = 0;
  5130.       }
  5131.       else
  5132.       {
  5133.         LOWORD(v26) = v10 - v7 + 1;
  5134.         v16 = v11 - HIWORD(v25) + 1;
  5135.       }
  5136.       HIWORD(v26) = v16;
  5137.       if ( (_WORD)v26 && v16 )
  5138.       {
  5139.         LOWORD(v7) = *a5 + v7;
  5140.         v17 = a5[1];
  5141.         LOWORD(v10) = *a5 + v10;
  5142.         LOWORD(v11) = v17 + v11;
  5143.         HIWORD(v25) += v17;
  5144.       }
  5145.       dword_1002A2A0 = *(_DWORD *)(*(_DWORD *)(a3 + 4) + 4);
  5146.       dword_1002A2A4 = **(_DWORD **)(a3 + 4);
  5147.       v18 = *(_DWORD *)(a3 + 32);
  5148.       dword_1002A2A8 = v18;
  5149.       dword_1002A2AC = 2 * v18;
  5150.       dword_1002A2B0 = *(_DWORD *)(a3 + 36);
  5151.       v19 = *(_DWORD *)(a3 + 4);
  5152.       if ( *(_BYTE *)a3 & 1 )
  5153.       {
  5154.         v20 = *(unsigned __int8 *)(v19 + 12);
  5155.         if ( v20 == 1 )
  5156.         {
  5157.           sub_1000D3B0((signed __int16)v7, SHIWORD(v25));
  5158.         }
  5159.         else if ( v20 == 2 )
  5160.         {
  5161.           sub_1000CD2D((signed __int16)v7, SHIWORD(v25));
  5162.         }
  5163.       }
  5164.       else
  5165.       {
  5166.         v21 = *(unsigned __int8 *)(v19 + 12);
  5167.         if ( v21 == 1 )
  5168.         {
  5169.           sub_1000C6D0((signed __int16)v7, SHIWORD(v25));
  5170.         }
  5171.         else if ( v21 == 2 )
  5172.         {
  5173.           sub_1000C05D((signed __int16)v7, SHIWORD(v25));
  5174.         }
  5175.       }
  5176.       LOWORD(v25) = v7;
  5177.       LOWORD(v22) = v10;
  5178.       v23 = (_DWORD *)(a3 + 8);
  5179.       HIWORD(v22) = v11;
  5180.       *v23 = v25;
  5181.       v23[1] = v22;
  5182.       v23[2] = v26;
  5183.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5184.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5185.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5186.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5187.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5188.       result = dword_1002A29C;
  5189.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5190.     }
  5191.   }
  5192.   else
  5193.   {
  5194.     *(_WORD *)(a3 + 8) = 0x7FFF;
  5195.     *(_WORD *)(a3 + 10) = 0x7FFF;
  5196.     *(_WORD *)(a3 + 12) = -1;
  5197.     *(_WORD *)(a3 + 14) = -1;
  5198.     result = 0;
  5199.     *(_WORD *)(a3 + 16) = 0;
  5200.     *(_WORD *)(a3 + 18) = 0;
  5201.   }
  5202.   return result;
  5203. }
  5204. // 1002A2A0: using guessed type int dword_1002A2A0;
  5205. // 1002A2A4: using guessed type int dword_1002A2A4;
  5206. // 1002A2A8: using guessed type int dword_1002A2A8;
  5207. // 1002A2AC: using guessed type int dword_1002A2AC;
  5208. // 1002A2B0: using guessed type int dword_1002A2B0;
  5209.  
  5210. //----- (10008DE0) --------------------------------------------------------
  5211. int __cdecl sub_10008DE0(int a1, float *a2, _WORD *a3)
  5212. {
  5213.   __int16 v3; // si@3
  5214.   __int16 v4; // bp@3
  5215.   signed __int64 v5; // rax@3
  5216.   __int16 v6; // cx@3
  5217.   __int16 v7; // di@3
  5218.   __int16 v8; // bx@3
  5219.   __int16 v9; // dx@10
  5220.   __int16 v10; // ax@11
  5221.   __int16 v11; // di@12
  5222.   int v12; // ST00_4@12
  5223.   __int16 v13; // ax@13
  5224.   __int16 v14; // bx@14
  5225.   __int16 v15; // ax@17
  5226.   __int16 v16; // ax@21
  5227.   int v17; // ecx@22
  5228.   int v18; // eax@23
  5229.   int v19; // eax@28
  5230.   int v20; // ST24_4@33
  5231.   _DWORD *v21; // esi@33
  5232.   int result; // eax@33
  5233.   int v23; // [esp+10h] [ebp-18h]@3
  5234.   int v24; // [esp+18h] [ebp-10h]@17
  5235.   __int16 v25; // [esp+1Ch] [ebp-Ch]@2
  5236.   __int16 v26; // [esp+20h] [ebp-8h]@3
  5237.   __int16 v27; // [esp+24h] [ebp-4h]@1
  5238.  
  5239.   v27 = *(_WORD *)(dword_1002A29C + 262152);
  5240.   if ( v27 && (v25 = *(_WORD *)(dword_1002A29C + 262154)) != 0 )
  5241.   {
  5242.     v3 = (signed __int64)*a2;
  5243.     v4 = v3 + *(_WORD *)(dword_1002A29C + 0x40000) - 128;
  5244.     v26 = *(_WORD *)(dword_1002A29C + 0x40000);
  5245.     v5 = (signed __int64)a2[1];
  5246.     v6 = *(_WORD *)(dword_1002A29C + 262146);
  5247.     v7 = v3 + *(_WORD *)(dword_1002A29C + 262148) - 128;
  5248.     v8 = v5 + *(_WORD *)(dword_1002A29C + 262150) - 128;
  5249.     HIWORD(v23) = v6 + v5 - 128;
  5250.     if ( a3[4] <= v4 || v7 < 0 || a3[5] <= SHIWORD(v23) || v8 < 0 )
  5251.     {
  5252.       sub_10007C9B(v26, v26, v6, v27, v25);
  5253.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5254.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5255.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5256.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5257.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5258.       result = dword_1002A29C;
  5259.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5260.       *(_WORD *)(a1 + 8) = 0x7FFF;
  5261.       *(_WORD *)(a1 + 10) = 0x7FFF;
  5262.       *(_WORD *)(a1 + 12) = -1;
  5263.       *(_WORD *)(a1 + 14) = -1;
  5264.       *(_WORD *)(a1 + 16) = 0;
  5265.       *(_WORD *)(a1 + 18) = 0;
  5266.     }
  5267.     else
  5268.     {
  5269.       if ( v4 < 0 )
  5270.       {
  5271.         sub_10007C9B(-v4, v26, v6, -v4, v25);
  5272.         *(_WORD *)(dword_1002A29C + 0x40000) -= v4;
  5273.         *(_WORD *)(dword_1002A29C + 262152) += v4;
  5274.         v4 = 0;
  5275.       }
  5276.       if ( SHIWORD(v23) < 0 )
  5277.       {
  5278.         sub_10007C9B(
  5279.           *(signed __int16 *)(dword_1002A29C + 262146),
  5280.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5281.           *(_WORD *)(dword_1002A29C + 262146),
  5282.           *(signed __int16 *)(dword_1002A29C + 262152),
  5283.           -SHIWORD(v23));
  5284.         v9 = HIWORD(v23);
  5285.         *(_WORD *)(dword_1002A29C + 262146) -= HIWORD(v23);
  5286.         HIWORD(v23) = 0;
  5287.         *(_WORD *)(dword_1002A29C + 262154) += v9;
  5288.       }
  5289.       v10 = a3[4];
  5290.       if ( v7 >= v10 )
  5291.       {
  5292.         v11 = v7 - v10 + 1;
  5293.         v12 = *(signed __int16 *)(dword_1002A29C + 262148) - v11;
  5294.         sub_10007C9B(v12, v12, *(_WORD *)(dword_1002A29C + 262146), v11, *(signed __int16 *)(dword_1002A29C + 262154));
  5295.         *(_WORD *)(dword_1002A29C + 262148) -= v11;
  5296.         *(_WORD *)(dword_1002A29C + 262152) -= v11;
  5297.         v7 = a3[4] - 1;
  5298.       }
  5299.       v13 = a3[5];
  5300.       if ( v8 >= v13 )
  5301.       {
  5302.         v14 = v8 - v13 + 1;
  5303.         sub_10007C9B(
  5304.           dword_1002A29C,
  5305.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5306.           *(unsigned __int16 *)(dword_1002A29C + 262150) - v14,
  5307.           *(signed __int16 *)(dword_1002A29C + 262152),
  5308.           v14);
  5309.         *(_WORD *)(dword_1002A29C + 262150) -= v14;
  5310.         *(_WORD *)(dword_1002A29C + 262154) -= v14;
  5311.         v8 = a3[5] - 1;
  5312.       }
  5313.       if ( v7 < 0 || v8 < 0 )
  5314.       {
  5315.         v15 = 0;
  5316.         LOWORD(v24) = 0;
  5317.       }
  5318.       else
  5319.       {
  5320.         LOWORD(v24) = v7 - v4 + 1;
  5321.         v15 = v8 - HIWORD(v23) + 1;
  5322.       }
  5323.       HIWORD(v24) = v15;
  5324.       if ( (_WORD)v24 && v15 )
  5325.       {
  5326.         v4 += *a3;
  5327.         v16 = a3[1];
  5328.         v7 += *a3;
  5329.         v8 += v16;
  5330.         HIWORD(v23) += v16;
  5331.       }
  5332.       dword_1002A2A0 = *(_DWORD *)(*(_DWORD *)(a1 + 4) + 4);
  5333.       dword_1002A2A4 = **(_DWORD **)(a1 + 4);
  5334.       dword_1002A2A8 = *(_DWORD *)(a1 + 32);
  5335.       dword_1002A2B0 = *(_DWORD *)(a1 + 36);
  5336.       dword_1002A2B4 = *(_DWORD *)(a1 + 40);
  5337.       v17 = *(_DWORD *)(a1 + 4);
  5338.       if ( *(_BYTE *)a1 & 1 )
  5339.       {
  5340.         v18 = *(unsigned __int8 *)(v17 + 12);
  5341.         if ( v18 == 1 )
  5342.         {
  5343.           sub_1000D4DD(v4, SHIWORD(v23));
  5344.         }
  5345.         else if ( v18 == 2 )
  5346.         {
  5347.           sub_1000CE65(v4, SHIWORD(v23));
  5348.         }
  5349.       }
  5350.       else
  5351.       {
  5352.         v19 = *(unsigned __int8 *)(v17 + 12);
  5353.         if ( v19 == 1 )
  5354.         {
  5355.           sub_1000C7F9(v4, SHIWORD(v23));
  5356.         }
  5357.         else if ( v19 == 2 )
  5358.         {
  5359.           sub_1000C18E(v4, SHIWORD(v23));
  5360.         }
  5361.       }
  5362.       LOWORD(v23) = v4;
  5363.       LOWORD(v20) = v7;
  5364.       v21 = (_DWORD *)(a1 + 8);
  5365.       HIWORD(v20) = v8;
  5366.       *v21 = v23;
  5367.       v21[1] = v20;
  5368.       v21[2] = v24;
  5369.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5370.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5371.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5372.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5373.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5374.       result = dword_1002A29C;
  5375.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5376.     }
  5377.   }
  5378.   else
  5379.   {
  5380.     *(_WORD *)(a1 + 8) = 0x7FFF;
  5381.     *(_WORD *)(a1 + 10) = 0x7FFF;
  5382.     *(_WORD *)(a1 + 12) = -1;
  5383.     *(_WORD *)(a1 + 14) = -1;
  5384.     result = 0;
  5385.     *(_WORD *)(a1 + 16) = 0;
  5386.     *(_WORD *)(a1 + 18) = 0;
  5387.   }
  5388.   return result;
  5389. }
  5390. // 1002A2A0: using guessed type int dword_1002A2A0;
  5391. // 1002A2A4: using guessed type int dword_1002A2A4;
  5392. // 1002A2A8: using guessed type int dword_1002A2A8;
  5393. // 1002A2B0: using guessed type int dword_1002A2B0;
  5394. // 1002A2B4: using guessed type int dword_1002A2B4;
  5395.  
  5396. //----- (10009250) --------------------------------------------------------
  5397. int __cdecl sub_10009250(int a1, int a2, int a3, float a4)
  5398. {
  5399.   int v4; // esi@3
  5400.   int v5; // ebx@3
  5401.   double v6; // st7@3
  5402.   double v7; // st6@3
  5403.   __int16 v8; // bp@3
  5404.   __int16 v9; // ST34_2@3
  5405.   __int16 v10; // di@3
  5406.   __int16 v11; // ST38_2@3
  5407.   double v12; // st7@8
  5408.   __int16 v13; // bp@11
  5409.   double v14; // st7@13
  5410.   __int16 v15; // si@16
  5411.   signed __int16 v16; // ax@17
  5412.   double v17; // st7@18
  5413.   __int16 v18; // si@21
  5414.   int v19; // ST04_4@21
  5415.   __int16 v20; // ax@22
  5416.   double v21; // st7@23
  5417.   __int16 v22; // si@26
  5418.   __int16 v23; // bp@29
  5419.   __int16 v24; // bx@29
  5420.   __int16 v25; // ax@33
  5421.   int *v26; // eax@34
  5422.   double v27; // st7@34
  5423.   int v28; // ecx@37
  5424.   int v29; // eax@38
  5425.   int v30; // eax@43
  5426.   int v31; // ST30_4@48
  5427.   _DWORD *v32; // esi@48
  5428.   int result; // eax@48
  5429.   float v34; // [esp+10h] [ebp-20h]@37
  5430.   int v35; // [esp+14h] [ebp-1Ch]@3
  5431.   int v36; // [esp+18h] [ebp-18h]@3
  5432.   float v37; // [esp+20h] [ebp-10h]@3
  5433.   float v38; // [esp+24h] [ebp-Ch]@3
  5434.   __int16 v39; // [esp+28h] [ebp-8h]@2
  5435.   __int16 v40; // [esp+2Ch] [ebp-4h]@1
  5436.  
  5437.   v40 = *(_WORD *)(dword_1002A29C + 262152);
  5438.   if ( v40 && (v39 = *(_WORD *)(dword_1002A29C + 262154)) != 0 )
  5439.   {
  5440.     v4 = *(signed __int16 *)(dword_1002A29C + 0x40000);
  5441.     v5 = *(signed __int16 *)(dword_1002A29C + 262146);
  5442.     v6 = (double)(128 - v4) * a4;
  5443.     v7 = (double)(128 - v5) * a4;
  5444.     v8 = (signed __int64)*(float *)a2;
  5445.     v9 = (signed __int64)v6;
  5446.     LOWORD(v35) = v8 - v9;
  5447.     v10 = (signed __int64)*(float *)(a2 + 4);
  5448.     v11 = (signed __int64)v7;
  5449.     HIWORD(v35) = v10 - v11;
  5450.     LOWORD(v36) = v8
  5451.                 + (unsigned __int64)(signed __int64)((double)(*(signed __int16 *)(dword_1002A29C + 262148) - 128) * a4);
  5452.     HIWORD(v36) = v10
  5453.                 + (unsigned __int64)(signed __int64)((double)(*(signed __int16 *)(dword_1002A29C + 262150) - 128) * a4);
  5454.     v37 = v6 - (double)v9;
  5455.     v38 = v7 - (double)v11;
  5456.     if ( *(_WORD *)(a3 + 8) <= (signed __int16)v35
  5457.       || (signed __int16)v36 < 0
  5458.       || *(_WORD *)(a3 + 10) <= SHIWORD(v35)
  5459.       || SHIWORD(v36) < 0 )
  5460.     {
  5461.       sub_10007C9B(v39, v4, v5, v40, v39);
  5462.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5463.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5464.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5465.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5466.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5467.       result = dword_1002A29C;
  5468.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5469.       *(_WORD *)(a1 + 8) = 0x7FFF;
  5470.       *(_WORD *)(a1 + 10) = 0x7FFF;
  5471.       *(_WORD *)(a1 + 12) = -1;
  5472.       *(_WORD *)(a1 + 14) = -1;
  5473.       *(_WORD *)(a1 + 16) = 0;
  5474.       *(_WORD *)(a1 + 18) = 0;
  5475.     }
  5476.     else
  5477.     {
  5478.       if ( (signed __int16)v35 < 0 )
  5479.       {
  5480.         v12 = (double)(signed __int16)v35;
  5481.         if ( dword_10036C7C )
  5482.           unknown_libname_9(LODWORD(a4));
  5483.         else
  5484.           v12 = v12 / a4;
  5485.         v13 = (signed __int64)v12;
  5486.         sub_10007C9B(-v13, v4, v5, -v13, v39);
  5487.         *(_WORD *)(dword_1002A29C + 0x40000) -= v13;
  5488.         LOWORD(v35) = 0;
  5489.         *(_WORD *)(dword_1002A29C + 262152) += v13;
  5490.       }
  5491.       if ( SHIWORD(v35) < 0 )
  5492.       {
  5493.         v14 = (double)SHIWORD(v35);
  5494.         if ( dword_10036C7C )
  5495.           unknown_libname_9(LODWORD(a4));
  5496.         else
  5497.           v14 = v14 / a4;
  5498.         v15 = (signed __int64)v14;
  5499.         sub_10007C9B(
  5500.           *(signed __int16 *)(dword_1002A29C + 262146),
  5501.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5502.           *(_WORD *)(dword_1002A29C + 262146),
  5503.           *(signed __int16 *)(dword_1002A29C + 262152),
  5504.           -v15);
  5505.         *(_WORD *)(dword_1002A29C + 262146) -= v15;
  5506.         HIWORD(v35) = 0;
  5507.         *(_WORD *)(dword_1002A29C + 262154) += v15;
  5508.       }
  5509.       v16 = *(_WORD *)(a3 + 8);
  5510.       if ( (signed __int16)v36 >= v16 )
  5511.       {
  5512.         v17 = (double)((signed __int16)v36 - (signed int)v16 + 1);
  5513.         if ( dword_10036C7C )
  5514.           unknown_libname_9(LODWORD(a4));
  5515.         else
  5516.           v17 = v17 / a4;
  5517.         v18 = (signed __int64)v17;
  5518.         v19 = *(signed __int16 *)(dword_1002A29C + 262148) - v18;
  5519.         sub_10007C9B(v19, v19, *(_WORD *)(dword_1002A29C + 262146), v18, *(signed __int16 *)(dword_1002A29C + 262154));
  5520.         *(_WORD *)(dword_1002A29C + 262148) -= v18;
  5521.         *(_WORD *)(dword_1002A29C + 262152) -= v18;
  5522.         LOWORD(v36) = *(_WORD *)(a3 + 8) - 1;
  5523.       }
  5524.       v20 = *(_WORD *)(a3 + 10);
  5525.       if ( SHIWORD(v36) >= v20 )
  5526.       {
  5527.         v21 = (double)(SHIWORD(v36) - (signed int)v20 + 1);
  5528.         if ( dword_10036C7C )
  5529.           unknown_libname_9(LODWORD(a4));
  5530.         else
  5531.           v21 = v21 / a4;
  5532.         v22 = (signed __int64)v21;
  5533.         sub_10007C9B(
  5534.           dword_1002A29C,
  5535.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5536.           *(unsigned __int16 *)(dword_1002A29C + 262150) - v22,
  5537.           *(signed __int16 *)(dword_1002A29C + 262152),
  5538.           v22);
  5539.         *(_WORD *)(dword_1002A29C + 262150) -= v22;
  5540.         *(_WORD *)(dword_1002A29C + 262154) -= v22;
  5541.         HIWORD(v36) = *(_WORD *)(a3 + 10) - 1;
  5542.       }
  5543.       dword_1002A2B0 = *(_DWORD *)(a1 + 36);
  5544.       if ( (signed __int16)v36 < 0 || SHIWORD(v36) < 0 )
  5545.       {
  5546.         v24 = 0;
  5547.         v23 = 0;
  5548.       }
  5549.       else
  5550.       {
  5551.         v23 = v36 - v35 + 1;
  5552.         v24 = HIWORD(v36) - HIWORD(v35) + 1;
  5553.       }
  5554.       if ( v23 && v24 )
  5555.       {
  5556.         v25 = *(_WORD *)(a3 + 2);
  5557.         LOWORD(v35) = *(_WORD *)a3 + v35;
  5558.         HIWORD(v35) += v25;
  5559.         LOWORD(v36) = *(_WORD *)a3 + v36;
  5560.         HIWORD(v36) += v25;
  5561.       }
  5562.       dword_1002A2A0 = *(_DWORD *)(*(_DWORD *)(a1 + 4) + 4);
  5563.       v26 = *(int **)(a1 + 4);
  5564.       v27 = 256.0;
  5565.       if ( dword_10036C7C )
  5566.         unknown_libname_9(LODWORD(a4));
  5567.       else
  5568.         v27 = 256.0 / a4;
  5569.       dword_1002A2A4 = *v26;
  5570.       dword_1002A2A8 = *(_DWORD *)(a1 + 32);
  5571.       dword_1002A2B4 = *(_DWORD *)(a1 + 40);
  5572.       v34 = v27;
  5573.       byte_1002A2BC = (signed __int64)(v27 * v37);
  5574.       byte_1002A2C0 = (signed __int64)(v34 * v38);
  5575.       v28 = *(_DWORD *)(a1 + 4);
  5576.       if ( *(_BYTE *)a1 & 1 )
  5577.       {
  5578.         v29 = *(unsigned __int8 *)(v28 + 12);
  5579.         if ( v29 == 1 )
  5580.         {
  5581.           sub_1000D5C3((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  5582.         }
  5583.         else if ( v29 == 2 )
  5584.         {
  5585.           sub_1000CF54((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  5586.         }
  5587.       }
  5588.       else
  5589.       {
  5590.         v30 = *(unsigned __int8 *)(v28 + 12);
  5591.         if ( v30 == 1 )
  5592.         {
  5593.           sub_1000C8DF((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  5594.         }
  5595.         else if ( v30 == 2 )
  5596.         {
  5597.           sub_1000C27D((signed __int16)v35, SHIWORD(v35), v23, v24, (signed __int64)v34);
  5598.         }
  5599.       }
  5600.       LOWORD(v31) = v23;
  5601.       HIWORD(v31) = v24;
  5602.       v32 = (_DWORD *)(a1 + 8);
  5603.       sub_10007C9B(
  5604.         dword_1002A29C,
  5605.         *(signed __int16 *)(dword_1002A29C + 0x40000),
  5606.         *(_WORD *)(dword_1002A29C + 262146),
  5607.         *(signed __int16 *)(dword_1002A29C + 262152),
  5608.         *(signed __int16 *)(dword_1002A29C + 262154));
  5609.       *v32 = v35;
  5610.       v32[1] = v36;
  5611.       v32[2] = v31;
  5612.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5613.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5614.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5615.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5616.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5617.       result = dword_1002A29C;
  5618.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5619.     }
  5620.   }
  5621.   else
  5622.   {
  5623.     *(_WORD *)(a1 + 8) = 0x7FFF;
  5624.     *(_WORD *)(a1 + 10) = 0x7FFF;
  5625.     *(_WORD *)(a1 + 12) = -1;
  5626.     *(_WORD *)(a1 + 14) = -1;
  5627.     result = 0;
  5628.     *(_WORD *)(a1 + 16) = 0;
  5629.     *(_WORD *)(a1 + 18) = 0;
  5630.   }
  5631.   return result;
  5632. }
  5633. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  5634. // 1002A2A0: using guessed type int dword_1002A2A0;
  5635. // 1002A2A4: using guessed type int dword_1002A2A4;
  5636. // 1002A2A8: using guessed type int dword_1002A2A8;
  5637. // 1002A2B0: using guessed type int dword_1002A2B0;
  5638. // 1002A2B4: using guessed type int dword_1002A2B4;
  5639. // 1002A2BC: using guessed type char byte_1002A2BC;
  5640. // 1002A2C0: using guessed type char byte_1002A2C0;
  5641. // 10036C7C: using guessed type int dword_10036C7C;
  5642.  
  5643. //----- (100098E0) --------------------------------------------------------
  5644. int __usercall sub_100098E0@<eax>(int a1@<ecx>, int a2@<esi>, int a3, float *a4, _WORD *a5)
  5645. {
  5646.   signed __int64 v5; // rax@3
  5647.   int v6; // ebp@3
  5648.   int v7; // edi@3
  5649.   int v8; // esi@3
  5650.   __int16 v9; // ST2C_2@8
  5651.   signed __int16 v10; // ax@11
  5652.   int v11; // ST00_4@12
  5653.   signed __int16 v12; // ax@13
  5654.   __int16 v13; // ax@17
  5655.   __int16 v14; // ax@21
  5656.   int v15; // ecx@22
  5657.   int v16; // ecx@22
  5658.   int v17; // eax@23
  5659.   int v18; // eax@28
  5660.   int v19; // ST24_4@33
  5661.   _DWORD *v20; // ebx@33
  5662.   int result; // eax@33
  5663.   int v22; // [esp+10h] [ebp-1Ch]@3
  5664.   int v23; // [esp+18h] [ebp-14h]@17
  5665.   __int16 v24; // [esp+1Ch] [ebp-10h]@1
  5666.   __int16 v25; // [esp+20h] [ebp-Ch]@2
  5667.   __int16 v26; // [esp+24h] [ebp-8h]@3
  5668.   __int16 v27; // [esp+28h] [ebp-4h]@3
  5669.  
  5670.   v24 = *(_WORD *)(dword_1002A29C + 262152);
  5671.   if ( v24 && (v25 = *(_WORD *)(dword_1002A29C + 262154)) != 0 )
  5672.   {
  5673.     v27 = *(_WORD *)(dword_1002A29C + 0x40000);
  5674.     LOWORD(a2) = (signed __int64)*a4;
  5675.     LOWORD(v22) = a2 + 2 * v27 - 256;
  5676.     v26 = *(_WORD *)(dword_1002A29C + 262146);
  5677.     v5 = (signed __int64)a4[1];
  5678.     LOWORD(a1) = *(_WORD *)(dword_1002A29C + 262146);
  5679.     v6 = v5 + 2 * a1 - 256;
  5680.     LOWORD(a1) = *(_WORD *)(dword_1002A29C + 262148);
  5681.     v7 = a2 + 2 * a1 - 256;
  5682.     LOWORD(a1) = *(_WORD *)(dword_1002A29C + 262150);
  5683.     v8 = v5 + 2 * a1 - 256;
  5684.     if ( a5[4] <= (signed __int16)v22 || (signed __int16)v7 < 0 || a5[5] <= (signed __int16)v6 || (signed __int16)v8 < 0 )
  5685.     {
  5686.       sub_10007C9B(v27, v27, v26, v24, v25);
  5687.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5688.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5689.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5690.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5691.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5692.       result = dword_1002A29C;
  5693.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5694.       *(_WORD *)(a3 + 8) = 0x7FFF;
  5695.       *(_WORD *)(a3 + 10) = 0x7FFF;
  5696.       *(_WORD *)(a3 + 12) = -1;
  5697.       *(_WORD *)(a3 + 14) = -1;
  5698.       *(_WORD *)(a3 + 16) = 0;
  5699.       *(_WORD *)(a3 + 18) = 0;
  5700.     }
  5701.     else
  5702.     {
  5703.       if ( (signed __int16)v22 < 0 )
  5704.       {
  5705.         v9 = -(signed __int16)v22 >> 1;
  5706.         sub_10007C9B(v26, v27, v26, v9, v25);
  5707.         LOWORD(v22) = 0;
  5708.         *(_WORD *)(dword_1002A29C + 0x40000) += v9;
  5709.         *(_WORD *)(dword_1002A29C + 262152) -= v9;
  5710.       }
  5711.       if ( (signed __int16)v6 < 0 )
  5712.       {
  5713.         v6 = -(signed __int16)v6 >> 1;
  5714.         sub_10007C9B(
  5715.           *(signed __int16 *)(dword_1002A29C + 262146),
  5716.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5717.           *(_WORD *)(dword_1002A29C + 262146),
  5718.           *(signed __int16 *)(dword_1002A29C + 262152),
  5719.           (signed __int16)v6);
  5720.         *(_WORD *)(dword_1002A29C + 262146) += v6;
  5721.         *(_WORD *)(dword_1002A29C + 262154) -= v6;
  5722.         LOWORD(v6) = 0;
  5723.       }
  5724.       v10 = a5[4];
  5725.       if ( v10 <= (signed __int16)v7 )
  5726.       {
  5727.         v7 = ((signed __int16)v7 - v10 + 1) >> 1;
  5728.         v11 = *(signed __int16 *)(dword_1002A29C + 262148) - (signed __int16)v7;
  5729.         sub_10007C9B(
  5730.           v11,
  5731.           v11,
  5732.           *(_WORD *)(dword_1002A29C + 262146),
  5733.           (signed __int16)v7,
  5734.           *(signed __int16 *)(dword_1002A29C + 262154));
  5735.         *(_WORD *)(dword_1002A29C + 262148) -= v7;
  5736.         *(_WORD *)(dword_1002A29C + 262152) -= v7;
  5737.         LOWORD(v7) = a5[4] - 1;
  5738.       }
  5739.       v12 = a5[5];
  5740.       if ( v12 <= (signed __int16)v8 )
  5741.       {
  5742.         v8 = ((signed __int16)v8 - v12 + 1) >> 1;
  5743.         sub_10007C9B(
  5744.           dword_1002A29C,
  5745.           *(signed __int16 *)(dword_1002A29C + 0x40000),
  5746.           *(unsigned __int16 *)(dword_1002A29C + 262150) - v8,
  5747.           *(signed __int16 *)(dword_1002A29C + 262152),
  5748.           (signed __int16)v8);
  5749.         *(_WORD *)(dword_1002A29C + 262150) -= v8;
  5750.         *(_WORD *)(dword_1002A29C + 262154) -= v8;
  5751.         LOWORD(v8) = a5[5] - 1;
  5752.       }
  5753.       if ( (signed __int16)v7 < 0 || (signed __int16)v8 < 0 )
  5754.       {
  5755.         v13 = 0;
  5756.         LOWORD(v23) = 0;
  5757.       }
  5758.       else
  5759.       {
  5760.         LOWORD(v23) = v7 - v22 + 1;
  5761.         v13 = v8 - v6 + 1;
  5762.       }
  5763.       HIWORD(v23) = v13;
  5764.       if ( (_WORD)v23 && v13 )
  5765.       {
  5766.         v14 = a5[1];
  5767.         LOWORD(v6) = v14 + v6;
  5768.         LOWORD(v7) = *a5 + v7;
  5769.         LOWORD(v8) = v14 + v8;
  5770.         LOWORD(v22) = *a5 + v22;
  5771.       }
  5772.       dword_1002A2A0 = *(_DWORD *)(*(_DWORD *)(a3 + 4) + 4);
  5773.       dword_1002A2A4 = **(_DWORD **)(a3 + 4);
  5774.       v15 = *(_DWORD *)(a3 + 32);
  5775.       dword_1002A2A8 = v15;
  5776.       dword_1002A2AC = 2 * v15;
  5777.       dword_1002A2B4 = *(_DWORD *)(a3 + 40);
  5778.       v16 = *(_DWORD *)(a3 + 4);
  5779.       if ( *(_BYTE *)a3 & 1 )
  5780.       {
  5781.         v17 = *(unsigned __int8 *)(v16 + 12);
  5782.         if ( v17 == 1 )
  5783.         {
  5784.           sub_1000D6C9((signed __int16)v22, (signed __int16)v6);
  5785.         }
  5786.         else if ( v17 == 2 )
  5787.         {
  5788.           sub_1000D063((signed __int16)v22, (signed __int16)v6);
  5789.         }
  5790.       }
  5791.       else
  5792.       {
  5793.         v18 = *(unsigned __int8 *)(v16 + 12);
  5794.         if ( v18 == 1 )
  5795.         {
  5796.           sub_1000C9E5((signed __int16)v22, (signed __int16)v6);
  5797.         }
  5798.         else if ( v18 == 2 )
  5799.         {
  5800.           sub_1000C38C((signed __int16)v22, (signed __int16)v6);
  5801.         }
  5802.       }
  5803.       HIWORD(v22) = v6;
  5804.       LOWORD(v19) = v7;
  5805.       v20 = (_DWORD *)(a3 + 8);
  5806.       HIWORD(v19) = v8;
  5807.       *v20 = v22;
  5808.       v20[1] = v19;
  5809.       v20[2] = v23;
  5810.       *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  5811.       *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  5812.       *(_WORD *)(dword_1002A29C + 262148) = -1;
  5813.       *(_WORD *)(dword_1002A29C + 262150) = -1;
  5814.       *(_WORD *)(dword_1002A29C + 262152) = 0;
  5815.       result = dword_1002A29C;
  5816.       *(_WORD *)(dword_1002A29C + 262154) = 0;
  5817.     }
  5818.   }
  5819.   else
  5820.   {
  5821.     *(_WORD *)(a3 + 8) = 0x7FFF;
  5822.     *(_WORD *)(a3 + 10) = 0x7FFF;
  5823.     *(_WORD *)(a3 + 12) = -1;
  5824.     *(_WORD *)(a3 + 14) = -1;
  5825.     result = 0;
  5826.     *(_WORD *)(a3 + 16) = 0;
  5827.     *(_WORD *)(a3 + 18) = 0;
  5828.   }
  5829.   return result;
  5830. }
  5831. // 1002A2A0: using guessed type int dword_1002A2A0;
  5832. // 1002A2A4: using guessed type int dword_1002A2A4;
  5833. // 1002A2A8: using guessed type int dword_1002A2A8;
  5834. // 1002A2AC: using guessed type int dword_1002A2AC;
  5835. // 1002A2B4: using guessed type int dword_1002A2B4;
  5836.  
  5837. //----- (10009D80) --------------------------------------------------------
  5838. int __cdecl sub_10009D80(int a1, int a2, float a3, float a4, int a5, int a6)
  5839. {
  5840.   float v6; // eax@1
  5841.   double v7; // st7@2
  5842.   signed __int64 v8; // rax@9
  5843.   int v9; // edi@9
  5844.   signed __int64 v10; // rax@11
  5845.   int v11; // ebx@11
  5846.   int v12; // ebp@13
  5847.   float v14; // [esp+10h] [ebp-8h]@7
  5848.   float v15; // [esp+10h] [ebp-8h]@9
  5849.   float v16; // [esp+10h] [ebp-8h]@11
  5850.   float v17; // [esp+14h] [ebp-4h]@5
  5851.  
  5852.   v6 = 0.70709997;
  5853.   if ( SLODWORD(a3) <= 1060439169 )
  5854.   {
  5855.     v17 = 256.0;
  5856.   }
  5857.   else
  5858.   {
  5859.     v7 = 181.01759;
  5860.     if ( dword_10036C7C )
  5861.       unknown_libname_9(LODWORD(a3));
  5862.     else
  5863.       v7 = 181.01759 / a3;
  5864.     a3 = v6;
  5865.     v17 = v7;
  5866.   }
  5867.   sub_1000AA20(a1 + 32, a2, a3, a4, a6);
  5868.   sub_1000B800((signed __int16 *)(a1 + 26), (signed __int16 *)(a1 + 20));
  5869.   sub_1000B120();
  5870.   sub_1000B7A0();
  5871.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * v17 + flt_10039782;
  5872.   v14 = 0.5;
  5873.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * v17 + flt_10039786;
  5874.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  5875.   if ( LODWORD(flt_10039782) > 0x80000000 )
  5876.     v14 = -0.5;
  5877.   v8 = (signed __int64)(flt_10039782 + v14);
  5878.   v15 = 0.5;
  5879.   v9 = v8 + 0x8000;
  5880.   if ( LODWORD(flt_10039786) > 0x80000000 )
  5881.     v15 = -0.5;
  5882.   v10 = (signed __int64)(flt_10039786 + v15);
  5883.   v16 = 0.5;
  5884.   v11 = v10 + 0x8000;
  5885.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  5886.     v16 = -0.5;
  5887.   v12 = (signed __int64)(flt_1003978A + v16);
  5888.   dword_10039F00 = sub_1000BE60(v9, v11);
  5889.   return sub_10007A80(v9, v11, v12, *(_DWORD *)(a1 + 38), (int *)(a1 + 42));
  5890. }
  5891. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  5892. // 10036C7C: using guessed type int dword_10036C7C;
  5893. // 10039782: using guessed type float flt_10039782;
  5894. // 10039786: using guessed type float flt_10039786;
  5895. // 1003978A: using guessed type float flt_1003978A;
  5896. // 10039F00: using guessed type int dword_10039F00;
  5897.  
  5898. //----- (10009F20) --------------------------------------------------------
  5899. int __cdecl sub_10009F20(int a1, int a2, float a3, float a4, int a5, int a6)
  5900. {
  5901.   float v6; // eax@1
  5902.   double v7; // st7@2
  5903.   signed __int64 v8; // rax@9
  5904.   int v9; // edi@9
  5905.   signed __int64 v10; // rax@11
  5906.   int v11; // ebx@11
  5907.   int v12; // ebp@13
  5908.   int result; // eax@14
  5909.   int v14; // [esp-8h] [ebp-20h]@13
  5910.   int *v15; // [esp-4h] [ebp-1Ch]@13
  5911.   float v16; // [esp+10h] [ebp-8h]@7
  5912.   float v17; // [esp+10h] [ebp-8h]@9
  5913.   float v18; // [esp+10h] [ebp-8h]@11
  5914.   float v19; // [esp+14h] [ebp-4h]@5
  5915.  
  5916.   v6 = 1.0;
  5917.   if ( SLODWORD(a3) <= 1065353216 )
  5918.   {
  5919.     v19 = 256.0;
  5920.   }
  5921.   else
  5922.   {
  5923.     v7 = 256.0;
  5924.     if ( dword_10036C7C )
  5925.       unknown_libname_9(LODWORD(a3));
  5926.     else
  5927.       v7 = 256.0 / a3;
  5928.     a3 = v6;
  5929.     v19 = v7;
  5930.   }
  5931.   sub_1000AA20(a1 + 32, a2, a3, a4, a6);
  5932.   sub_1000B800((signed __int16 *)(a1 + 26), (signed __int16 *)(a1 + 20));
  5933.   sub_1000B120();
  5934.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * v19 + flt_10039782;
  5935.   v16 = 0.5;
  5936.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * v19 + flt_10039786;
  5937.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  5938.   if ( LODWORD(flt_10039782) > 0x80000000 )
  5939.     v16 = -0.5;
  5940.   v8 = (signed __int64)(flt_10039782 + v16);
  5941.   v17 = 0.5;
  5942.   v9 = v8 + 0x8000;
  5943.   if ( LODWORD(flt_10039786) > 0x80000000 )
  5944.     v17 = -0.5;
  5945.   v10 = (signed __int64)(flt_10039786 + v17);
  5946.   v18 = 0.5;
  5947.   v11 = v10 + 0x8000;
  5948.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  5949.     v18 = -0.5;
  5950.   v12 = (signed __int64)(flt_1003978A + v18);
  5951.   sub_1000BD10(v9, v11);
  5952.   sub_1000B7A0();
  5953.   v15 = (int *)(a1 + 42);
  5954.   v14 = *(_DWORD *)(a1 + 38);
  5955.   if ( SLODWORD(a3) <= 1060439169 )
  5956.     result = sub_10007A80(v9, v11, v12, v14, v15);
  5957.   else
  5958.     result = sub_10007B39(v9, v11, v12, v14, (unsigned int *)v15);
  5959.   return result;
  5960. }
  5961. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  5962. // 10036C7C: using guessed type int dword_10036C7C;
  5963. // 10039782: using guessed type float flt_10039782;
  5964. // 10039786: using guessed type float flt_10039786;
  5965. // 1003978A: using guessed type float flt_1003978A;
  5966.  
  5967. //----- (1000A0D0) --------------------------------------------------------
  5968. int __cdecl sub_1000A0D0(int a1, int a2, float a3, float a4, int a5, int a6)
  5969. {
  5970.   signed __int64 v6; // rax@3
  5971.   int v7; // edi@3
  5972.   signed __int64 v8; // rax@5
  5973.   int v9; // ebx@5
  5974.   int v10; // ebp@7
  5975.   float v12; // [esp+10h] [ebp-4h]@1
  5976.   float v13; // [esp+10h] [ebp-4h]@3
  5977.   float v14; // [esp+10h] [ebp-4h]@5
  5978.  
  5979.   sub_1000AA20(a1 + 32, a2, a3, a4, a6);
  5980.   sub_1000B800((signed __int16 *)(a1 + 26), (signed __int16 *)(a1 + 20));
  5981.   sub_1000B120();
  5982.   sub_1000B7A0();
  5983.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * 128.0 + flt_10039782;
  5984.   v12 = 0.5;
  5985.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * 128.0 + flt_10039786;
  5986.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  5987.   if ( LODWORD(flt_10039782) > 0x80000000 )
  5988.     v12 = -0.5;
  5989.   v6 = (signed __int64)(flt_10039782 + v12);
  5990.   v13 = 0.5;
  5991.   v7 = v6 + 0x8000;
  5992.   if ( LODWORD(flt_10039786) > 0x80000000 )
  5993.     v13 = -0.5;
  5994.   v8 = (signed __int64)(flt_10039786 + v13);
  5995.   v14 = 0.5;
  5996.   v9 = v8 + 0x8000;
  5997.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  5998.     v14 = -0.5;
  5999.   v10 = (signed __int64)(flt_1003978A + v14);
  6000.   dword_10039F00 = sub_1000BE60(v7, v9);
  6001.   return sub_10007A80(v7, v9, v10, *(_DWORD *)(a1 + 38), (int *)(a1 + 42));
  6002. }
  6003. // 10039782: using guessed type float flt_10039782;
  6004. // 10039786: using guessed type float flt_10039786;
  6005. // 1003978A: using guessed type float flt_1003978A;
  6006. // 10039F00: using guessed type int dword_10039F00;
  6007.  
  6008. //----- (1000A230) --------------------------------------------------------
  6009. int __cdecl sub_1000A230(int a1, int a2, float a3, float a4, int a5, int a6)
  6010. {
  6011.   float v6; // eax@1
  6012.   double v7; // st7@2
  6013.   signed __int64 v8; // rax@9
  6014.   int v9; // edi@9
  6015.   signed __int64 v10; // rax@11
  6016.   int v11; // ebx@11
  6017.   int v12; // ebp@13
  6018.   float v14; // [esp+10h] [ebp-8h]@7
  6019.   float v15; // [esp+10h] [ebp-8h]@9
  6020.   float v16; // [esp+10h] [ebp-8h]@11
  6021.   float v17; // [esp+14h] [ebp-4h]@5
  6022.  
  6023.   v6 = 0.70709997;
  6024.   if ( SLODWORD(a3) <= 1060439169 )
  6025.   {
  6026.     v17 = 256.0;
  6027.   }
  6028.   else
  6029.   {
  6030.     v7 = 181.01759;
  6031.     if ( dword_10036C7C )
  6032.       unknown_libname_9(LODWORD(a3));
  6033.     else
  6034.       v7 = 181.01759 / a3;
  6035.     a3 = v6;
  6036.     v17 = v7;
  6037.   }
  6038.   sub_1000AA20(a1 + 18, a2, a3, a4, a6);
  6039.   sub_1000B800((signed __int16 *)(a1 + 6), (signed __int16 *)(a1 + 12));
  6040.   sub_1000B120();
  6041.   sub_1000B7A0();
  6042.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * v17 + flt_10039782;
  6043.   v14 = 0.5;
  6044.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * v17 + flt_10039786;
  6045.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  6046.   if ( LODWORD(flt_10039782) > 0x80000000 )
  6047.     v14 = -0.5;
  6048.   v8 = (signed __int64)(flt_10039782 + v14);
  6049.   v15 = 0.5;
  6050.   v9 = v8 + 0x8000;
  6051.   if ( LODWORD(flt_10039786) > 0x80000000 )
  6052.     v15 = -0.5;
  6053.   v10 = (signed __int64)(flt_10039786 + v15);
  6054.   v16 = 0.5;
  6055.   v11 = v10 + 0x8000;
  6056.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  6057.     v16 = -0.5;
  6058.   v12 = (signed __int64)(flt_1003978A + v16);
  6059.   dword_10039F00 = sub_1000BE60(v9, v11);
  6060.   return sub_10007A80(v9, v11, v12, *(_DWORD *)(a1 + 24), (int *)(a1 + 32));
  6061. }
  6062. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  6063. // 10036C7C: using guessed type int dword_10036C7C;
  6064. // 10039782: using guessed type float flt_10039782;
  6065. // 10039786: using guessed type float flt_10039786;
  6066. // 1003978A: using guessed type float flt_1003978A;
  6067. // 10039F00: using guessed type int dword_10039F00;
  6068.  
  6069. //----- (1000A3D0) --------------------------------------------------------
  6070. int __cdecl sub_1000A3D0(int a1, int a2, float a3, float a4, int a5, int a6)
  6071. {
  6072.   float v6; // eax@1
  6073.   double v7; // st7@2
  6074.   signed __int64 v8; // rax@9
  6075.   int v9; // edi@9
  6076.   signed __int64 v10; // rax@11
  6077.   int v11; // ebx@11
  6078.   int v12; // ebp@13
  6079.   int result; // eax@14
  6080.   int v14; // [esp-8h] [ebp-20h]@13
  6081.   int *v15; // [esp-4h] [ebp-1Ch]@13
  6082.   float v16; // [esp+10h] [ebp-8h]@7
  6083.   float v17; // [esp+10h] [ebp-8h]@9
  6084.   float v18; // [esp+10h] [ebp-8h]@11
  6085.   float v19; // [esp+14h] [ebp-4h]@5
  6086.  
  6087.   v6 = 1.0;
  6088.   if ( SLODWORD(a3) <= 1065353216 )
  6089.   {
  6090.     v19 = 256.0;
  6091.   }
  6092.   else
  6093.   {
  6094.     v7 = 256.0;
  6095.     if ( dword_10036C7C )
  6096.       unknown_libname_9(LODWORD(a3));
  6097.     else
  6098.       v7 = 256.0 / a3;
  6099.     a3 = v6;
  6100.     v19 = v7;
  6101.   }
  6102.   sub_1000AA20(a1 + 18, a2, a3, a4, a6);
  6103.   sub_1000B800((signed __int16 *)(a1 + 6), (signed __int16 *)(a1 + 12));
  6104.   sub_1000B120();
  6105.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * v19 + flt_10039782;
  6106.   v16 = 0.5;
  6107.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * v19 + flt_10039786;
  6108.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  6109.   if ( LODWORD(flt_10039782) > 0x80000000 )
  6110.     v16 = -0.5;
  6111.   v8 = (signed __int64)(flt_10039782 + v16);
  6112.   v17 = 0.5;
  6113.   v9 = v8 + 0x8000;
  6114.   if ( LODWORD(flt_10039786) > 0x80000000 )
  6115.     v17 = -0.5;
  6116.   v10 = (signed __int64)(flt_10039786 + v17);
  6117.   v18 = 0.5;
  6118.   v11 = v10 + 0x8000;
  6119.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  6120.     v18 = -0.5;
  6121.   v12 = (signed __int64)(flt_1003978A + v18);
  6122.   sub_1000BD10(v9, v11);
  6123.   sub_1000B7A0();
  6124.   v15 = (int *)(a1 + 32);
  6125.   v14 = *(_DWORD *)(a1 + 24);
  6126.   if ( SLODWORD(a3) <= 1060439169 )
  6127.     result = sub_10007A80(v9, v11, v12, v14, v15);
  6128.   else
  6129.     result = sub_10007B39(v9, v11, v12, v14, (unsigned int *)v15);
  6130.   return result;
  6131. }
  6132. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  6133. // 10036C7C: using guessed type int dword_10036C7C;
  6134. // 10039782: using guessed type float flt_10039782;
  6135. // 10039786: using guessed type float flt_10039786;
  6136. // 1003978A: using guessed type float flt_1003978A;
  6137.  
  6138. //----- (1000A580) --------------------------------------------------------
  6139. int __cdecl sub_1000A580(int a1, int a2, float a3, float a4, int a5, int a6)
  6140. {
  6141.   signed __int64 v6; // rax@3
  6142.   int v7; // edi@3
  6143.   signed __int64 v8; // rax@5
  6144.   int v9; // ebx@5
  6145.   int v10; // ebp@7
  6146.   float v12; // [esp+10h] [ebp-4h]@1
  6147.   float v13; // [esp+10h] [ebp-4h]@3
  6148.   float v14; // [esp+10h] [ebp-4h]@5
  6149.  
  6150.   sub_1000AA20(a1 + 18, a2, a3, a4, a6);
  6151.   sub_1000B800((signed __int16 *)(a1 + 6), (signed __int16 *)(a1 + 12));
  6152.   sub_1000B120();
  6153.   sub_1000B7A0();
  6154.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * 128.0 + flt_10039782;
  6155.   v12 = 0.5;
  6156.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * 128.0 + flt_10039786;
  6157.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  6158.   if ( LODWORD(flt_10039782) > 0x80000000 )
  6159.     v12 = -0.5;
  6160.   v6 = (signed __int64)(flt_10039782 + v12);
  6161.   v13 = 0.5;
  6162.   v7 = v6 + 0x8000;
  6163.   if ( LODWORD(flt_10039786) > 0x80000000 )
  6164.     v13 = -0.5;
  6165.   v8 = (signed __int64)(flt_10039786 + v13);
  6166.   v14 = 0.5;
  6167.   v9 = v8 + 0x8000;
  6168.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  6169.     v14 = -0.5;
  6170.   v10 = (signed __int64)(flt_1003978A + v14);
  6171.   dword_10039F00 = sub_1000BE60(v7, v9);
  6172.   return sub_10007A80(v7, v9, v10, *(_DWORD *)(a1 + 24), (int *)(a1 + 32));
  6173. }
  6174. // 10039782: using guessed type float flt_10039782;
  6175. // 10039786: using guessed type float flt_10039786;
  6176. // 1003978A: using guessed type float flt_1003978A;
  6177. // 10039F00: using guessed type int dword_10039F00;
  6178.  
  6179. //----- (1000A6E0) --------------------------------------------------------
  6180. _WORD *__cdecl sub_1000A6E0(int a1, int a2, float a3, float a4, int a5)
  6181. {
  6182.   float v5; // eax@1
  6183.   double v6; // st7@2
  6184.   signed __int64 v7; // rax@9
  6185.   unsigned int v8; // edi@9
  6186.   signed __int64 v9; // rax@11
  6187.   int v10; // ebx@11
  6188.   unsigned int v11; // ebp@13
  6189.   float v13; // [esp+10h] [ebp-8h]@7
  6190.   float v14; // [esp+10h] [ebp-8h]@9
  6191.   float v15; // [esp+10h] [ebp-8h]@11
  6192.   float v16; // [esp+14h] [ebp-4h]@5
  6193.  
  6194.   v5 = 1.0;
  6195.   if ( SLODWORD(a3) <= 1065353216 )
  6196.   {
  6197.     v16 = 256.0;
  6198.   }
  6199.   else
  6200.   {
  6201.     v6 = 256.0;
  6202.     if ( dword_10036C7C )
  6203.       unknown_libname_9(LODWORD(a3));
  6204.     else
  6205.       v6 = 256.0 / a3;
  6206.     a3 = v5;
  6207.     v16 = v6;
  6208.   }
  6209.   sub_1000AE50(a1 + 32, a2, a3, a4);
  6210.   sub_1000B800((signed __int16 *)(a1 + 26), (signed __int16 *)(a1 + 20));
  6211.   sub_1000B120();
  6212.   sub_1000B7A0();
  6213.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * v16 + flt_10039782;
  6214.   v13 = 0.5;
  6215.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * v16 + flt_10039786;
  6216.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  6217.   if ( LODWORD(flt_10039782) > 0x80000000 )
  6218.     v13 = -0.5;
  6219.   v7 = (signed __int64)(flt_10039782 + v13);
  6220.   v14 = 0.5;
  6221.   v8 = v7 + 0x8000;
  6222.   if ( LODWORD(flt_10039786) > 0x80000000 )
  6223.     v14 = -0.5;
  6224.   v9 = (signed __int64)(flt_10039786 + v14);
  6225.   v15 = 0.5;
  6226.   v10 = v9 + 0x8000;
  6227.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  6228.     v15 = -0.5;
  6229.   v11 = (signed __int64)(flt_1003978A + v15);
  6230.   dword_10039F00 = sub_1000BE60(v8, v10);
  6231.   return sub_10007C34(v8, v10, v11, *(_WORD **)(a1 + 38), a1 + 42);
  6232. }
  6233. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  6234. // 10036C7C: using guessed type int dword_10036C7C;
  6235. // 10039782: using guessed type float flt_10039782;
  6236. // 10039786: using guessed type float flt_10039786;
  6237. // 1003978A: using guessed type float flt_1003978A;
  6238. // 10039F00: using guessed type int dword_10039F00;
  6239.  
  6240. //----- (1000A880) --------------------------------------------------------
  6241. _WORD *__cdecl sub_1000A880(int a1, int a2, float a3, float a4, int a5)
  6242. {
  6243.   float v5; // eax@1
  6244.   double v6; // st7@2
  6245.   signed __int64 v7; // rax@9
  6246.   unsigned int v8; // edi@9
  6247.   signed __int64 v9; // rax@11
  6248.   int v10; // ebx@11
  6249.   unsigned int v11; // ebp@13
  6250.   float v13; // [esp+10h] [ebp-8h]@7
  6251.   float v14; // [esp+10h] [ebp-8h]@9
  6252.   float v15; // [esp+10h] [ebp-8h]@11
  6253.   float v16; // [esp+14h] [ebp-4h]@5
  6254.  
  6255.   v5 = 1.0;
  6256.   if ( SLODWORD(a3) <= 1065353216 )
  6257.   {
  6258.     v16 = 256.0;
  6259.   }
  6260.   else
  6261.   {
  6262.     v6 = 256.0;
  6263.     if ( dword_10036C7C )
  6264.       unknown_libname_9(LODWORD(a3));
  6265.     else
  6266.       v6 = 256.0 / a3;
  6267.     a3 = v5;
  6268.     v16 = v6;
  6269.   }
  6270.   sub_1000AE50(a1 + 18, a2, a3, a4);
  6271.   sub_1000B800((signed __int16 *)(a1 + 6), (signed __int16 *)(a1 + 12));
  6272.   sub_1000B120();
  6273.   sub_1000B7A0();
  6274.   flt_10039782 = (*(float *)a5 - (double)(signed int)(signed __int64)*(float *)a5) * v16 + flt_10039782;
  6275.   v13 = 0.5;
  6276.   flt_10039786 = (*(float *)(a5 + 4) - (double)(signed int)(signed __int64)*(float *)(a5 + 4)) * v16 + flt_10039786;
  6277.   flt_1003978A = *(float *)(a5 + 8) * 256.0 + flt_1003978A;
  6278.   if ( LODWORD(flt_10039782) > 0x80000000 )
  6279.     v13 = -0.5;
  6280.   v7 = (signed __int64)(flt_10039782 + v13);
  6281.   v14 = 0.5;
  6282.   v8 = v7 + 0x8000;
  6283.   if ( LODWORD(flt_10039786) > 0x80000000 )
  6284.     v14 = -0.5;
  6285.   v9 = (signed __int64)(flt_10039786 + v14);
  6286.   v15 = 0.5;
  6287.   v10 = v9 + 0x8000;
  6288.   if ( LODWORD(flt_1003978A) > 0x80000000 )
  6289.     v15 = -0.5;
  6290.   v11 = (signed __int64)(flt_1003978A + v15);
  6291.   dword_10039F00 = sub_1000BE60(v8, v10);
  6292.   return sub_10007C34(v8, v10, v11, *(_WORD **)(a1 + 24), a1 + 32);
  6293. }
  6294. // 10010CBC: using guessed type double __stdcall unknown_libname_9(_DWORD);
  6295. // 10036C7C: using guessed type int dword_10036C7C;
  6296. // 10039782: using guessed type float flt_10039782;
  6297. // 10039786: using guessed type float flt_10039786;
  6298. // 1003978A: using guessed type float flt_1003978A;
  6299. // 10039F00: using guessed type int dword_10039F00;
  6300.  
  6301. //----- (1000AA20) --------------------------------------------------------
  6302. int __cdecl sub_1000AA20(int a1, int a2, float a3, float a4, int a5)
  6303. {
  6304.   float v6; // ST08_4@3
  6305.   char v7; // c0@1
  6306.   float v9; // ST08_4@5
  6307.   char v10; // c0@3
  6308.   float v12; // ST08_4@7
  6309.   char v13; // c0@5
  6310.   float v15; // ST08_4@9
  6311.   char v16; // c0@7
  6312.   float v18; // ST08_4@11
  6313.   char v19; // c0@9
  6314.   float v21; // ST08_4@13
  6315.   char v22; // c0@11
  6316.   float v24; // ST08_4@15
  6317.   char v25; // c0@13
  6318.   float v27; // ST08_4@17
  6319.   char v28; // c0@15
  6320.   float v30; // ST08_4@19
  6321.   char v31; // c0@17
  6322.   char v33; // c0@19
  6323.   long double v34; // st7@24
  6324.   char v36; // c0@27
  6325.   signed __int64 v37; // rax@29
  6326.   float v39; // [esp+0h] [ebp-10h]@1
  6327.   float v40; // [esp+0h] [ebp-10h]@3
  6328.   float v41; // [esp+0h] [ebp-10h]@5
  6329.   float v42; // [esp+0h] [ebp-10h]@7
  6330.   float v43; // [esp+0h] [ebp-10h]@9
  6331.   float v44; // [esp+0h] [ebp-10h]@11
  6332.   float v45; // [esp+0h] [ebp-10h]@13
  6333.   float v46; // [esp+0h] [ebp-10h]@15
  6334.   float v47; // [esp+0h] [ebp-10h]@17
  6335.   float v48; // [esp+0h] [ebp-10h]@27
  6336.   float v49; // [esp+4h] [ebp-Ch]@22
  6337.   float v50; // [esp+8h] [ebp-8h]@1
  6338.   float v51; // [esp+Ch] [ebp-4h]@1
  6339.  
  6340.   v50 = a3 * 256.0;
  6341.   v51 = a4 * 256.0;
  6342.   v39 = 0.5;
  6343.   if ( v7 )
  6344.     v39 = -0.5;
  6345.   v6 = *(float *)a2 * v50;
  6346.   word_10039770 = (signed __int64)(v6 + v39);
  6347.   v40 = 0.5;
  6348.   if ( v10 )
  6349.     v40 = -0.5;
  6350.   v9 = *(float *)(a2 + 4) * v50;
  6351.   word_10039772 = (signed __int64)(v9 + v40);
  6352.   v41 = 0.5;
  6353.   if ( v13 )
  6354.     v41 = -0.5;
  6355.   v12 = *(float *)(a2 + 8) * v50;
  6356.   word_10039774 = (signed __int64)(v12 + v41);
  6357.   v42 = 0.5;
  6358.   if ( v16 )
  6359.     v42 = -0.5;
  6360.   v15 = *(float *)(a2 + 12) * v50;
  6361.   word_10039776 = (signed __int64)(v15 + v42);
  6362.   v43 = 0.5;
  6363.   if ( v19 )
  6364.     v43 = -0.5;
  6365.   v18 = *(float *)(a2 + 16) * v50;
  6366.   word_10039778 = (signed __int64)(v18 + v43);
  6367.   v44 = 0.5;
  6368.   if ( v22 )
  6369.     v44 = -0.5;
  6370.   v21 = *(float *)(a2 + 20) * v50;
  6371.   word_1003977A = (signed __int64)(v21 + v44);
  6372.   v45 = 0.5;
  6373.   if ( v25 )
  6374.     v45 = -0.5;
  6375.   v24 = *(float *)(a2 + 24) * v51;
  6376.   word_1003977C = (signed __int64)(v24 + v45);
  6377.   v46 = 0.5;
  6378.   if ( v28 )
  6379.     v46 = -0.5;
  6380.   v27 = *(float *)(a2 + 28) * v51;
  6381.   word_1003977E = (signed __int64)(v27 + v46);
  6382.   v47 = 0.5;
  6383.   if ( v31 )
  6384.     v47 = -0.5;
  6385.   v30 = *(float *)(a2 + 32) * v51;
  6386.   word_10039780 = (signed __int64)(v30 + v47);
  6387.   flt_10039782 = ((double)*(signed __int16 *)(a1 + 2) * *(float *)(a2 + 4)
  6388.                 + (double)*(signed __int16 *)(a1 + 4) * *(float *)(a2 + 8)
  6389.                 + (double)*(signed __int16 *)a1 * *(float *)a2)
  6390.                * v50;
  6391.   flt_10039786 = ((double)*(signed __int16 *)(a1 + 2) * *(float *)(a2 + 16)
  6392.                 + (double)*(signed __int16 *)(a1 + 4) * *(float *)(a2 + 20)
  6393.                 + (double)*(signed __int16 *)a1 * *(float *)(a2 + 12))
  6394.                * v50;
  6395.   flt_1003978A = ((double)*(signed __int16 *)(a1 + 4) * *(float *)(a2 + 32)
  6396.                 + (double)*(signed __int16 *)(a1 + 2) * *(float *)(a2 + 28)
  6397.                 + (double)*(signed __int16 *)a1 * *(float *)(a2 + 24))
  6398.                * v51;
  6399.   flt_1003978E = *(float *)(a5 + 8) * *(float *)(a2 + 24)
  6400.                + *(float *)(a5 + 4) * *(float *)(a2 + 12)
  6401.                + *(float *)a5 * *(float *)a2;
  6402.   flt_10039792 = *(float *)a5 * *(float *)(a2 + 4)
  6403.                + *(float *)(a5 + 8) * *(float *)(a2 + 28)
  6404.                + *(float *)(a5 + 4) * *(float *)(a2 + 16);
  6405.   flt_10039796 = *(float *)a5 * *(float *)(a2 + 8)
  6406.                + *(float *)(a5 + 4) * *(float *)(a2 + 20)
  6407.                + *(float *)(a5 + 8) * *(float *)(a2 + 32);
  6408.   if ( v33 )
  6409.   {
  6410.     flt_1003978E = -flt_1003978E;
  6411.     flt_10039792 = -flt_10039792;
  6412.     flt_10039796 = -flt_10039796;
  6413.   }
  6414.   if ( SLODWORD(flt_10039796) < 1065353216 )
  6415.     v49 = acos(flt_10039796);
  6416.   else
  6417.     v49 = 0.0;
  6418.   v34 = flt_10039792;
  6419.   if ( dword_10036C7C )
  6420.     unknown_libname_25(v34);
  6421.   else
  6422.     v34 = atan2(flt_1003978E, v34);
  6423.   v48 = v34;
  6424.   if ( v36 )
  6425.     v48 = v48 + 6.283185;
  6426.   v37 = (signed __int64)(v48 * 14.16479 + 0.5);
  6427.   if ( (_WORD)v37 == 89 )
  6428.     LOWORD(v37) = 0;
  6429.   LODWORD(v37) = (signed __int16)v37;
  6430.   dword_1002A298 = (int)*(&off_10036BE0 + (signed __int16)(signed __int64)(v49 * 14.642256 + 0.5))
  6431.                  + -(signed __int16)v37
  6432.                  + 89;
  6433.   return v37;
  6434. }
  6435. // 10011465: using guessed type double __usercall unknown_libname_25@<st0>(double@<st0>);
  6436. // 1002A298: using guessed type int dword_1002A298;
  6437. // 10036BE0: using guessed type void *off_10036BE0;
  6438. // 10036C7C: using guessed type int dword_10036C7C;
  6439. // 10039770: using guessed type __int16 word_10039770;
  6440. // 10039772: using guessed type __int16 word_10039772;
  6441. // 10039774: using guessed type __int16 word_10039774;
  6442. // 10039776: using guessed type __int16 word_10039776;
  6443. // 10039778: using guessed type __int16 word_10039778;
  6444. // 1003977A: using guessed type __int16 word_1003977A;
  6445. // 1003977C: using guessed type __int16 word_1003977C;
  6446. // 1003977E: using guessed type __int16 word_1003977E;
  6447. // 10039780: using guessed type __int16 word_10039780;
  6448. // 10039782: using guessed type float flt_10039782;
  6449. // 10039786: using guessed type float flt_10039786;
  6450. // 1003978A: using guessed type float flt_1003978A;
  6451. // 1003978E: using guessed type float flt_1003978E;
  6452. // 10039792: using guessed type float flt_10039792;
  6453. // 10039796: using guessed type float flt_10039796;
  6454.  
  6455. //----- (1000AE50) --------------------------------------------------------
  6456. int __cdecl sub_1000AE50(int a1, int a2, float a3, float a4)
  6457. {
  6458.   double v4; // st6@1
  6459.   float v5; // ST08_4@3
  6460.   double v6; // st6@3
  6461.   float v7; // ST08_4@5
  6462.   double v8; // st6@5
  6463.   float v9; // ST08_4@7
  6464.   double v10; // st6@7
  6465.   float v11; // ST08_4@9
  6466.   double v12; // st6@9
  6467.   float v13; // ST08_4@11
  6468.   double v14; // st6@11
  6469.   float v15; // ST08_4@13
  6470.   double v16; // st6@13
  6471.   float v17; // ST08_4@15
  6472.   double v18; // st6@15
  6473.   float v19; // ST08_4@17
  6474.   double v20; // st6@17
  6475.   float v21; // ST08_4@19
  6476.   int result; // eax@19
  6477.   float v23; // [esp+0h] [ebp-10h]@1
  6478.   float v24; // [esp+0h] [ebp-10h]@3
  6479.   float v25; // [esp+0h] [ebp-10h]@5
  6480.   float v26; // [esp+0h] [ebp-10h]@7
  6481.   float v27; // [esp+0h] [ebp-10h]@9
  6482.   float v28; // [esp+0h] [ebp-10h]@11
  6483.   float v29; // [esp+0h] [ebp-10h]@13
  6484.   float v30; // [esp+0h] [ebp-10h]@15
  6485.   float v31; // [esp+0h] [ebp-10h]@17
  6486.   float v32; // [esp+8h] [ebp-8h]@1
  6487.   float v33; // [esp+Ch] [ebp-4h]@1
  6488.  
  6489.   v32 = a3 * 256.0;
  6490.   v33 = a4 * 256.0;
  6491.   v4 = *(float *)a2 * v32;
  6492.   v23 = 0.5;
  6493.   if ( v4 < 0.0 )
  6494.     v23 = -0.5;
  6495.   v5 = v4;
  6496.   word_10039770 = (signed __int64)(v5 + v23);
  6497.   v6 = *(float *)(a2 + 4) * v32;
  6498.   v24 = 0.5;
  6499.   if ( v6 < 0.0 )
  6500.     v24 = -0.5;
  6501.   v7 = v6;
  6502.   word_10039772 = (signed __int64)(v7 + v24);
  6503.   v8 = *(float *)(a2 + 8) * v32;
  6504.   v25 = 0.5;
  6505.   if ( v8 < 0.0 )
  6506.     v25 = -0.5;
  6507.   v9 = v8;
  6508.   word_10039774 = (signed __int64)(v9 + v25);
  6509.   v10 = *(float *)(a2 + 12) * v32;
  6510.   v26 = 0.5;
  6511.   if ( v10 < 0.0 )
  6512.     v26 = -0.5;
  6513.   v11 = v10;
  6514.   word_10039776 = (signed __int64)(v11 + v26);
  6515.   v12 = *(float *)(a2 + 16) * v32;
  6516.   v27 = 0.5;
  6517.   if ( v12 < 0.0 )
  6518.     v27 = -0.5;
  6519.   v13 = v12;
  6520.   word_10039778 = (signed __int64)(v13 + v27);
  6521.   v14 = *(float *)(a2 + 20) * v32;
  6522.   v28 = 0.5;
  6523.   if ( v14 < 0.0 )
  6524.     v28 = -0.5;
  6525.   v15 = v14;
  6526.   word_1003977A = (signed __int64)(v15 + v28);
  6527.   v16 = *(float *)(a2 + 24) * v33;
  6528.   v29 = 0.5;
  6529.   if ( v16 < 0.0 )
  6530.     v29 = -0.5;
  6531.   v17 = v16;
  6532.   word_1003977C = (signed __int64)(v17 + v29);
  6533.   v18 = *(float *)(a2 + 28) * v33;
  6534.   v30 = 0.5;
  6535.   if ( v18 < 0.0 )
  6536.     v30 = -0.5;
  6537.   v19 = v18;
  6538.   word_1003977E = (signed __int64)(v19 + v30);
  6539.   v20 = *(float *)(a2 + 32) * v33;
  6540.   v31 = 0.5;
  6541.   if ( v20 < 0.0 )
  6542.     v31 = -0.5;
  6543.   v21 = v20;
  6544.   word_10039780 = (signed __int64)(v21 + v31);
  6545.   flt_10039782 = ((double)*(signed __int16 *)(a1 + 2) * *(float *)(a2 + 4)
  6546.                 + (double)*(signed __int16 *)(a1 + 4) * *(float *)(a2 + 8)
  6547.                 + (double)*(signed __int16 *)a1 * *(float *)a2)
  6548.                * v32;
  6549.   flt_10039786 = ((double)*(signed __int16 *)(a1 + 2) * *(float *)(a2 + 16)
  6550.                 + (double)*(signed __int16 *)(a1 + 4) * *(float *)(a2 + 20)
  6551.                 + (double)*(signed __int16 *)a1 * *(float *)(a2 + 12))
  6552.                * v32;
  6553.   result = *(signed __int16 *)(a1 + 4);
  6554.   flt_1003978A = ((double)result * *(float *)(a2 + 32)
  6555.                 + (double)*(signed __int16 *)(a1 + 2) * *(float *)(a2 + 28)
  6556.                 + (double)*(signed __int16 *)a1 * *(float *)(a2 + 24))
  6557.                * v33;
  6558.   return result;
  6559. }
  6560. // 10039770: using guessed type __int16 word_10039770;
  6561. // 10039772: using guessed type __int16 word_10039772;
  6562. // 10039774: using guessed type __int16 word_10039774;
  6563. // 10039776: using guessed type __int16 word_10039776;
  6564. // 10039778: using guessed type __int16 word_10039778;
  6565. // 1003977A: using guessed type __int16 word_1003977A;
  6566. // 1003977C: using guessed type __int16 word_1003977C;
  6567. // 1003977E: using guessed type __int16 word_1003977E;
  6568. // 10039780: using guessed type __int16 word_10039780;
  6569. // 10039782: using guessed type float flt_10039782;
  6570. // 10039786: using guessed type float flt_10039786;
  6571. // 1003978A: using guessed type float flt_1003978A;
  6572.  
  6573. //----- (1000B120) --------------------------------------------------------
  6574. int sub_1000B120()
  6575. {
  6576.   int result; // eax@1
  6577.  
  6578.   LOWORD(dword_10039F10[0]) = -(signed __int16)(word_10039770 + word_10039772 + word_10039774);
  6579.   HIWORD(dword_10039F10[0]) = -(signed __int16)(word_1003977A + word_10039778 + word_10039776);
  6580.   dword_10039F14 = -(word_10039780 + word_1003977E + word_1003977C);
  6581.   word_10039F18 = -(signed __int16)(word_10039770 + word_10039772);
  6582.   word_10039F1A = -(signed __int16)(word_10039778 + word_10039776);
  6583.   dword_10039F1C = -(word_1003977E + word_1003977C);
  6584.   word_10039F20 = word_10039774 - word_10039772 - word_10039770;
  6585.   word_10039F22 = word_1003977A - word_10039776 - word_10039778;
  6586.   dword_10039F24 = word_10039780 - word_1003977C - word_1003977E;
  6587.   word_10039F28 = -(signed __int16)(word_10039770 + word_10039774);
  6588.   word_10039F2A = -(signed __int16)(word_1003977A + word_10039776);
  6589.   dword_10039F2C = -(word_10039780 + word_1003977C);
  6590.   word_10039F30 = -word_10039770;
  6591.   word_10039F32 = -word_10039776;
  6592.   dword_10039F34 = -word_1003977C;
  6593.   word_10039F38 = word_10039774 - word_10039770;
  6594.   word_10039F3A = word_1003977A - word_10039776;
  6595.   dword_10039F3C = word_10039780 - word_1003977C;
  6596.   word_10039F40 = word_10039772 - word_10039774 - word_10039770;
  6597.   word_10039F42 = word_10039778 - word_10039776 - word_1003977A;
  6598.   dword_10039F44 = word_1003977E - word_1003977C - word_10039780;
  6599.   word_10039F48 = word_10039772 - word_10039770;
  6600.   word_10039F4A = word_10039778 - word_10039776;
  6601.   dword_10039F4C = word_1003977E - word_1003977C;
  6602.   word_10039F50 = word_10039774 + word_10039772 - word_10039770;
  6603.   word_10039F52 = word_1003977A + word_10039778 - word_10039776;
  6604.   dword_10039F54 = word_10039780 + word_1003977E - word_1003977C;
  6605.   word_10039F58 = -(signed __int16)(word_10039772 + word_10039774);
  6606.   word_10039F5A = -(signed __int16)(word_1003977A + word_10039778);
  6607.   dword_10039F5C = -(word_10039780 + word_1003977E);
  6608.   word_10039F60 = -word_10039772;
  6609.   word_10039F62 = -word_10039778;
  6610.   dword_10039F64 = -word_1003977E;
  6611.   word_10039F68 = word_10039774 - word_10039772;
  6612.   word_10039F6A = word_1003977A - word_10039778;
  6613.   dword_10039F6C = word_10039780 - word_1003977E;
  6614.   word_10039F70 = -word_10039774;
  6615.   word_10039F72 = -word_1003977A;
  6616.   dword_10039F74 = -word_10039780;
  6617.   word_10039F78 = word_10039774;
  6618.   word_10039F7A = word_1003977A;
  6619.   dword_10039F7C = word_10039780;
  6620.   word_10039F80 = word_10039772 - word_10039774;
  6621.   word_10039F82 = word_10039778 - word_1003977A;
  6622.   dword_10039F84 = word_1003977E - word_10039780;
  6623.   word_10039F88 = word_10039772;
  6624.   word_10039F8A = word_10039778;
  6625.   dword_10039F8C = word_1003977E;
  6626.   word_10039F90 = word_10039774 + word_10039772;
  6627.   word_10039F92 = word_1003977A + word_10039778;
  6628.   dword_10039F94 = word_10039780 + word_1003977E;
  6629.   word_10039F98 = word_10039770 - word_10039774 - word_10039772;
  6630.   word_10039F9A = word_10039776 - word_10039778 - word_1003977A;
  6631.   dword_10039F9C = word_1003977C - word_1003977E - word_10039780;
  6632.   word_10039FA0 = word_10039770 - word_10039772;
  6633.   word_10039FA2 = word_10039776 - word_10039778;
  6634.   dword_10039FA4 = word_1003977C - word_1003977E;
  6635.   word_10039FA8 = word_10039770 + word_10039774 - word_10039772;
  6636.   word_10039FAA = word_1003977A + word_10039776 - word_10039778;
  6637.   dword_10039FAC = word_10039780 + word_1003977C - word_1003977E;
  6638.   word_10039FB0 = word_10039770 - word_10039774;
  6639.   word_10039FB2 = word_10039776 - word_1003977A;
  6640.   dword_10039FB4 = word_1003977C - word_10039780;
  6641.   word_10039FB8 = word_10039770;
  6642.   word_10039FBA = word_10039776;
  6643.   dword_10039FBC = word_1003977C;
  6644.   word_10039FC0 = word_10039770 + word_10039774;
  6645.   word_10039FC2 = word_1003977A + word_10039776;
  6646.   dword_10039FC4 = word_10039780 + word_1003977C;
  6647.   word_10039FC8 = word_10039770 + word_10039772 - word_10039774;
  6648.   word_10039FCA = word_10039778 + word_10039776 - word_1003977A;
  6649.   dword_10039FCC = word_1003977E + word_1003977C - word_10039780;
  6650.   word_10039FD0 = word_10039770 + word_10039772;
  6651.   word_10039FD2 = word_10039778 + word_10039776;
  6652.   dword_10039FD4 = word_1003977E + word_1003977C;
  6653.   word_10039FD8 = word_10039770 + word_10039774 + word_10039772;
  6654.   word_10039FDA = word_1003977A + word_10039778 + word_10039776;
  6655.   result = word_10039780;
  6656.   dword_10039FDC = word_10039780 + word_1003977E + word_1003977C;
  6657.   return result;
  6658. }
  6659. // 10039770: using guessed type __int16 word_10039770;
  6660. // 10039772: using guessed type __int16 word_10039772;
  6661. // 10039774: using guessed type __int16 word_10039774;
  6662. // 10039776: using guessed type __int16 word_10039776;
  6663. // 10039778: using guessed type __int16 word_10039778;
  6664. // 1003977A: using guessed type __int16 word_1003977A;
  6665. // 1003977C: using guessed type __int16 word_1003977C;
  6666. // 1003977E: using guessed type __int16 word_1003977E;
  6667. // 10039780: using guessed type __int16 word_10039780;
  6668. // 10039F10: using guessed type int dword_10039F10[];
  6669. // 10039F14: using guessed type int dword_10039F14;
  6670. // 10039F18: using guessed type __int16 word_10039F18;
  6671. // 10039F1A: using guessed type __int16 word_10039F1A;
  6672. // 10039F1C: using guessed type int dword_10039F1C;
  6673. // 10039F20: using guessed type __int16 word_10039F20;
  6674. // 10039F22: using guessed type __int16 word_10039F22;
  6675. // 10039F24: using guessed type int dword_10039F24;
  6676. // 10039F28: using guessed type __int16 word_10039F28;
  6677. // 10039F2A: using guessed type __int16 word_10039F2A;
  6678. // 10039F2C: using guessed type int dword_10039F2C;
  6679. // 10039F30: using guessed type __int16 word_10039F30;
  6680. // 10039F32: using guessed type __int16 word_10039F32;
  6681. // 10039F34: using guessed type int dword_10039F34;
  6682. // 10039F38: using guessed type __int16 word_10039F38;
  6683. // 10039F3A: using guessed type __int16 word_10039F3A;
  6684. // 10039F3C: using guessed type int dword_10039F3C;
  6685. // 10039F40: using guessed type __int16 word_10039F40;
  6686. // 10039F42: using guessed type __int16 word_10039F42;
  6687. // 10039F44: using guessed type int dword_10039F44;
  6688. // 10039F48: using guessed type __int16 word_10039F48;
  6689. // 10039F4A: using guessed type __int16 word_10039F4A;
  6690. // 10039F4C: using guessed type int dword_10039F4C;
  6691. // 10039F50: using guessed type __int16 word_10039F50;
  6692. // 10039F52: using guessed type __int16 word_10039F52;
  6693. // 10039F54: using guessed type int dword_10039F54;
  6694. // 10039F58: using guessed type __int16 word_10039F58;
  6695. // 10039F5A: using guessed type __int16 word_10039F5A;
  6696. // 10039F5C: using guessed type int dword_10039F5C;
  6697. // 10039F60: using guessed type __int16 word_10039F60;
  6698. // 10039F62: using guessed type __int16 word_10039F62;
  6699. // 10039F64: using guessed type int dword_10039F64;
  6700. // 10039F68: using guessed type __int16 word_10039F68;
  6701. // 10039F6A: using guessed type __int16 word_10039F6A;
  6702. // 10039F6C: using guessed type int dword_10039F6C;
  6703. // 10039F70: using guessed type __int16 word_10039F70;
  6704. // 10039F72: using guessed type __int16 word_10039F72;
  6705. // 10039F74: using guessed type int dword_10039F74;
  6706. // 10039F78: using guessed type __int16 word_10039F78;
  6707. // 10039F7A: using guessed type __int16 word_10039F7A;
  6708. // 10039F7C: using guessed type int dword_10039F7C;
  6709. // 10039F80: using guessed type __int16 word_10039F80;
  6710. // 10039F82: using guessed type __int16 word_10039F82;
  6711. // 10039F84: using guessed type int dword_10039F84;
  6712. // 10039F88: using guessed type __int16 word_10039F88;
  6713. // 10039F8A: using guessed type __int16 word_10039F8A;
  6714. // 10039F8C: using guessed type int dword_10039F8C;
  6715. // 10039F90: using guessed type __int16 word_10039F90;
  6716. // 10039F92: using guessed type __int16 word_10039F92;
  6717. // 10039F94: using guessed type int dword_10039F94;
  6718. // 10039F98: using guessed type __int16 word_10039F98;
  6719. // 10039F9A: using guessed type __int16 word_10039F9A;
  6720. // 10039F9C: using guessed type int dword_10039F9C;
  6721. // 10039FA0: using guessed type __int16 word_10039FA0;
  6722. // 10039FA2: using guessed type __int16 word_10039FA2;
  6723. // 10039FA4: using guessed type int dword_10039FA4;
  6724. // 10039FA8: using guessed type __int16 word_10039FA8;
  6725. // 10039FAA: using guessed type __int16 word_10039FAA;
  6726. // 10039FAC: using guessed type int dword_10039FAC;
  6727. // 10039FB0: using guessed type __int16 word_10039FB0;
  6728. // 10039FB2: using guessed type __int16 word_10039FB2;
  6729. // 10039FB4: using guessed type int dword_10039FB4;
  6730. // 10039FB8: using guessed type __int16 word_10039FB8;
  6731. // 10039FBA: using guessed type __int16 word_10039FBA;
  6732. // 10039FBC: using guessed type int dword_10039FBC;
  6733. // 10039FC0: using guessed type __int16 word_10039FC0;
  6734. // 10039FC2: using guessed type __int16 word_10039FC2;
  6735. // 10039FC4: using guessed type int dword_10039FC4;
  6736. // 10039FC8: using guessed type __int16 word_10039FC8;
  6737. // 10039FCA: using guessed type __int16 word_10039FCA;
  6738. // 10039FCC: using guessed type int dword_10039FCC;
  6739. // 10039FD0: using guessed type __int16 word_10039FD0;
  6740. // 10039FD2: using guessed type __int16 word_10039FD2;
  6741. // 10039FD4: using guessed type int dword_10039FD4;
  6742. // 10039FD8: using guessed type __int16 word_10039FD8;
  6743. // 10039FDA: using guessed type __int16 word_10039FDA;
  6744. // 10039FDC: using guessed type int dword_10039FDC;
  6745.  
  6746. //----- (1000B7A0) --------------------------------------------------------
  6747. signed __int16 sub_1000B7A0()
  6748. {
  6749.   int *v0; // ecx@1
  6750.   signed __int16 result; // ax@1
  6751.   int v2; // edx@2
  6752.   int v3; // esi@2
  6753.  
  6754.   dword_10039DEC = word_10039FD8 / 2;
  6755.   dword_10039DF0 = word_10039FDA / 2;
  6756.   v0 = dword_10039F10;
  6757.   dword_10039DF4 = dword_10039FDC / 2;
  6758.   result = 26;
  6759.   do
  6760.   {
  6761.     v2 = *((signed __int16 *)v0 + 1);
  6762.     v3 = *(signed __int16 *)v0 << 16;
  6763.     v0 += 2;
  6764.     --result;
  6765.     *(v0 - 2) = v3 + v2;
  6766.   }
  6767.   while ( result );
  6768.   return result;
  6769. }
  6770. // 10039DEC: using guessed type int dword_10039DEC;
  6771. // 10039DF0: using guessed type int dword_10039DF0;
  6772. // 10039DF4: using guessed type int dword_10039DF4;
  6773. // 10039F10: using guessed type int dword_10039F10[];
  6774. // 10039FD8: using guessed type __int16 word_10039FD8;
  6775. // 10039FDA: using guessed type __int16 word_10039FDA;
  6776. // 10039FDC: using guessed type int dword_10039FDC;
  6777.  
  6778. //----- (1000B800) --------------------------------------------------------
  6779. int __cdecl sub_1000B800(signed __int16 *a1, signed __int16 *a2)
  6780. {
  6781.   int v2; // ebx@1
  6782.   int v3; // esi@1
  6783.   int v4; // edx@1
  6784.   int v5; // eax@1
  6785.   bool v6; // sf@1
  6786.   int v7; // edx@1
  6787.   signed int v8; // eax@1
  6788.   int v9; // edx@3
  6789.   int v10; // ecx@3
  6790.   int v11; // esi@3
  6791.   int v12; // ecx@3
  6792.   signed int v13; // esi@3
  6793.   int v14; // ecx@5
  6794.   int v15; // ebp@5
  6795.   signed int v16; // edi@5
  6796.   int v17; // esi@7
  6797.   signed int v18; // eax@7
  6798.   signed int v19; // ebp@9
  6799.   int v20; // esi@9
  6800.   int v21; // eax@9
  6801.   int v22; // edi@11
  6802.   signed int v23; // eax@11
  6803.   int v24; // edi@13
  6804.   signed int v25; // eax@13
  6805.   int v26; // ebx@13
  6806.   int v27; // ebp@15
  6807.   int v28; // ebx@15
  6808.   signed int v29; // eax@15
  6809.   int v30; // ebx@15
  6810.   int v31; // ebp@17
  6811.   __int16 v32; // cx@17
  6812.   __int16 v33; // dx@17
  6813.   __int16 v34; // dx@25
  6814.   __int16 v35; // cx@25
  6815.   __int16 v36; // dx@33
  6816.   __int16 v37; // cx@33
  6817.   __int16 v38; // dx@41
  6818.   __int16 v39; // cx@41
  6819.   __int16 v40; // dx@49
  6820.   __int16 v41; // cx@49
  6821.   __int16 v42; // dx@57
  6822.   __int16 v43; // cx@57
  6823.   __int16 v44; // dx@65
  6824.   __int16 v45; // cx@65
  6825.   __int16 v46; // dx@73
  6826.   __int16 v47; // cx@73
  6827.   __int16 v48; // cx@89
  6828.   int result; // eax@91
  6829.   __int16 v50; // [esp+10h] [ebp-1Ch]@11
  6830.   __int16 v51; // [esp+18h] [ebp-14h]@7
  6831.  
  6832.   v2 = a1[2];
  6833.   v3 = a1[1];
  6834.   v4 = word_10039774 * v2 + word_10039772 * v3;
  6835.   v5 = word_10039770 * *a1;
  6836.   v6 = v5 + v4 < 0;
  6837.   v7 = v5 + v4;
  6838.   v8 = 128;
  6839.   if ( v6 )
  6840.     v8 = -128;
  6841.   v9 = (v8 + v7) >> 8;
  6842.   v10 = word_10039776 * *a1;
  6843.   v11 = word_1003977A * v2 + word_10039778 * v3;
  6844.   v6 = v11 + v10 < 0;
  6845.   v12 = v11 + v10;
  6846.   v13 = 128;
  6847.   if ( v6 )
  6848.     v13 = -128;
  6849.   v14 = (v13 + v12) >> 8;
  6850.   v15 = word_10039770 * *a2;
  6851.   v16 = 128;
  6852.   if ( v15 < 0 )
  6853.     v16 = -128;
  6854.   v17 = word_10039776 * *a2;
  6855.   v18 = 128;
  6856.   v51 = (v16 + v15) >> 8;
  6857.   if ( v17 < 0 )
  6858.     v18 = -128;
  6859.   v19 = 128;
  6860.   v20 = (v18 + v17) >> 8;
  6861.   v21 = word_10039772 * a2[1];
  6862.   if ( v21 < 0 )
  6863.     v19 = -128;
  6864.   v22 = word_10039778 * a2[1];
  6865.   v50 = (v19 + v21) >> 8;
  6866.   v23 = 128;
  6867.   if ( v22 < 0 )
  6868.     v23 = -128;
  6869.   v24 = (v23 + v22) >> 8;
  6870.   v25 = 128;
  6871.   v26 = word_10039774 * a2[2];
  6872.   if ( v26 < 0 )
  6873.     v25 = -128;
  6874.   v27 = word_1003977A * a2[2];
  6875.   v28 = v25 + v26;
  6876.   v29 = 128;
  6877.   v30 = v28 >> 8;
  6878.   if ( v27 < 0 )
  6879.     v29 = -128;
  6880.   *(_WORD *)(dword_1002A29C + 0x40000) = 0x7FFF;
  6881.   v31 = (v29 + v27) >> 8;
  6882.   *(_WORD *)(dword_1002A29C + 262146) = 0x7FFF;
  6883.   *(_WORD *)(dword_1002A29C + 262148) = -1;
  6884.   v32 = v20 + v14;
  6885.   v33 = v51 + v9;
  6886.   *(_WORD *)(dword_1002A29C + 262150) = -1;
  6887.   *(_WORD *)(dword_1002A29C + 262152) = 0;
  6888.   *(_WORD *)(dword_1002A29C + 262154) = 0;
  6889.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v33 )
  6890.     *(_WORD *)(dword_1002A29C + 0x40000) = v33;
  6891.   if ( *(_WORD *)(dword_1002A29C + 262148) < v33 )
  6892.     *(_WORD *)(dword_1002A29C + 262148) = v33;
  6893.   if ( *(_WORD *)(dword_1002A29C + 262146) > v32 )
  6894.     *(_WORD *)(dword_1002A29C + 262146) = v32;
  6895.   if ( *(_WORD *)(dword_1002A29C + 262150) < v32 )
  6896.     *(_WORD *)(dword_1002A29C + 262150) = v32;
  6897.   v34 = v50 + v33;
  6898.   v35 = v24 + v32;
  6899.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v34 )
  6900.     *(_WORD *)(dword_1002A29C + 0x40000) = v34;
  6901.   if ( *(_WORD *)(dword_1002A29C + 262148) < v34 )
  6902.     *(_WORD *)(dword_1002A29C + 262148) = v34;
  6903.   if ( *(_WORD *)(dword_1002A29C + 262146) > v35 )
  6904.     *(_WORD *)(dword_1002A29C + 262146) = v35;
  6905.   if ( *(_WORD *)(dword_1002A29C + 262150) < v35 )
  6906.     *(_WORD *)(dword_1002A29C + 262150) = v35;
  6907.   v36 = v34 - v51;
  6908.   v37 = v35 - v20;
  6909.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v36 )
  6910.     *(_WORD *)(dword_1002A29C + 0x40000) = v36;
  6911.   if ( *(_WORD *)(dword_1002A29C + 262148) < v36 )
  6912.     *(_WORD *)(dword_1002A29C + 262148) = v36;
  6913.   if ( *(_WORD *)(dword_1002A29C + 262146) > v37 )
  6914.     *(_WORD *)(dword_1002A29C + 262146) = v37;
  6915.   if ( *(_WORD *)(dword_1002A29C + 262150) < v37 )
  6916.     *(_WORD *)(dword_1002A29C + 262150) = v37;
  6917.   v38 = v36 - v50;
  6918.   v39 = v37 - v24;
  6919.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v38 )
  6920.     *(_WORD *)(dword_1002A29C + 0x40000) = v38;
  6921.   if ( *(_WORD *)(dword_1002A29C + 262148) < v38 )
  6922.     *(_WORD *)(dword_1002A29C + 262148) = v38;
  6923.   if ( *(_WORD *)(dword_1002A29C + 262146) > v39 )
  6924.     *(_WORD *)(dword_1002A29C + 262146) = v39;
  6925.   if ( *(_WORD *)(dword_1002A29C + 262150) < v39 )
  6926.     *(_WORD *)(dword_1002A29C + 262150) = v39;
  6927.   v40 = v30 + v38;
  6928.   v41 = v31 + v39;
  6929.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v40 )
  6930.     *(_WORD *)(dword_1002A29C + 0x40000) = v40;
  6931.   if ( *(_WORD *)(dword_1002A29C + 262148) < v40 )
  6932.     *(_WORD *)(dword_1002A29C + 262148) = v40;
  6933.   if ( *(_WORD *)(dword_1002A29C + 262146) > v41 )
  6934.     *(_WORD *)(dword_1002A29C + 262146) = v41;
  6935.   if ( *(_WORD *)(dword_1002A29C + 262150) < v41 )
  6936.     *(_WORD *)(dword_1002A29C + 262150) = v41;
  6937.   v42 = v51 + v40;
  6938.   v43 = v20 + v41;
  6939.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v42 )
  6940.     *(_WORD *)(dword_1002A29C + 0x40000) = v42;
  6941.   if ( *(_WORD *)(dword_1002A29C + 262148) < v42 )
  6942.     *(_WORD *)(dword_1002A29C + 262148) = v42;
  6943.   if ( *(_WORD *)(dword_1002A29C + 262146) > v43 )
  6944.     *(_WORD *)(dword_1002A29C + 262146) = v43;
  6945.   if ( *(_WORD *)(dword_1002A29C + 262150) < v43 )
  6946.     *(_WORD *)(dword_1002A29C + 262150) = v43;
  6947.   v44 = v50 + v42;
  6948.   v45 = v24 + v43;
  6949.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v44 )
  6950.     *(_WORD *)(dword_1002A29C + 0x40000) = v44;
  6951.   if ( *(_WORD *)(dword_1002A29C + 262148) < v44 )
  6952.     *(_WORD *)(dword_1002A29C + 262148) = v44;
  6953.   if ( *(_WORD *)(dword_1002A29C + 262146) > v45 )
  6954.     *(_WORD *)(dword_1002A29C + 262146) = v45;
  6955.   if ( *(_WORD *)(dword_1002A29C + 262150) < v45 )
  6956.     *(_WORD *)(dword_1002A29C + 262150) = v45;
  6957.   v46 = v44 - v51;
  6958.   v47 = v45 - v20;
  6959.   if ( *(_WORD *)(dword_1002A29C + 0x40000) > v46 )
  6960.     *(_WORD *)(dword_1002A29C + 0x40000) = v46;
  6961.   if ( *(_WORD *)(dword_1002A29C + 262148) < v46 )
  6962.     *(_WORD *)(dword_1002A29C + 262148) = v46;
  6963.   if ( *(_WORD *)(dword_1002A29C + 262146) > v47 )
  6964.     *(_WORD *)(dword_1002A29C + 262146) = v47;
  6965.   if ( *(_WORD *)(dword_1002A29C + 262150) < v47 )
  6966.     *(_WORD *)(dword_1002A29C + 262150) = v47;
  6967.   *(_WORD *)(dword_1002A29C + 0x40000) += 126;
  6968.   if ( *(_WORD *)(dword_1002A29C + 0x40000) < 0 )
  6969.     *(_WORD *)(dword_1002A29C + 0x40000) = 0;
  6970.   *(_WORD *)(dword_1002A29C + 262148) += 130;
  6971.   if ( *(_WORD *)(dword_1002A29C + 262148) > 255 )
  6972.     *(_WORD *)(dword_1002A29C + 262148) = 255;
  6973.   *(_WORD *)(dword_1002A29C + 262146) += 126;
  6974.   if ( *(_WORD *)(dword_1002A29C + 262146) < 0 )
  6975.     *(_WORD *)(dword_1002A29C + 262146) = 0;
  6976.   *(_WORD *)(dword_1002A29C + 262150) += 130;
  6977.   if ( *(_WORD *)(dword_1002A29C + 262150) > 255 )
  6978.     *(_WORD *)(dword_1002A29C + 262150) = 255;
  6979.   v48 = *(_WORD *)(dword_1002A29C + 262148);
  6980.   if ( v48 < 0 || *(_WORD *)(dword_1002A29C + 262150) < 0 )
  6981.   {
  6982.     *(_WORD *)(dword_1002A29C + 262152) = 0;
  6983.     result = dword_1002A29C;
  6984.     *(_WORD *)(dword_1002A29C + 262154) = 0;
  6985.   }
  6986.   else
  6987.   {
  6988.     *(_WORD *)(dword_1002A29C + 262152) = v48 - *(_WORD *)(dword_1002A29C + 0x40000) + 1;
  6989.     result = dword_1002A29C;
  6990.     *(_WORD *)(dword_1002A29C + 262154) = *(_WORD *)(dword_1002A29C + 262150) - *(_WORD *)(dword_1002A29C + 262146) + 1;
  6991.   }
  6992.   return result;
  6993. }
  6994. // 10039770: using guessed type __int16 word_10039770;
  6995. // 10039772: using guessed type __int16 word_10039772;
  6996. // 10039774: using guessed type __int16 word_10039774;
  6997. // 10039776: using guessed type __int16 word_10039776;
  6998. // 10039778: using guessed type __int16 word_10039778;
  6999. // 1003977A: using guessed type __int16 word_1003977A;
  7000.  
  7001. //----- (1000BD10) --------------------------------------------------------
  7002. int __cdecl sub_1000BD10(int a1, int a2)
  7003. {
  7004.   int v2; // ecx@1
  7005.   int v3; // edx@1
  7006.   char *v4; // edi@1
  7007.   signed int v5; // esi@1
  7008.   int v6; // eax@5
  7009.   int v7; // esi@5
  7010.   signed int v8; // edx@5
  7011.   int v9; // ecx@5
  7012.   int v10; // edi@5
  7013.   int v11; // ebx@5
  7014.   int v12; // ecx@6
  7015.   int v13; // ebp@6
  7016.   int v14; // ecx@6
  7017.   int v15; // ecx@6
  7018.   int v16; // ebx@9
  7019.   int result; // eax@9
  7020.   int v18; // [esp+10h] [ebp-8h]@5
  7021.   signed int v19; // [esp+14h] [ebp-4h]@0
  7022.  
  7023.   v2 = 0;
  7024.   v3 = 0;
  7025.   v4 = byte_1002A2D0;
  7026.   v5 = v19;
  7027.   do
  7028.   {
  7029.     if ( SHIWORD(dword_10039F10[2 * (unsigned __int8)*v4]) * SHIWORD(dword_10039F10[2 * (unsigned __int8)*v4])
  7030.        + SLOWORD(dword_10039F10[2 * (unsigned __int8)*v4]) * SLOWORD(dword_10039F10[2 * (unsigned __int8)*v4]) > v2 )
  7031.     {
  7032.       v2 = SHIWORD(dword_10039F10[2 * (unsigned __int8)*v4]) * SHIWORD(dword_10039F10[2 * (unsigned __int8)*v4])
  7033.          + SLOWORD(dword_10039F10[2 * (unsigned __int8)*v4]) * SLOWORD(dword_10039F10[2 * (unsigned __int8)*v4]);
  7034.       v5 = v3;
  7035.     }
  7036.     v4 += 3;
  7037.     ++v3;
  7038.   }
  7039.   while ( v4 < (char *)&unk_1002A2DC );
  7040.   v6 = 0;
  7041.   v7 = 3 * v5;
  7042.   v8 = 1;
  7043.   v9 = (unsigned __int8)byte_1002A2D0[v7];
  7044.   v10 = SHIWORD(dword_10039F10[2 * v9]);
  7045.   v11 = SLOWORD(dword_10039F10[2 * v9]);
  7046.   v18 = (unsigned __int8)byte_1002A2D0[v7];
  7047.   do
  7048.   {
  7049.     v12 = (unsigned __int8)byte_1002A2D0[v8 + v7];
  7050.     v13 = SHIWORD(dword_10039F10[2 * v12]);
  7051.     v14 = SLOWORD(dword_10039F10[2 * v12]) - v11;
  7052.     v15 = (v13 - v10) * (v13 - v10) + v14 * v14;
  7053.     if ( v15 > v6 )
  7054.     {
  7055.       v6 = v15;
  7056.       v19 = v8;
  7057.     }
  7058.     ++v8;
  7059.   }
  7060.   while ( v8 < 3 );
  7061.   v16 = (unsigned __int8)byte_1002A2D0[v7 + v19];
  7062.   dword_10039F00 = sub_1000BE60(a1, a2);
  7063.   dword_10039F04 = sub_1000BE60(a1 + SLOWORD(dword_10039F10[2 * v18]) / 2, a2 + SHIWORD(dword_10039F10[2 * v18]) / 2);
  7064.   result = sub_1000BE60(a1 + SLOWORD(dword_10039F10[2 * v16]) / 2, a2 + SHIWORD(dword_10039F10[2 * v16]) / 2);
  7065.   dword_10039FE0 = result;
  7066.   return result;
  7067. }
  7068. // 10039F00: using guessed type int dword_10039F00;
  7069. // 10039F04: using guessed type int dword_10039F04;
  7070. // 10039F10: using guessed type int dword_10039F10[];
  7071. // 10039FE0: using guessed type int dword_10039FE0;
  7072.  
  7073. //----- (1000BE60) --------------------------------------------------------
  7074. int __cdecl sub_1000BE60(int a1, int a2)
  7075. {
  7076.   return a2 | (a1 << 16);
  7077. }
  7078.  
  7079. //----- (1000BE70) --------------------------------------------------------
  7080. unsigned int __cdecl sub_1000BE70(int a1, int a2)
  7081. {
  7082.   _WORD *v2; // edi@1
  7083.   _WORD *v3; // edx@1
  7084.   int v4; // ecx@1
  7085.   unsigned int *v5; // esi@1
  7086.   unsigned int result; // eax@1
  7087.   int v7; // ecx@1
  7088.   int v8; // ebp@1
  7089.   int v9; // [esp+0h] [ebp-2Ch]@1
  7090.   int v10; // [esp+4h] [ebp-28h]@1
  7091.   int v11; // [esp+8h] [ebp-24h]@1
  7092.   int v12; // [esp+Ch] [ebp-20h]@1
  7093.   int v13; // [esp+10h] [ebp-1Ch]@1
  7094.  
  7095.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7096.   v3 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  7097.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7098.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7099.   v5 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7100.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7101.                       + dword_1002A29C);
  7102.   v12 = 2 * (dword_1002A2A8 - v4);
  7103.   v11 = 2 * (dword_1002A2A8 - v4);
  7104.   result = 4 * (256 - v4);
  7105.   v10 = 4 * (256 - v4);
  7106.   v7 = v4 + 1;
  7107.   v9 = v7;
  7108.   v8 = dword_1002A2B0;
  7109.   while ( 1 )
  7110.   {
  7111.     while ( --v7 )
  7112.     {
  7113.       ++v2;
  7114.       ++v3;
  7115.       result = *v5;
  7116.       *v5 = 0xFFFF;
  7117.       ++v5;
  7118.       if ( (_WORD)result != -1 && *v2 > (unsigned __int16)result )
  7119.       {
  7120.         *v2 = result;
  7121.         result >>= 16;
  7122.         LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  7123.         *v3 = result;
  7124.       }
  7125.     }
  7126.     if ( !--v13 )
  7127.       break;
  7128.     v7 = v9;
  7129.     v5 = (unsigned int *)((char *)v5 + v10);
  7130.     v2 = (_WORD *)((char *)v2 + v11);
  7131.     v3 = (_WORD *)((char *)v3 + v12);
  7132.   }
  7133.   return result;
  7134. }
  7135. // 1002A2A0: using guessed type int dword_1002A2A0;
  7136. // 1002A2A4: using guessed type int dword_1002A2A4;
  7137. // 1002A2A8: using guessed type int dword_1002A2A8;
  7138. // 1002A2B0: using guessed type int dword_1002A2B0;
  7139.  
  7140. //----- (1000BF58) --------------------------------------------------------
  7141. int __cdecl sub_1000BF58(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  7142. {
  7143.   _WORD *v5; // edi@1
  7144.   _DWORD *v6; // esi@1
  7145.   int v7; // ecx@1
  7146.   unsigned int v8; // edx@1
  7147.   unsigned int v9; // edx@1
  7148.   _WORD *v10; // ebp@1
  7149.   int v11; // ebx@1
  7150.   int result; // eax@1
  7151.   _DWORD *i; // esi@1
  7152.   unsigned __int8 v14; // cf@3
  7153.   _DWORD *v15; // esi@9
  7154.   unsigned int v16; // edx@9
  7155.   _DWORD *v17; // [esp+4h] [ebp-24h]@1
  7156.   int v18; // [esp+8h] [ebp-20h]@1
  7157.   int v19; // [esp+Ch] [ebp-1Ch]@1
  7158.  
  7159.   v5 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7160.   v6 = (_DWORD *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7161.                 + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7162.                 + dword_1002A29C);
  7163.   v19 = 2 * (dword_1002A2A8 - a3);
  7164.   v18 = 2 * (dword_1002A2A8 - a3);
  7165.   v17 = v6;
  7166.   v7 = a3 + 1;
  7167.   v8 = a5;
  7168.   BYTE1(v8) = byte_1002A2C0;
  7169.   v9 = _byteswap_ulong(v8);
  7170.   LOBYTE(v9) = a5;
  7171.   BYTE1(v9) = byte_1002A2BC;
  7172.   v10 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  7173.   v11 = *v6;
  7174.   result = __ROL4__(*v6, 16);
  7175.   for ( i = v6 + 1; ; i = v15 + 1 )
  7176.   {
  7177.     while ( --v7 )
  7178.     {
  7179.       ++v10;
  7180.       ++v5;
  7181.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  7182.       BYTE1(v9) += v9;
  7183.       if ( v14 )
  7184.       {
  7185.         v11 = *i;
  7186.         result = __ROL4__(*i, 16);
  7187.         ++i;
  7188.       }
  7189.       if ( (_WORD)v11 != -1 && *v5 > (unsigned __int16)v11 )
  7190.       {
  7191.         *v5 = v11;
  7192.         *v10 = result;
  7193.       }
  7194.     }
  7195.     if ( !--a4 )
  7196.       break;
  7197.     v16 = _byteswap_ulong(v9);
  7198.     v7 = a3 + 1;
  7199.     v15 = v17;
  7200.     v5 = (_WORD *)((char *)v5 + v18);
  7201.     v10 = (_WORD *)((char *)v10 + v19);
  7202.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  7203.     BYTE1(v16) += v16;
  7204.     if ( v14 )
  7205.     {
  7206.       v15 = v17 + 256;
  7207.       v17 += 256;
  7208.     }
  7209.     v9 = _byteswap_ulong(v16);
  7210.     BYTE1(v9) = byte_1002A2BC;
  7211.     v11 = *v15;
  7212.     result = __ROL4__(*v15, 16);
  7213.   }
  7214.   return result;
  7215. }
  7216. // 1002A2A0: using guessed type int dword_1002A2A0;
  7217. // 1002A2A4: using guessed type int dword_1002A2A4;
  7218. // 1002A2A8: using guessed type int dword_1002A2A8;
  7219. // 1002A2BC: using guessed type char byte_1002A2BC;
  7220. // 1002A2C0: using guessed type char byte_1002A2C0;
  7221.  
  7222. //----- (1000C05D) --------------------------------------------------------
  7223. unsigned int __cdecl sub_1000C05D(int a1, int a2)
  7224. {
  7225.   int v2; // ecx@1
  7226.   unsigned int *v3; // esi@1
  7227.   unsigned int result; // eax@1
  7228.   int v5; // ecx@1
  7229.   int v6; // ebp@1
  7230.   _WORD *v7; // edx@1
  7231.   unsigned __int16 *v8; // edi@1
  7232.   unsigned __int16 v9; // bx@4
  7233.   unsigned __int16 *v10; // edi@8
  7234.   _WORD *v11; // edx@8
  7235.   int v12; // [esp+0h] [ebp-2Ch]@1
  7236.   int v13; // [esp+4h] [ebp-28h]@1
  7237.   int v14; // [esp+8h] [ebp-24h]@1
  7238.   int v15; // [esp+Ch] [ebp-20h]@1
  7239.   int v16; // [esp+10h] [ebp-1Ch]@1
  7240.  
  7241.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7242.   v16 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7243.   v3 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7244.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7245.                       + dword_1002A29C);
  7246.   v15 = 4 * (dword_1002A2A8 - v2);
  7247.   v14 = 4 * (dword_1002A2A8 - v2);
  7248.   result = 4 * (256 - v2);
  7249.   v13 = 4 * (256 - v2);
  7250.   v5 = v2 + 1;
  7251.   v12 = v5;
  7252.   v6 = dword_1002A2B0;
  7253.   v7 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A4 - 4);
  7254.   v8 = (unsigned __int16 *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  7255.   while ( 1 )
  7256.   {
  7257.     while ( --v5 )
  7258.     {
  7259.       v7 += 2;
  7260.       v8 += 2;
  7261.       result = *v3;
  7262.       *v3 = 0xFFFF;
  7263.       ++v3;
  7264.       if ( (_WORD)result != -1 )
  7265.       {
  7266.         v9 = result;
  7267.         result >>= 16;
  7268.         LOWORD(result) = *(_WORD *)(v6 + 2 * result);
  7269.         if ( *v8 > v9 )
  7270.         {
  7271.           *v8 = v9;
  7272.           *v7 = result;
  7273.         }
  7274.         if ( v8[1] > v9 )
  7275.         {
  7276.           v8[1] = v9;
  7277.           v7[1] = result;
  7278.         }
  7279.         v10 = (unsigned __int16 *)((char *)v8 + dword_1002A2AC);
  7280.         v11 = (_WORD *)((char *)v7 + dword_1002A2AC);
  7281.         if ( *v10 > v9 )
  7282.         {
  7283.           *v10 = v9;
  7284.           *v11 = result;
  7285.         }
  7286.         if ( v10[1] > v9 )
  7287.         {
  7288.           v10[1] = v9;
  7289.           v11[1] = result;
  7290.         }
  7291.         v8 = (unsigned __int16 *)((char *)v10 - dword_1002A2AC);
  7292.         v7 = (_WORD *)((char *)v11 - dword_1002A2AC);
  7293.       }
  7294.     }
  7295.     if ( !--v16 )
  7296.       break;
  7297.     v5 = v12;
  7298.     v3 = (unsigned int *)((char *)v3 + v13);
  7299.     v8 = (unsigned __int16 *)((char *)v8 + v14);
  7300.     v7 = (_WORD *)((char *)v7 + v15);
  7301.   }
  7302.   return result;
  7303. }
  7304. // 1002A2A0: using guessed type int dword_1002A2A0;
  7305. // 1002A2A4: using guessed type int dword_1002A2A4;
  7306. // 1002A2A8: using guessed type int dword_1002A2A8;
  7307. // 1002A2AC: using guessed type int dword_1002A2AC;
  7308. // 1002A2B0: using guessed type int dword_1002A2B0;
  7309.  
  7310. //----- (1000C18E) --------------------------------------------------------
  7311. int __cdecl sub_1000C18E(int a1, int a2)
  7312. {
  7313.   _WORD *v2; // edi@1
  7314.   _WORD *v3; // edx@1
  7315.   int v4; // ecx@1
  7316.   int *v5; // esi@1
  7317.   int result; // eax@1
  7318.   int v7; // ecx@1
  7319.   int v8; // ebp@1
  7320.   int v9; // [esp+0h] [ebp-2Ch]@1
  7321.   int v10; // [esp+4h] [ebp-28h]@1
  7322.   int v11; // [esp+8h] [ebp-24h]@1
  7323.   int v12; // [esp+Ch] [ebp-20h]@1
  7324.   int v13; // [esp+10h] [ebp-1Ch]@1
  7325.  
  7326.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7327.   v3 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  7328.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7329.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7330.   v5 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7331.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7332.              + dword_1002A29C);
  7333.   v12 = 2 * (dword_1002A2A8 - v4);
  7334.   v11 = 2 * (dword_1002A2A8 - v4);
  7335.   result = 4 * (256 - v4);
  7336.   v10 = 4 * (256 - v4);
  7337.   v7 = v4 + 1;
  7338.   v9 = v7;
  7339.   v8 = dword_1002A2B4;
  7340.   while ( 1 )
  7341.   {
  7342.     while ( --v7 )
  7343.     {
  7344.       ++v2;
  7345.       ++v3;
  7346.       result = *v5;
  7347.       *v5 = 0xFFFF;
  7348.       ++v5;
  7349.       if ( (_WORD)result != -1 && *v2 > 0xFFFEu )
  7350.       {
  7351.         *v2 = -2;
  7352.         result = (unsigned __int16)*v3;
  7353.         LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  7354.         *v3 = result;
  7355.       }
  7356.     }
  7357.     if ( !--v13 )
  7358.       break;
  7359.     v7 = v9;
  7360.     v5 = (int *)((char *)v5 + v10);
  7361.     v2 = (_WORD *)((char *)v2 + v11);
  7362.     v3 = (_WORD *)((char *)v3 + v12);
  7363.   }
  7364.   return result;
  7365. }
  7366. // 1002A2A0: using guessed type int dword_1002A2A0;
  7367. // 1002A2A4: using guessed type int dword_1002A2A4;
  7368. // 1002A2A8: using guessed type int dword_1002A2A8;
  7369. // 1002A2B4: using guessed type int dword_1002A2B4;
  7370.  
  7371. //----- (1000C27D) --------------------------------------------------------
  7372. _WORD *__cdecl sub_1000C27D(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  7373. {
  7374.   _WORD *v5; // edi@1
  7375.   _WORD **v6; // esi@1
  7376.   int v7; // ecx@1
  7377.   unsigned int v8; // edx@1
  7378.   unsigned int v9; // edx@1
  7379.   _WORD *v10; // ebp@1
  7380.   _WORD *result; // eax@1
  7381.   int v12; // ebx@1
  7382.   _WORD **i; // esi@1
  7383.   unsigned __int8 v14; // cf@3
  7384.   _WORD **v15; // esi@9
  7385.   unsigned int v16; // edx@9
  7386.   _WORD **v17; // [esp+4h] [ebp-24h]@1
  7387.   int v18; // [esp+8h] [ebp-20h]@1
  7388.   int v19; // [esp+Ch] [ebp-1Ch]@1
  7389.  
  7390.   v5 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7391.   v6 = (_WORD **)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7392.                 + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7393.                 + dword_1002A29C);
  7394.   v19 = 2 * (dword_1002A2A8 - a3);
  7395.   v18 = 2 * (dword_1002A2A8 - a3);
  7396.   v17 = v6;
  7397.   v7 = a3 + 1;
  7398.   v8 = a5;
  7399.   BYTE1(v8) = byte_1002A2C0;
  7400.   v9 = _byteswap_ulong(v8);
  7401.   LOBYTE(v9) = a5;
  7402.   BYTE1(v9) = byte_1002A2BC;
  7403.   v10 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  7404.   result = *v6;
  7405.   v12 = dword_1002A2B4;
  7406.   for ( i = v6 + 1; ; i = v15 + 1 )
  7407.   {
  7408.     while ( --v7 )
  7409.     {
  7410.       ++v10;
  7411.       ++v5;
  7412.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  7413.       BYTE1(v9) += v9;
  7414.       if ( v14 )
  7415.       {
  7416.         result = *i;
  7417.         ++i;
  7418.       }
  7419.       if ( (_WORD)result != -1 )
  7420.       {
  7421.         result = (_WORD *)65534;
  7422.         if ( *v5 > 0xFFFEu )
  7423.         {
  7424.           *v5 = -2;
  7425.           result = (_WORD *)(v12 + 2 * (unsigned __int16)*v10);
  7426.           LOWORD(result) = *result;
  7427.           *v10 = (_WORD)result;
  7428.         }
  7429.       }
  7430.     }
  7431.     if ( !--a4 )
  7432.       break;
  7433.     v16 = _byteswap_ulong(v9);
  7434.     v7 = a3 + 1;
  7435.     v15 = v17;
  7436.     v5 = (_WORD *)((char *)v5 + v18);
  7437.     v10 = (_WORD *)((char *)v10 + v19);
  7438.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  7439.     BYTE1(v16) += v16;
  7440.     if ( v14 )
  7441.     {
  7442.       v15 = v17 + 256;
  7443.       v17 += 256;
  7444.     }
  7445.     v9 = _byteswap_ulong(v16);
  7446.     BYTE1(v9) = byte_1002A2BC;
  7447.     result = *v15;
  7448.   }
  7449.   return result;
  7450. }
  7451. // 1002A2A0: using guessed type int dword_1002A2A0;
  7452. // 1002A2A4: using guessed type int dword_1002A2A4;
  7453. // 1002A2A8: using guessed type int dword_1002A2A8;
  7454. // 1002A2B4: using guessed type int dword_1002A2B4;
  7455. // 1002A2BC: using guessed type char byte_1002A2BC;
  7456. // 1002A2C0: using guessed type char byte_1002A2C0;
  7457.  
  7458. //----- (1000C38C) --------------------------------------------------------
  7459. int __cdecl sub_1000C38C(int a1, int a2)
  7460. {
  7461.   int v2; // ecx@1
  7462.   int *v3; // esi@1
  7463.   int result; // eax@1
  7464.   int v5; // ecx@1
  7465.   _WORD *v6; // edx@1
  7466.   _WORD *v7; // edi@1
  7467.   int v8; // ebp@1
  7468.   _WORD *v9; // edi@8
  7469.   _WORD *v10; // edx@8
  7470.   int v11; // [esp+0h] [ebp-2Ch]@1
  7471.   int v12; // [esp+4h] [ebp-28h]@1
  7472.   int v13; // [esp+8h] [ebp-24h]@1
  7473.   int v14; // [esp+Ch] [ebp-20h]@1
  7474.   int v15; // [esp+10h] [ebp-1Ch]@1
  7475.  
  7476.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7477.   v15 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7478.   v3 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7479.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7480.              + dword_1002A29C);
  7481.   v14 = 4 * (dword_1002A2A8 - v2);
  7482.   v13 = 4 * (dword_1002A2A8 - v2);
  7483.   result = 4 * (256 - v2);
  7484.   v12 = 4 * (256 - v2);
  7485.   v5 = v2 + 1;
  7486.   v11 = v5;
  7487.   v6 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A4 - 4);
  7488.   v7 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  7489.   v8 = dword_1002A2B4;
  7490.   while ( 1 )
  7491.   {
  7492.     while ( --v5 )
  7493.     {
  7494.       v6 += 2;
  7495.       v7 += 2;
  7496.       result = *v3;
  7497.       *v3 = 0xFFFF;
  7498.       ++v3;
  7499.       if ( (_WORD)result != -1 )
  7500.       {
  7501.         result = 0;
  7502.         if ( *v7 > 0xFFFEu )
  7503.         {
  7504.           *v7 = -2;
  7505.           LOWORD(result) = *v6;
  7506.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  7507.           *v6 = result;
  7508.         }
  7509.         if ( v7[1] > 0xFFFEu )
  7510.         {
  7511.           v7[1] = -2;
  7512.           LOWORD(result) = v6[1];
  7513.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  7514.           v6[1] = result;
  7515.         }
  7516.         v9 = (_WORD *)((char *)v7 + dword_1002A2AC);
  7517.         v10 = (_WORD *)((char *)v6 + dword_1002A2AC);
  7518.         if ( *v9 > 0xFFFEu )
  7519.         {
  7520.           *v9 = -2;
  7521.           LOWORD(result) = *v10;
  7522.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  7523.           *v10 = result;
  7524.         }
  7525.         if ( v9[1] > 0xFFFEu )
  7526.         {
  7527.           v9[1] = -2;
  7528.           LOWORD(result) = v10[1];
  7529.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  7530.           v10[1] = result;
  7531.         }
  7532.         v7 = (_WORD *)((char *)v9 - dword_1002A2AC);
  7533.         v6 = (_WORD *)((char *)v10 - dword_1002A2AC);
  7534.       }
  7535.     }
  7536.     if ( !--v15 )
  7537.       break;
  7538.     v5 = v11;
  7539.     v3 = (int *)((char *)v3 + v12);
  7540.     v7 = (_WORD *)((char *)v7 + v13);
  7541.     v6 = (_WORD *)((char *)v6 + v14);
  7542.   }
  7543.   return result;
  7544. }
  7545. // 1002A2A0: using guessed type int dword_1002A2A0;
  7546. // 1002A2A4: using guessed type int dword_1002A2A4;
  7547. // 1002A2A8: using guessed type int dword_1002A2A8;
  7548. // 1002A2AC: using guessed type int dword_1002A2AC;
  7549. // 1002A2B4: using guessed type int dword_1002A2B4;
  7550.  
  7551. //----- (1000C4F0) --------------------------------------------------------
  7552. unsigned int __cdecl sub_1000C4F0(int a1, int a2)
  7553. {
  7554.   _WORD *v2; // edi@1
  7555.   _BYTE *v3; // edx@1
  7556.   int v4; // ecx@1
  7557.   unsigned int *v5; // esi@1
  7558.   unsigned int result; // eax@1
  7559.   int v7; // ecx@1
  7560.   int v8; // ebp@1
  7561.   int v9; // [esp+0h] [ebp-2Ch]@1
  7562.   int v10; // [esp+4h] [ebp-28h]@1
  7563.   int v11; // [esp+8h] [ebp-24h]@1
  7564.   int v12; // [esp+Ch] [ebp-20h]@1
  7565.   int v13; // [esp+10h] [ebp-1Ch]@1
  7566.  
  7567.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7568.   v3 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  7569.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7570.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7571.   v5 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7572.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7573.                       + dword_1002A29C);
  7574.   v12 = dword_1002A2A8 - v4;
  7575.   v11 = 2 * (dword_1002A2A8 - v4);
  7576.   result = 4 * (256 - v4);
  7577.   v10 = 4 * (256 - v4);
  7578.   v7 = v4 + 1;
  7579.   v9 = v7;
  7580.   v8 = dword_1002A2B0;
  7581.   while ( 1 )
  7582.   {
  7583.     while ( --v7 )
  7584.     {
  7585.       ++v2;
  7586.       ++v3;
  7587.       result = *v5;
  7588.       *v5 = 0xFFFF;
  7589.       ++v5;
  7590.       if ( (_WORD)result != -1 && *v2 > (unsigned __int16)result )
  7591.       {
  7592.         *v2 = result;
  7593.         result >>= 16;
  7594.         LOBYTE(result) = *(_BYTE *)(result + v8);
  7595.         *v3 = result;
  7596.       }
  7597.     }
  7598.     if ( !--v13 )
  7599.       break;
  7600.     v7 = v9;
  7601.     v5 = (unsigned int *)((char *)v5 + v10);
  7602.     v2 = (_WORD *)((char *)v2 + v11);
  7603.     v3 += v12;
  7604.   }
  7605.   return result;
  7606. }
  7607. // 1002A2A0: using guessed type int dword_1002A2A0;
  7608. // 1002A2A4: using guessed type int dword_1002A2A4;
  7609. // 1002A2A8: using guessed type int dword_1002A2A8;
  7610. // 1002A2B0: using guessed type int dword_1002A2B0;
  7611.  
  7612. //----- (1000C5D0) --------------------------------------------------------
  7613. unsigned int __cdecl sub_1000C5D0(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  7614. {
  7615.   _WORD *v5; // edi@1
  7616.   int *v6; // esi@1
  7617.   int v7; // ecx@1
  7618.   unsigned int v8; // edx@1
  7619.   unsigned int v9; // edx@1
  7620.   _BYTE *v10; // ebp@1
  7621.   int v11; // ebx@1
  7622.   unsigned int result; // eax@1
  7623.   int *i; // esi@1
  7624.   unsigned __int8 v14; // cf@3
  7625.   int *v15; // esi@9
  7626.   unsigned int v16; // edx@9
  7627.   int *v17; // [esp+4h] [ebp-24h]@1
  7628.   int v18; // [esp+8h] [ebp-20h]@1
  7629.   int v19; // [esp+Ch] [ebp-1Ch]@1
  7630.  
  7631.   v5 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7632.   v6 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7633.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7634.              + dword_1002A29C);
  7635.   v19 = dword_1002A2A8 - a3;
  7636.   v18 = 2 * (dword_1002A2A8 - a3);
  7637.   v17 = v6;
  7638.   v7 = a3 + 1;
  7639.   v8 = a5;
  7640.   BYTE1(v8) = byte_1002A2C0;
  7641.   v9 = _byteswap_ulong(v8);
  7642.   LOBYTE(v9) = a5;
  7643.   BYTE1(v9) = byte_1002A2BC;
  7644.   v10 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  7645.   v11 = *v6;
  7646.   result = (unsigned int)*v6 >> 8;
  7647.   for ( i = v6 + 1; ; i = v15 + 1 )
  7648.   {
  7649.     while ( --v7 )
  7650.     {
  7651.       ++v10;
  7652.       ++v5;
  7653.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  7654.       BYTE1(v9) += v9;
  7655.       if ( v14 )
  7656.       {
  7657.         v11 = *i;
  7658.         result = (unsigned int)*i >> 8;
  7659.         ++i;
  7660.       }
  7661.       if ( (_WORD)v11 != -1 && *v5 > (unsigned __int16)v11 )
  7662.       {
  7663.         *v5 = v11;
  7664.         *v10 = BYTE1(result);
  7665.       }
  7666.     }
  7667.     if ( !--a4 )
  7668.       break;
  7669.     v16 = _byteswap_ulong(v9);
  7670.     v7 = a3 + 1;
  7671.     v15 = v17;
  7672.     v5 = (_WORD *)((char *)v5 + v18);
  7673.     v10 += v19;
  7674.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  7675.     BYTE1(v16) += v16;
  7676.     if ( v14 )
  7677.     {
  7678.       v15 = v17 + 256;
  7679.       v17 += 256;
  7680.     }
  7681.     v9 = _byteswap_ulong(v16);
  7682.     BYTE1(v9) = byte_1002A2BC;
  7683.     v11 = *v15;
  7684.     result = (unsigned int)*v15 >> 8;
  7685.   }
  7686.   return result;
  7687. }
  7688. // 1002A2A0: using guessed type int dword_1002A2A0;
  7689. // 1002A2A4: using guessed type int dword_1002A2A4;
  7690. // 1002A2A8: using guessed type int dword_1002A2A8;
  7691. // 1002A2BC: using guessed type char byte_1002A2BC;
  7692. // 1002A2C0: using guessed type char byte_1002A2C0;
  7693.  
  7694. //----- (1000C6D0) --------------------------------------------------------
  7695. unsigned int __cdecl sub_1000C6D0(int a1, int a2)
  7696. {
  7697.   int v2; // ecx@1
  7698.   unsigned int *v3; // esi@1
  7699.   unsigned int result; // eax@1
  7700.   int v5; // ecx@1
  7701.   int v6; // ebp@1
  7702.   _BYTE *v7; // edx@1
  7703.   unsigned __int16 *v8; // edi@1
  7704.   unsigned __int16 v9; // bx@4
  7705.   unsigned __int16 *v10; // edi@8
  7706.   _BYTE *v11; // edx@8
  7707.   int v12; // [esp+0h] [ebp-2Ch]@1
  7708.   int v13; // [esp+4h] [ebp-28h]@1
  7709.   int v14; // [esp+8h] [ebp-24h]@1
  7710.   int v15; // [esp+Ch] [ebp-20h]@1
  7711.   int v16; // [esp+10h] [ebp-1Ch]@1
  7712.  
  7713.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7714.   v16 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7715.   v3 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7716.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7717.                       + dword_1002A29C);
  7718.   v15 = 2 * (dword_1002A2A8 - v2);
  7719.   v14 = 4 * (dword_1002A2A8 - v2);
  7720.   result = 4 * (256 - v2);
  7721.   v13 = 4 * (256 - v2);
  7722.   v5 = v2 + 1;
  7723.   v12 = v5;
  7724.   v6 = dword_1002A2B0;
  7725.   v7 = (_BYTE *)(a1 + a2 * dword_1002A2A8 + dword_1002A2A4 - 2);
  7726.   v8 = (unsigned __int16 *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  7727.   while ( 1 )
  7728.   {
  7729.     while ( --v5 )
  7730.     {
  7731.       v7 += 2;
  7732.       v8 += 2;
  7733.       result = *v3;
  7734.       *v3 = 0xFFFF;
  7735.       ++v3;
  7736.       if ( (_WORD)result != -1 )
  7737.       {
  7738.         v9 = result;
  7739.         result >>= 16;
  7740.         LOBYTE(result) = *(_BYTE *)(result + v6);
  7741.         if ( *v8 > v9 )
  7742.         {
  7743.           *v8 = v9;
  7744.           *v7 = result;
  7745.         }
  7746.         if ( v8[1] > v9 )
  7747.         {
  7748.           v8[1] = v9;
  7749.           v7[1] = result;
  7750.         }
  7751.         v10 = (unsigned __int16 *)((char *)v8 + dword_1002A2AC);
  7752.         v11 = &v7[dword_1002A2A8];
  7753.         if ( *v10 > v9 )
  7754.         {
  7755.           *v10 = v9;
  7756.           *v11 = result;
  7757.         }
  7758.         if ( v10[1] > v9 )
  7759.         {
  7760.           v10[1] = v9;
  7761.           v11[1] = result;
  7762.         }
  7763.         v8 = (unsigned __int16 *)((char *)v10 - dword_1002A2AC);
  7764.         v7 = &v11[-dword_1002A2A8];
  7765.       }
  7766.     }
  7767.     if ( !--v16 )
  7768.       break;
  7769.     v5 = v12;
  7770.     v3 = (unsigned int *)((char *)v3 + v13);
  7771.     v8 = (unsigned __int16 *)((char *)v8 + v14);
  7772.     v7 += v15;
  7773.   }
  7774.   return result;
  7775. }
  7776. // 1002A2A0: using guessed type int dword_1002A2A0;
  7777. // 1002A2A4: using guessed type int dword_1002A2A4;
  7778. // 1002A2A8: using guessed type int dword_1002A2A8;
  7779. // 1002A2AC: using guessed type int dword_1002A2AC;
  7780. // 1002A2B0: using guessed type int dword_1002A2B0;
  7781.  
  7782. //----- (1000C7F9) --------------------------------------------------------
  7783. int __cdecl sub_1000C7F9(int a1, int a2)
  7784. {
  7785.   _WORD *v2; // edi@1
  7786.   _BYTE *v3; // edx@1
  7787.   int v4; // ecx@1
  7788.   int *v5; // esi@1
  7789.   int result; // eax@1
  7790.   int v7; // ecx@1
  7791.   int v8; // ebp@1
  7792.   int v9; // [esp+0h] [ebp-2Ch]@1
  7793.   int v10; // [esp+4h] [ebp-28h]@1
  7794.   int v11; // [esp+8h] [ebp-24h]@1
  7795.   int v12; // [esp+Ch] [ebp-20h]@1
  7796.   int v13; // [esp+10h] [ebp-1Ch]@1
  7797.  
  7798.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7799.   v3 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  7800.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7801.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7802.   v5 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7803.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7804.              + dword_1002A29C);
  7805.   v12 = dword_1002A2A8 - v4;
  7806.   v11 = 2 * (dword_1002A2A8 - v4);
  7807.   result = 4 * (256 - v4);
  7808.   v10 = 4 * (256 - v4);
  7809.   v7 = v4 + 1;
  7810.   v9 = v7;
  7811.   v8 = dword_1002A2B4;
  7812.   while ( 1 )
  7813.   {
  7814.     while ( --v7 )
  7815.     {
  7816.       ++v2;
  7817.       ++v3;
  7818.       result = *v5;
  7819.       *v5 = 0xFFFF;
  7820.       ++v5;
  7821.       if ( (_WORD)result != -1 && *v2 > 0xFFFEu )
  7822.       {
  7823.         *v2 = -2;
  7824.         result = (unsigned __int8)*v3;
  7825.         LOBYTE(result) = *(_BYTE *)(result + v8);
  7826.         *v3 = result;
  7827.       }
  7828.     }
  7829.     if ( !--v13 )
  7830.       break;
  7831.     v7 = v9;
  7832.     v5 = (int *)((char *)v5 + v10);
  7833.     v2 = (_WORD *)((char *)v2 + v11);
  7834.     v3 += v12;
  7835.   }
  7836.   return result;
  7837. }
  7838. // 1002A2A0: using guessed type int dword_1002A2A0;
  7839. // 1002A2A4: using guessed type int dword_1002A2A4;
  7840. // 1002A2A8: using guessed type int dword_1002A2A8;
  7841. // 1002A2B4: using guessed type int dword_1002A2B4;
  7842.  
  7843. //----- (1000C8DF) --------------------------------------------------------
  7844. _BYTE *__cdecl sub_1000C8DF(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  7845. {
  7846.   _WORD *v5; // edi@1
  7847.   _BYTE **v6; // esi@1
  7848.   int v7; // ecx@1
  7849.   unsigned int v8; // edx@1
  7850.   unsigned int v9; // edx@1
  7851.   _BYTE *v10; // ebp@1
  7852.   _BYTE *result; // eax@1
  7853.   int v12; // ebx@1
  7854.   _BYTE **i; // esi@1
  7855.   unsigned __int8 v14; // cf@3
  7856.   _BYTE **v15; // esi@9
  7857.   unsigned int v16; // edx@9
  7858.   _BYTE **v17; // [esp+4h] [ebp-24h]@1
  7859.   int v18; // [esp+8h] [ebp-20h]@1
  7860.   int v19; // [esp+Ch] [ebp-1Ch]@1
  7861.  
  7862.   v5 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  7863.   v6 = (_BYTE **)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7864.                 + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7865.                 + dword_1002A29C);
  7866.   v19 = dword_1002A2A8 - a3;
  7867.   v18 = 2 * (dword_1002A2A8 - a3);
  7868.   v17 = v6;
  7869.   v7 = a3 + 1;
  7870.   v8 = a5;
  7871.   BYTE1(v8) = byte_1002A2C0;
  7872.   v9 = _byteswap_ulong(v8);
  7873.   LOBYTE(v9) = a5;
  7874.   BYTE1(v9) = byte_1002A2BC;
  7875.   v10 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  7876.   result = *v6;
  7877.   v12 = dword_1002A2B4;
  7878.   for ( i = v6 + 1; ; i = v15 + 1 )
  7879.   {
  7880.     while ( --v7 )
  7881.     {
  7882.       ++v10;
  7883.       ++v5;
  7884.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  7885.       BYTE1(v9) += v9;
  7886.       if ( v14 )
  7887.       {
  7888.         result = *i;
  7889.         ++i;
  7890.       }
  7891.       if ( (_WORD)result != -1 )
  7892.       {
  7893.         result = (_BYTE *)65534;
  7894.         if ( *v5 > 0xFFFEu )
  7895.         {
  7896.           *v5 = -2;
  7897.           result = (_BYTE *)(v12 + (unsigned __int8)*v10);
  7898.           LOBYTE(result) = *result;
  7899.           *v10 = (_BYTE)result;
  7900.         }
  7901.       }
  7902.     }
  7903.     if ( !--a4 )
  7904.       break;
  7905.     v16 = _byteswap_ulong(v9);
  7906.     v7 = a3 + 1;
  7907.     v15 = v17;
  7908.     v5 = (_WORD *)((char *)v5 + v18);
  7909.     v10 += v19;
  7910.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  7911.     BYTE1(v16) += v16;
  7912.     if ( v14 )
  7913.     {
  7914.       v15 = v17 + 256;
  7915.       v17 += 256;
  7916.     }
  7917.     v9 = _byteswap_ulong(v16);
  7918.     BYTE1(v9) = byte_1002A2BC;
  7919.     result = *v15;
  7920.   }
  7921.   return result;
  7922. }
  7923. // 1002A2A0: using guessed type int dword_1002A2A0;
  7924. // 1002A2A4: using guessed type int dword_1002A2A4;
  7925. // 1002A2A8: using guessed type int dword_1002A2A8;
  7926. // 1002A2B4: using guessed type int dword_1002A2B4;
  7927. // 1002A2BC: using guessed type char byte_1002A2BC;
  7928. // 1002A2C0: using guessed type char byte_1002A2C0;
  7929.  
  7930. //----- (1000C9E5) --------------------------------------------------------
  7931. int __cdecl sub_1000C9E5(int a1, int a2)
  7932. {
  7933.   int v2; // ecx@1
  7934.   int *v3; // esi@1
  7935.   int result; // eax@1
  7936.   int v5; // ecx@1
  7937.   _BYTE *v6; // edx@1
  7938.   _WORD *v7; // edi@1
  7939.   int v8; // ebp@1
  7940.   _WORD *v9; // edi@8
  7941.   _BYTE *v10; // edx@8
  7942.   int v11; // [esp+0h] [ebp-2Ch]@1
  7943.   int v12; // [esp+4h] [ebp-28h]@1
  7944.   int v13; // [esp+8h] [ebp-24h]@1
  7945.   int v14; // [esp+Ch] [ebp-20h]@1
  7946.   int v15; // [esp+10h] [ebp-1Ch]@1
  7947.  
  7948.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  7949.   v15 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  7950.   v3 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  7951.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  7952.              + dword_1002A29C);
  7953.   v14 = 2 * (dword_1002A2A8 - v2);
  7954.   v13 = 4 * (dword_1002A2A8 - v2);
  7955.   result = 4 * (256 - v2);
  7956.   v12 = 4 * (256 - v2);
  7957.   v5 = v2 + 1;
  7958.   v11 = v5;
  7959.   v6 = (_BYTE *)(a1 + a2 * dword_1002A2A8 + dword_1002A2A4 - 2);
  7960.   v7 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  7961.   v8 = dword_1002A2B4;
  7962.   while ( 1 )
  7963.   {
  7964.     while ( --v5 )
  7965.     {
  7966.       v6 += 2;
  7967.       v7 += 2;
  7968.       result = *v3;
  7969.       *v3 = 0xFFFF;
  7970.       ++v3;
  7971.       if ( (_WORD)result != -1 )
  7972.       {
  7973.         result = 0;
  7974.         if ( *v7 > 0xFFFEu )
  7975.         {
  7976.           *v7 = -2;
  7977.           LOBYTE(result) = *v6;
  7978.           LOBYTE(result) = *(_BYTE *)(result + v8);
  7979.           *v6 = result;
  7980.         }
  7981.         if ( v7[1] > 0xFFFEu )
  7982.         {
  7983.           v7[1] = -2;
  7984.           LOBYTE(result) = v6[1];
  7985.           LOBYTE(result) = *(_BYTE *)(result + v8);
  7986.           v6[1] = result;
  7987.         }
  7988.         v9 = (_WORD *)((char *)v7 + dword_1002A2AC);
  7989.         v10 = &v6[dword_1002A2A8];
  7990.         if ( *v9 > 0xFFFEu )
  7991.         {
  7992.           *v9 = -2;
  7993.           LOBYTE(result) = *v10;
  7994.           LOBYTE(result) = *(_BYTE *)(result + v8);
  7995.           *v10 = result;
  7996.         }
  7997.         if ( v9[1] > 0xFFFEu )
  7998.         {
  7999.           v9[1] = -2;
  8000.           LOBYTE(result) = v10[1];
  8001.           LOBYTE(result) = *(_BYTE *)(result + v8);
  8002.           v10[1] = result;
  8003.         }
  8004.         v7 = (_WORD *)((char *)v9 - dword_1002A2AC);
  8005.         v6 = &v10[-dword_1002A2A8];
  8006.       }
  8007.     }
  8008.     if ( !--v15 )
  8009.       break;
  8010.     v5 = v11;
  8011.     v3 = (int *)((char *)v3 + v12);
  8012.     v7 = (_WORD *)((char *)v7 + v13);
  8013.     v6 += v14;
  8014.   }
  8015.   return result;
  8016. }
  8017. // 1002A2A0: using guessed type int dword_1002A2A0;
  8018. // 1002A2A4: using guessed type int dword_1002A2A4;
  8019. // 1002A2A8: using guessed type int dword_1002A2A8;
  8020. // 1002A2AC: using guessed type int dword_1002A2AC;
  8021. // 1002A2B4: using guessed type int dword_1002A2B4;
  8022.  
  8023. //----- (1000CB30) --------------------------------------------------------
  8024. unsigned int __cdecl sub_1000CB30(int a1, int a2)
  8025. {
  8026.   _WORD *v2; // edi@1
  8027.   _WORD *v3; // edx@1
  8028.   int v4; // ecx@1
  8029.   unsigned int *v5; // esi@1
  8030.   unsigned int result; // eax@1
  8031.   int v7; // ecx@1
  8032.   int v8; // ebp@1
  8033.   int v9; // [esp+0h] [ebp-2Ch]@1
  8034.   int v10; // [esp+4h] [ebp-28h]@1
  8035.   int v11; // [esp+8h] [ebp-24h]@1
  8036.   int v12; // [esp+Ch] [ebp-20h]@1
  8037.   int v13; // [esp+10h] [ebp-1Ch]@1
  8038.  
  8039.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8040.   v3 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  8041.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8042.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8043.   v5 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8044.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8045.                       + dword_1002A29C);
  8046.   v12 = 2 * (dword_1002A2A8 - v4);
  8047.   v11 = 2 * (dword_1002A2A8 - v4);
  8048.   result = 4 * (256 - v4);
  8049.   v10 = 4 * (256 - v4);
  8050.   v7 = v4 + 1;
  8051.   v9 = v7;
  8052.   v8 = dword_1002A2B0;
  8053.   while ( 1 )
  8054.   {
  8055.     while ( --v7 )
  8056.     {
  8057.       ++v2;
  8058.       ++v3;
  8059.       result = *v5;
  8060.       *v5 = 0xFFFF;
  8061.       ++v5;
  8062.       if ( (_WORD)result != -1 )
  8063.       {
  8064.         LOWORD(result) = ~(_WORD)result;
  8065.         if ( *v2 < (unsigned __int16)result )
  8066.         {
  8067.           *v2 = result;
  8068.           result >>= 16;
  8069.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  8070.           *v3 = result;
  8071.         }
  8072.       }
  8073.     }
  8074.     if ( !--v13 )
  8075.       break;
  8076.     v7 = v9;
  8077.     v5 = (unsigned int *)((char *)v5 + v10);
  8078.     v2 = (_WORD *)((char *)v2 + v11);
  8079.     v3 = (_WORD *)((char *)v3 + v12);
  8080.   }
  8081.   return result;
  8082. }
  8083. // 1002A2A0: using guessed type int dword_1002A2A0;
  8084. // 1002A2A4: using guessed type int dword_1002A2A4;
  8085. // 1002A2A8: using guessed type int dword_1002A2A8;
  8086. // 1002A2B0: using guessed type int dword_1002A2B0;
  8087.  
  8088. //----- (1000CC1C) --------------------------------------------------------
  8089. int __cdecl sub_1000CC1C(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  8090. {
  8091.   unsigned __int16 *v5; // edi@1
  8092.   _DWORD *v6; // esi@1
  8093.   int v7; // ecx@1
  8094.   unsigned int v8; // edx@1
  8095.   unsigned int v9; // edx@1
  8096.   _WORD *v10; // ebp@1
  8097.   unsigned __int16 v11; // bx@1
  8098.   int result; // eax@1
  8099.   _DWORD *i; // esi@1
  8100.   unsigned __int8 v14; // cf@3
  8101.   _DWORD *v15; // esi@9
  8102.   unsigned int v16; // edx@9
  8103.   _DWORD *v17; // [esp+4h] [ebp-24h]@1
  8104.   int v18; // [esp+8h] [ebp-20h]@1
  8105.   int v19; // [esp+Ch] [ebp-1Ch]@1
  8106.  
  8107.   v5 = (unsigned __int16 *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8108.   v6 = (_DWORD *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8109.                 + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8110.                 + dword_1002A29C);
  8111.   v19 = 2 * (dword_1002A2A8 - a3);
  8112.   v18 = 2 * (dword_1002A2A8 - a3);
  8113.   v17 = v6;
  8114.   v7 = a3 + 1;
  8115.   v8 = a5;
  8116.   BYTE1(v8) = byte_1002A2C0;
  8117.   v9 = _byteswap_ulong(v8);
  8118.   LOBYTE(v9) = a5;
  8119.   BYTE1(v9) = byte_1002A2BC;
  8120.   v10 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  8121.   v11 = ~(unsigned __int16)*v6;
  8122.   result = *v6 >> 16;
  8123.   for ( i = v6 + 1; ; i = v15 + 1 )
  8124.   {
  8125.     while ( --v7 )
  8126.     {
  8127.       ++v10;
  8128.       ++v5;
  8129.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  8130.       BYTE1(v9) += v9;
  8131.       if ( v14 )
  8132.       {
  8133.         v11 = ~(unsigned __int16)*i;
  8134.         result = *i >> 16;
  8135.         ++i;
  8136.       }
  8137.       if ( v11 )
  8138.       {
  8139.         if ( *v5 < v11 )
  8140.         {
  8141.           *v5 = v11;
  8142.           *v10 = result;
  8143.         }
  8144.       }
  8145.     }
  8146.     if ( !--a4 )
  8147.       break;
  8148.     v16 = _byteswap_ulong(v9);
  8149.     v7 = a3 + 1;
  8150.     v15 = v17;
  8151.     v5 = (unsigned __int16 *)((char *)v5 + v18);
  8152.     v10 = (_WORD *)((char *)v10 + v19);
  8153.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  8154.     BYTE1(v16) += v16;
  8155.     if ( v14 )
  8156.     {
  8157.       v15 = v17 + 256;
  8158.       v17 += 256;
  8159.     }
  8160.     v9 = _byteswap_ulong(v16);
  8161.     BYTE1(v9) = byte_1002A2BC;
  8162.     v11 = ~(unsigned __int16)*v15;
  8163.     result = *v15 >> 16;
  8164.   }
  8165.   return result;
  8166. }
  8167. // 1002A2A0: using guessed type int dword_1002A2A0;
  8168. // 1002A2A4: using guessed type int dword_1002A2A4;
  8169. // 1002A2A8: using guessed type int dword_1002A2A8;
  8170. // 1002A2BC: using guessed type char byte_1002A2BC;
  8171. // 1002A2C0: using guessed type char byte_1002A2C0;
  8172.  
  8173. //----- (1000CD2D) --------------------------------------------------------
  8174. unsigned int __cdecl sub_1000CD2D(int a1, int a2)
  8175. {
  8176.   int v2; // ecx@1
  8177.   unsigned int *v3; // esi@1
  8178.   unsigned int result; // eax@1
  8179.   int v5; // ecx@1
  8180.   int v6; // ebp@1
  8181.   _WORD *v7; // edx@1
  8182.   unsigned __int16 *v8; // edi@1
  8183.   unsigned __int16 v9; // bx@4
  8184.   unsigned __int16 *v10; // edi@8
  8185.   _WORD *v11; // edx@8
  8186.   int v12; // [esp+0h] [ebp-2Ch]@1
  8187.   int v13; // [esp+4h] [ebp-28h]@1
  8188.   int v14; // [esp+8h] [ebp-24h]@1
  8189.   int v15; // [esp+Ch] [ebp-20h]@1
  8190.   int v16; // [esp+10h] [ebp-1Ch]@1
  8191.  
  8192.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8193.   v16 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8194.   v3 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8195.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8196.                       + dword_1002A29C);
  8197.   v15 = 4 * (dword_1002A2A8 - v2);
  8198.   v14 = 4 * (dword_1002A2A8 - v2);
  8199.   result = 4 * (256 - v2);
  8200.   v13 = 4 * (256 - v2);
  8201.   v5 = v2 + 1;
  8202.   v12 = v5;
  8203.   v6 = dword_1002A2B0;
  8204.   v7 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A4 - 4);
  8205.   v8 = (unsigned __int16 *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  8206.   while ( 1 )
  8207.   {
  8208.     while ( --v5 )
  8209.     {
  8210.       v7 += 2;
  8211.       v8 += 2;
  8212.       result = *v3;
  8213.       *v3 = 0xFFFF;
  8214.       ++v3;
  8215.       if ( (_WORD)result != -1 )
  8216.       {
  8217.         v9 = ~(_WORD)result;
  8218.         LOWORD(result) = 0;
  8219.         result >>= 16;
  8220.         LOWORD(result) = *(_WORD *)(v6 + 2 * result);
  8221.         if ( *v8 < v9 )
  8222.         {
  8223.           *v8 = v9;
  8224.           *v7 = result;
  8225.         }
  8226.         if ( v8[1] < v9 )
  8227.         {
  8228.           v8[1] = v9;
  8229.           v7[1] = result;
  8230.         }
  8231.         v10 = (unsigned __int16 *)((char *)v8 + dword_1002A2AC);
  8232.         v11 = (_WORD *)((char *)v7 + dword_1002A2AC);
  8233.         if ( *v10 < v9 )
  8234.         {
  8235.           *v10 = v9;
  8236.           *v11 = result;
  8237.         }
  8238.         if ( v10[1] < v9 )
  8239.         {
  8240.           v10[1] = v9;
  8241.           v11[1] = result;
  8242.         }
  8243.         v8 = (unsigned __int16 *)((char *)v10 - dword_1002A2AC);
  8244.         v7 = (_WORD *)((char *)v11 - dword_1002A2AC);
  8245.       }
  8246.     }
  8247.     if ( !--v16 )
  8248.       break;
  8249.     v5 = v12;
  8250.     v3 = (unsigned int *)((char *)v3 + v13);
  8251.     v8 = (unsigned __int16 *)((char *)v8 + v14);
  8252.     v7 = (_WORD *)((char *)v7 + v15);
  8253.   }
  8254.   return result;
  8255. }
  8256. // 1002A2A0: using guessed type int dword_1002A2A0;
  8257. // 1002A2A4: using guessed type int dword_1002A2A4;
  8258. // 1002A2A8: using guessed type int dword_1002A2A8;
  8259. // 1002A2AC: using guessed type int dword_1002A2AC;
  8260. // 1002A2B0: using guessed type int dword_1002A2B0;
  8261.  
  8262. //----- (1000CE65) --------------------------------------------------------
  8263. int __cdecl sub_1000CE65(int a1, int a2)
  8264. {
  8265.   _WORD *v2; // edi@1
  8266.   _WORD *v3; // edx@1
  8267.   int v4; // ecx@1
  8268.   int *v5; // esi@1
  8269.   int result; // eax@1
  8270.   int v7; // ecx@1
  8271.   int v8; // ebp@1
  8272.   int v9; // [esp+0h] [ebp-2Ch]@1
  8273.   int v10; // [esp+4h] [ebp-28h]@1
  8274.   int v11; // [esp+8h] [ebp-24h]@1
  8275.   int v12; // [esp+Ch] [ebp-20h]@1
  8276.   int v13; // [esp+10h] [ebp-1Ch]@1
  8277.  
  8278.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8279.   v3 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  8280.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8281.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8282.   v5 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8283.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8284.              + dword_1002A29C);
  8285.   v12 = 2 * (dword_1002A2A8 - v4);
  8286.   v11 = 2 * (dword_1002A2A8 - v4);
  8287.   result = 4 * (256 - v4);
  8288.   v10 = 4 * (256 - v4);
  8289.   v7 = v4 + 1;
  8290.   v9 = v7;
  8291.   v8 = dword_1002A2B4;
  8292.   while ( 1 )
  8293.   {
  8294.     while ( --v7 )
  8295.     {
  8296.       ++v2;
  8297.       ++v3;
  8298.       result = *v5;
  8299.       *v5 = 0xFFFF;
  8300.       ++v5;
  8301.       if ( (_WORD)result != -1 && *v2 < 1u )
  8302.       {
  8303.         *v2 = 1;
  8304.         result = (unsigned __int16)*v3;
  8305.         LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  8306.         *v3 = result;
  8307.       }
  8308.     }
  8309.     if ( !--v13 )
  8310.       break;
  8311.     v7 = v9;
  8312.     v5 = (int *)((char *)v5 + v10);
  8313.     v2 = (_WORD *)((char *)v2 + v11);
  8314.     v3 = (_WORD *)((char *)v3 + v12);
  8315.   }
  8316.   return result;
  8317. }
  8318. // 1002A2A0: using guessed type int dword_1002A2A0;
  8319. // 1002A2A4: using guessed type int dword_1002A2A4;
  8320. // 1002A2A8: using guessed type int dword_1002A2A8;
  8321. // 1002A2B4: using guessed type int dword_1002A2B4;
  8322.  
  8323. //----- (1000CF54) --------------------------------------------------------
  8324. _WORD *__cdecl sub_1000CF54(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  8325. {
  8326.   _WORD *v5; // edi@1
  8327.   _WORD **v6; // esi@1
  8328.   int v7; // ecx@1
  8329.   unsigned int v8; // edx@1
  8330.   unsigned int v9; // edx@1
  8331.   _WORD *v10; // ebp@1
  8332.   _WORD *result; // eax@1
  8333.   int v12; // ebx@1
  8334.   _WORD **i; // esi@1
  8335.   unsigned __int8 v14; // cf@3
  8336.   _WORD **v15; // esi@9
  8337.   unsigned int v16; // edx@9
  8338.   _WORD **v17; // [esp+4h] [ebp-24h]@1
  8339.   int v18; // [esp+8h] [ebp-20h]@1
  8340.   int v19; // [esp+Ch] [ebp-1Ch]@1
  8341.  
  8342.   v5 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8343.   v6 = (_WORD **)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8344.                 + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8345.                 + dword_1002A29C);
  8346.   v19 = 2 * (dword_1002A2A8 - a3);
  8347.   v18 = 2 * (dword_1002A2A8 - a3);
  8348.   v17 = v6;
  8349.   v7 = a3 + 1;
  8350.   v8 = a5;
  8351.   BYTE1(v8) = byte_1002A2C0;
  8352.   v9 = _byteswap_ulong(v8);
  8353.   LOBYTE(v9) = a5;
  8354.   BYTE1(v9) = byte_1002A2BC;
  8355.   v10 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A4);
  8356.   result = *v6;
  8357.   v12 = dword_1002A2B4;
  8358.   for ( i = v6 + 1; ; i = v15 + 1 )
  8359.   {
  8360.     while ( --v7 )
  8361.     {
  8362.       ++v10;
  8363.       ++v5;
  8364.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  8365.       BYTE1(v9) += v9;
  8366.       if ( v14 )
  8367.       {
  8368.         result = *i;
  8369.         ++i;
  8370.       }
  8371.       if ( (_WORD)result != -1 )
  8372.       {
  8373.         result = (_WORD *)1;
  8374.         if ( *v5 < 1u )
  8375.         {
  8376.           *v5 = 1;
  8377.           result = (_WORD *)(v12 + 2 * (unsigned __int16)*v10);
  8378.           LOWORD(result) = *result;
  8379.           *v10 = (_WORD)result;
  8380.         }
  8381.       }
  8382.     }
  8383.     if ( !--a4 )
  8384.       break;
  8385.     v16 = _byteswap_ulong(v9);
  8386.     v7 = a3 + 1;
  8387.     v15 = v17;
  8388.     v5 = (_WORD *)((char *)v5 + v18);
  8389.     v10 = (_WORD *)((char *)v10 + v19);
  8390.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  8391.     BYTE1(v16) += v16;
  8392.     if ( v14 )
  8393.     {
  8394.       v15 = v17 + 256;
  8395.       v17 += 256;
  8396.     }
  8397.     v9 = _byteswap_ulong(v16);
  8398.     BYTE1(v9) = byte_1002A2BC;
  8399.     result = *v15;
  8400.   }
  8401.   return result;
  8402. }
  8403. // 1002A2A0: using guessed type int dword_1002A2A0;
  8404. // 1002A2A4: using guessed type int dword_1002A2A4;
  8405. // 1002A2A8: using guessed type int dword_1002A2A8;
  8406. // 1002A2B4: using guessed type int dword_1002A2B4;
  8407. // 1002A2BC: using guessed type char byte_1002A2BC;
  8408. // 1002A2C0: using guessed type char byte_1002A2C0;
  8409.  
  8410. //----- (1000D063) --------------------------------------------------------
  8411. int __cdecl sub_1000D063(int a1, int a2)
  8412. {
  8413.   int v2; // ecx@1
  8414.   int *v3; // esi@1
  8415.   int result; // eax@1
  8416.   int v5; // ecx@1
  8417.   _WORD *v6; // edx@1
  8418.   _WORD *v7; // edi@1
  8419.   int v8; // ebp@1
  8420.   _WORD *v9; // edi@8
  8421.   _WORD *v10; // edx@8
  8422.   int v11; // [esp+0h] [ebp-2Ch]@1
  8423.   int v12; // [esp+4h] [ebp-28h]@1
  8424.   int v13; // [esp+8h] [ebp-24h]@1
  8425.   int v14; // [esp+Ch] [ebp-20h]@1
  8426.   int v15; // [esp+10h] [ebp-1Ch]@1
  8427.  
  8428.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8429.   v15 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8430.   v3 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8431.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8432.              + dword_1002A29C);
  8433.   v14 = 4 * (dword_1002A2A8 - v2);
  8434.   v13 = 4 * (dword_1002A2A8 - v2);
  8435.   result = 4 * (256 - v2);
  8436.   v12 = 4 * (256 - v2);
  8437.   v5 = v2 + 1;
  8438.   v11 = v5;
  8439.   v6 = (_WORD *)(a1 + a2 * dword_1002A2A8 + dword_1002A2A4 - 4);
  8440.   v7 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  8441.   v8 = dword_1002A2B4;
  8442.   while ( 1 )
  8443.   {
  8444.     while ( --v5 )
  8445.     {
  8446.       v6 += 2;
  8447.       v7 += 2;
  8448.       result = *v3;
  8449.       *v3 = 0xFFFF;
  8450.       ++v3;
  8451.       if ( (_WORD)result != -1 )
  8452.       {
  8453.         result = 0;
  8454.         if ( *v7 < 1u )
  8455.         {
  8456.           *v7 = 1;
  8457.           LOWORD(result) = *v6;
  8458.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  8459.           *v6 = result;
  8460.         }
  8461.         if ( v7[1] < 1u )
  8462.         {
  8463.           v7[1] = 1;
  8464.           LOWORD(result) = v6[1];
  8465.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  8466.           v6[1] = result;
  8467.         }
  8468.         v9 = (_WORD *)((char *)v7 + dword_1002A2AC);
  8469.         v10 = (_WORD *)((char *)v6 + dword_1002A2AC);
  8470.         if ( *v9 < 1u )
  8471.         {
  8472.           *v9 = 1;
  8473.           LOWORD(result) = *v10;
  8474.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  8475.           *v10 = result;
  8476.         }
  8477.         if ( v9[1] < 1u )
  8478.         {
  8479.           v9[1] = 1;
  8480.           LOWORD(result) = v10[1];
  8481.           LOWORD(result) = *(_WORD *)(v8 + 2 * result);
  8482.           v10[1] = result;
  8483.         }
  8484.         v7 = (_WORD *)((char *)v9 - dword_1002A2AC);
  8485.         v6 = (_WORD *)((char *)v10 - dword_1002A2AC);
  8486.       }
  8487.     }
  8488.     if ( !--v15 )
  8489.       break;
  8490.     v5 = v11;
  8491.     v3 = (int *)((char *)v3 + v12);
  8492.     v7 = (_WORD *)((char *)v7 + v13);
  8493.     v6 = (_WORD *)((char *)v6 + v14);
  8494.   }
  8495.   return result;
  8496. }
  8497. // 1002A2A0: using guessed type int dword_1002A2A0;
  8498. // 1002A2A4: using guessed type int dword_1002A2A4;
  8499. // 1002A2A8: using guessed type int dword_1002A2A8;
  8500. // 1002A2AC: using guessed type int dword_1002A2AC;
  8501. // 1002A2B4: using guessed type int dword_1002A2B4;
  8502.  
  8503. //----- (1000D1C0) --------------------------------------------------------
  8504. unsigned int __cdecl sub_1000D1C0(int a1, int a2)
  8505. {
  8506.   _WORD *v2; // edi@1
  8507.   _BYTE *v3; // edx@1
  8508.   int v4; // ecx@1
  8509.   unsigned int *v5; // esi@1
  8510.   unsigned int result; // eax@1
  8511.   int v7; // ecx@1
  8512.   int v8; // ebp@1
  8513.   int v9; // [esp+0h] [ebp-2Ch]@1
  8514.   int v10; // [esp+4h] [ebp-28h]@1
  8515.   int v11; // [esp+8h] [ebp-24h]@1
  8516.   int v12; // [esp+Ch] [ebp-20h]@1
  8517.   int v13; // [esp+10h] [ebp-1Ch]@1
  8518.  
  8519.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8520.   v3 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  8521.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8522.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8523.   v5 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8524.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8525.                       + dword_1002A29C);
  8526.   v12 = dword_1002A2A8 - v4;
  8527.   v11 = 2 * (dword_1002A2A8 - v4);
  8528.   result = 4 * (256 - v4);
  8529.   v10 = 4 * (256 - v4);
  8530.   v7 = v4 + 1;
  8531.   v9 = v7;
  8532.   v8 = dword_1002A2B0;
  8533.   while ( 1 )
  8534.   {
  8535.     while ( --v7 )
  8536.     {
  8537.       ++v2;
  8538.       ++v3;
  8539.       result = *v5;
  8540.       *v5 = 0xFFFF;
  8541.       ++v5;
  8542.       if ( (_WORD)result != -1 )
  8543.       {
  8544.         LOWORD(result) = ~(_WORD)result;
  8545.         if ( *v2 < (unsigned __int16)result )
  8546.         {
  8547.           *v2 = result;
  8548.           result >>= 16;
  8549.           LOBYTE(result) = *(_BYTE *)(result + v8);
  8550.           *v3 = result;
  8551.         }
  8552.       }
  8553.     }
  8554.     if ( !--v13 )
  8555.       break;
  8556.     v7 = v9;
  8557.     v5 = (unsigned int *)((char *)v5 + v10);
  8558.     v2 = (_WORD *)((char *)v2 + v11);
  8559.     v3 += v12;
  8560.   }
  8561.   return result;
  8562. }
  8563. // 1002A2A0: using guessed type int dword_1002A2A0;
  8564. // 1002A2A4: using guessed type int dword_1002A2A4;
  8565. // 1002A2A8: using guessed type int dword_1002A2A8;
  8566. // 1002A2B0: using guessed type int dword_1002A2B0;
  8567.  
  8568. //----- (1000D2A4) --------------------------------------------------------
  8569. int __cdecl sub_1000D2A4(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  8570. {
  8571.   unsigned __int16 *v5; // edi@1
  8572.   _DWORD *v6; // esi@1
  8573.   int v7; // ecx@1
  8574.   unsigned int v8; // edx@1
  8575.   unsigned int v9; // edx@1
  8576.   _BYTE *v10; // ebp@1
  8577.   unsigned __int16 v11; // bx@1
  8578.   int result; // eax@1
  8579.   _DWORD *i; // esi@1
  8580.   unsigned __int8 v14; // cf@3
  8581.   _DWORD *v15; // esi@9
  8582.   unsigned int v16; // edx@9
  8583.   _DWORD *v17; // [esp+4h] [ebp-24h]@1
  8584.   int v18; // [esp+8h] [ebp-20h]@1
  8585.   int v19; // [esp+Ch] [ebp-1Ch]@1
  8586.  
  8587.   v5 = (unsigned __int16 *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8588.   v6 = (_DWORD *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8589.                 + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8590.                 + dword_1002A29C);
  8591.   v19 = dword_1002A2A8 - a3;
  8592.   v18 = 2 * (dword_1002A2A8 - a3);
  8593.   v17 = v6;
  8594.   v7 = a3 + 1;
  8595.   v8 = a5;
  8596.   BYTE1(v8) = byte_1002A2C0;
  8597.   v9 = _byteswap_ulong(v8);
  8598.   LOBYTE(v9) = a5;
  8599.   BYTE1(v9) = byte_1002A2BC;
  8600.   v10 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  8601.   v11 = ~(unsigned __int16)*v6;
  8602.   result = *v6 >> 8;
  8603.   for ( i = v6 + 1; ; i = v15 + 1 )
  8604.   {
  8605.     while ( --v7 )
  8606.     {
  8607.       ++v10;
  8608.       ++v5;
  8609.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  8610.       BYTE1(v9) += v9;
  8611.       if ( v14 )
  8612.       {
  8613.         v11 = ~(unsigned __int16)*i;
  8614.         result = *i >> 8;
  8615.         ++i;
  8616.       }
  8617.       if ( v11 )
  8618.       {
  8619.         if ( *v5 < v11 )
  8620.         {
  8621.           *v5 = v11;
  8622.           *v10 = BYTE1(result);
  8623.         }
  8624.       }
  8625.     }
  8626.     if ( !--a4 )
  8627.       break;
  8628.     v16 = _byteswap_ulong(v9);
  8629.     v7 = a3 + 1;
  8630.     v15 = v17;
  8631.     v5 = (unsigned __int16 *)((char *)v5 + v18);
  8632.     v10 += v19;
  8633.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  8634.     BYTE1(v16) += v16;
  8635.     if ( v14 )
  8636.     {
  8637.       v15 = v17 + 256;
  8638.       v17 += 256;
  8639.     }
  8640.     v9 = _byteswap_ulong(v16);
  8641.     BYTE1(v9) = byte_1002A2BC;
  8642.     v11 = ~(unsigned __int16)*v15;
  8643.     result = *v15 >> 8;
  8644.   }
  8645.   return result;
  8646. }
  8647. // 1002A2A0: using guessed type int dword_1002A2A0;
  8648. // 1002A2A4: using guessed type int dword_1002A2A4;
  8649. // 1002A2A8: using guessed type int dword_1002A2A8;
  8650. // 1002A2BC: using guessed type char byte_1002A2BC;
  8651. // 1002A2C0: using guessed type char byte_1002A2C0;
  8652.  
  8653. //----- (1000D3B0) --------------------------------------------------------
  8654. unsigned int __cdecl sub_1000D3B0(int a1, int a2)
  8655. {
  8656.   int v2; // ecx@1
  8657.   unsigned int *v3; // esi@1
  8658.   unsigned int result; // eax@1
  8659.   int v5; // ecx@1
  8660.   int v6; // ebp@1
  8661.   _BYTE *v7; // edx@1
  8662.   unsigned __int16 *v8; // edi@1
  8663.   __int16 v9; // bx@4
  8664.   unsigned __int16 v10; // bx@4
  8665.   unsigned __int16 *v11; // edi@8
  8666.   _BYTE *v12; // edx@8
  8667.   int v13; // [esp+0h] [ebp-2Ch]@1
  8668.   int v14; // [esp+4h] [ebp-28h]@1
  8669.   int v15; // [esp+8h] [ebp-24h]@1
  8670.   int v16; // [esp+Ch] [ebp-20h]@1
  8671.   int v17; // [esp+10h] [ebp-1Ch]@1
  8672.  
  8673.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8674.   v17 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8675.   v3 = (unsigned int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8676.                       + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8677.                       + dword_1002A29C);
  8678.   v16 = 2 * (dword_1002A2A8 - v2);
  8679.   v15 = 4 * (dword_1002A2A8 - v2);
  8680.   result = 4 * (256 - v2);
  8681.   v14 = 4 * (256 - v2);
  8682.   v5 = v2 + 1;
  8683.   v13 = v5;
  8684.   v6 = dword_1002A2B0;
  8685.   v7 = (_BYTE *)(a1 + a2 * dword_1002A2A8 + dword_1002A2A4 - 2);
  8686.   v8 = (unsigned __int16 *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  8687.   while ( 1 )
  8688.   {
  8689.     while ( --v5 )
  8690.     {
  8691.       v7 += 2;
  8692.       v8 += 2;
  8693.       result = *v3;
  8694.       *v3 = 0xFFFF;
  8695.       ++v3;
  8696.       if ( (_WORD)result != -1 )
  8697.       {
  8698.         v9 = result;
  8699.         result >>= 16;
  8700.         LOBYTE(result) = *(_BYTE *)(result + v6);
  8701.         v10 = ~v9;
  8702.         if ( *v8 < v10 )
  8703.         {
  8704.           *v8 = v10;
  8705.           *v7 = result;
  8706.         }
  8707.         if ( v8[1] < v10 )
  8708.         {
  8709.           v8[1] = v10;
  8710.           v7[1] = result;
  8711.         }
  8712.         v11 = (unsigned __int16 *)((char *)v8 + dword_1002A2AC);
  8713.         v12 = &v7[dword_1002A2A8];
  8714.         if ( *v11 < v10 )
  8715.         {
  8716.           *v11 = v10;
  8717.           *v12 = result;
  8718.         }
  8719.         if ( v11[1] < v10 )
  8720.         {
  8721.           v11[1] = v10;
  8722.           v12[1] = result;
  8723.         }
  8724.         v8 = (unsigned __int16 *)((char *)v11 - dword_1002A2AC);
  8725.         v7 = &v12[-dword_1002A2A8];
  8726.       }
  8727.     }
  8728.     if ( !--v17 )
  8729.       break;
  8730.     v5 = v13;
  8731.     v3 = (unsigned int *)((char *)v3 + v14);
  8732.     v8 = (unsigned __int16 *)((char *)v8 + v15);
  8733.     v7 += v16;
  8734.   }
  8735.   return result;
  8736. }
  8737. // 1002A2A0: using guessed type int dword_1002A2A0;
  8738. // 1002A2A4: using guessed type int dword_1002A2A4;
  8739. // 1002A2A8: using guessed type int dword_1002A2A8;
  8740. // 1002A2AC: using guessed type int dword_1002A2AC;
  8741. // 1002A2B0: using guessed type int dword_1002A2B0;
  8742.  
  8743. //----- (1000D4DD) --------------------------------------------------------
  8744. int __cdecl sub_1000D4DD(int a1, int a2)
  8745. {
  8746.   _WORD *v2; // edi@1
  8747.   _BYTE *v3; // edx@1
  8748.   int v4; // ecx@1
  8749.   int *v5; // esi@1
  8750.   int result; // eax@1
  8751.   int v7; // ecx@1
  8752.   int v8; // ebp@1
  8753.   int v9; // [esp+0h] [ebp-2Ch]@1
  8754.   int v10; // [esp+4h] [ebp-28h]@1
  8755.   int v11; // [esp+8h] [ebp-24h]@1
  8756.   int v12; // [esp+Ch] [ebp-20h]@1
  8757.   int v13; // [esp+10h] [ebp-1Ch]@1
  8758.  
  8759.   v2 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8760.   v3 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  8761.   v4 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8762.   v13 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8763.   v5 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8764.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8765.              + dword_1002A29C);
  8766.   v12 = dword_1002A2A8 - v4;
  8767.   v11 = 2 * (dword_1002A2A8 - v4);
  8768.   result = 4 * (256 - v4);
  8769.   v10 = 4 * (256 - v4);
  8770.   v7 = v4 + 1;
  8771.   v9 = v7;
  8772.   v8 = dword_1002A2B4;
  8773.   while ( 1 )
  8774.   {
  8775.     while ( --v7 )
  8776.     {
  8777.       ++v2;
  8778.       ++v3;
  8779.       result = *v5;
  8780.       *v5 = 0xFFFF;
  8781.       ++v5;
  8782.       if ( (_WORD)result != -1 && *v2 < 1u )
  8783.       {
  8784.         *v2 = 1;
  8785.         result = (unsigned __int8)*v3;
  8786.         LOBYTE(result) = *(_BYTE *)(result + v8);
  8787.         *v3 = result;
  8788.       }
  8789.     }
  8790.     if ( !--v13 )
  8791.       break;
  8792.     v7 = v9;
  8793.     v5 = (int *)((char *)v5 + v10);
  8794.     v2 = (_WORD *)((char *)v2 + v11);
  8795.     v3 += v12;
  8796.   }
  8797.   return result;
  8798. }
  8799. // 1002A2A0: using guessed type int dword_1002A2A0;
  8800. // 1002A2A4: using guessed type int dword_1002A2A4;
  8801. // 1002A2A8: using guessed type int dword_1002A2A8;
  8802. // 1002A2B4: using guessed type int dword_1002A2B4;
  8803.  
  8804. //----- (1000D5C3) --------------------------------------------------------
  8805. _BYTE *__cdecl sub_1000D5C3(int a1, int a2, int a3, __int16 a4, unsigned int a5)
  8806. {
  8807.   _WORD *v5; // edi@1
  8808.   _BYTE **v6; // esi@1
  8809.   int v7; // ecx@1
  8810.   unsigned int v8; // edx@1
  8811.   unsigned int v9; // edx@1
  8812.   _BYTE *v10; // ebp@1
  8813.   _BYTE *result; // eax@1
  8814.   int v12; // ebx@1
  8815.   _BYTE **i; // esi@1
  8816.   unsigned __int8 v14; // cf@3
  8817.   _BYTE **v15; // esi@9
  8818.   unsigned int v16; // edx@9
  8819.   _BYTE **v17; // [esp+4h] [ebp-24h]@1
  8820.   int v18; // [esp+8h] [ebp-20h]@1
  8821.   int v19; // [esp+Ch] [ebp-1Ch]@1
  8822.  
  8823.   v5 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8 - 1) + dword_1002A2A0);
  8824.   v6 = (_BYTE **)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8825.                 + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8826.                 + dword_1002A29C);
  8827.   v19 = dword_1002A2A8 - a3;
  8828.   v18 = 2 * (dword_1002A2A8 - a3);
  8829.   v17 = v6;
  8830.   v7 = a3 + 1;
  8831.   v8 = a5;
  8832.   BYTE1(v8) = byte_1002A2C0;
  8833.   v9 = _byteswap_ulong(v8);
  8834.   LOBYTE(v9) = a5;
  8835.   BYTE1(v9) = byte_1002A2BC;
  8836.   v10 = (_BYTE *)(a1 + a2 * dword_1002A2A8 - 1 + dword_1002A2A4);
  8837.   result = *v6;
  8838.   v12 = dword_1002A2B4;
  8839.   for ( i = v6 + 1; ; i = v15 + 1 )
  8840.   {
  8841.     while ( --v7 )
  8842.     {
  8843.       ++v10;
  8844.       ++v5;
  8845.       v14 = __CFADD__((_BYTE)v9, BYTE1(v9));
  8846.       BYTE1(v9) += v9;
  8847.       if ( v14 )
  8848.       {
  8849.         result = *i;
  8850.         ++i;
  8851.       }
  8852.       if ( (_WORD)result != -1 )
  8853.       {
  8854.         result = (_BYTE *)1;
  8855.         if ( *v5 < 1u )
  8856.         {
  8857.           *v5 = 1;
  8858.           result = (_BYTE *)(v12 + (unsigned __int8)*v10);
  8859.           LOBYTE(result) = *result;
  8860.           *v10 = (_BYTE)result;
  8861.         }
  8862.       }
  8863.     }
  8864.     if ( !--a4 )
  8865.       break;
  8866.     v16 = _byteswap_ulong(v9);
  8867.     v7 = a3 + 1;
  8868.     v15 = v17;
  8869.     v5 = (_WORD *)((char *)v5 + v18);
  8870.     v10 += v19;
  8871.     v14 = __CFADD__((_BYTE)v16, BYTE1(v16));
  8872.     BYTE1(v16) += v16;
  8873.     if ( v14 )
  8874.     {
  8875.       v15 = v17 + 256;
  8876.       v17 += 256;
  8877.     }
  8878.     v9 = _byteswap_ulong(v16);
  8879.     BYTE1(v9) = byte_1002A2BC;
  8880.     result = *v15;
  8881.   }
  8882.   return result;
  8883. }
  8884. // 1002A2A0: using guessed type int dword_1002A2A0;
  8885. // 1002A2A4: using guessed type int dword_1002A2A4;
  8886. // 1002A2A8: using guessed type int dword_1002A2A8;
  8887. // 1002A2B4: using guessed type int dword_1002A2B4;
  8888. // 1002A2BC: using guessed type char byte_1002A2BC;
  8889. // 1002A2C0: using guessed type char byte_1002A2C0;
  8890.  
  8891. //----- (1000D6C9) --------------------------------------------------------
  8892. int __cdecl sub_1000D6C9(int a1, int a2)
  8893. {
  8894.   int v2; // ecx@1
  8895.   int *v3; // esi@1
  8896.   int result; // eax@1
  8897.   int v5; // ecx@1
  8898.   _BYTE *v6; // edx@1
  8899.   _WORD *v7; // edi@1
  8900.   int v8; // ebp@1
  8901.   _WORD *v9; // edi@8
  8902.   _BYTE *v10; // edx@8
  8903.   int v11; // [esp+0h] [ebp-2Ch]@1
  8904.   int v12; // [esp+4h] [ebp-28h]@1
  8905.   int v13; // [esp+8h] [ebp-24h]@1
  8906.   int v14; // [esp+Ch] [ebp-20h]@1
  8907.   int v15; // [esp+10h] [ebp-1Ch]@1
  8908.  
  8909.   v2 = *(unsigned __int16 *)(dword_1002A29C + 262152);
  8910.   v15 = *(unsigned __int16 *)(dword_1002A29C + 262154);
  8911.   v3 = (int *)((*(unsigned __int16 *)(dword_1002A29C + 262146) << 10)
  8912.              + 4 * *(unsigned __int16 *)(dword_1002A29C + 0x40000)
  8913.              + dword_1002A29C);
  8914.   v14 = 2 * (dword_1002A2A8 - v2);
  8915.   v13 = 4 * (dword_1002A2A8 - v2);
  8916.   result = 4 * (256 - v2);
  8917.   v12 = 4 * (256 - v2);
  8918.   v5 = v2 + 1;
  8919.   v11 = v5;
  8920.   v6 = (_BYTE *)(a1 + a2 * dword_1002A2A8 + dword_1002A2A4 - 2);
  8921.   v7 = (_WORD *)(2 * (a1 + a2 * dword_1002A2A8) + dword_1002A2A0 - 4);
  8922.   v8 = dword_1002A2B4;
  8923.   while ( 1 )
  8924.   {
  8925.     while ( --v5 )
  8926.     {
  8927.       v6 += 2;
  8928.       v7 += 2;
  8929.       result = *v3;
  8930.       *v3 = 0xFFFF;
  8931.       ++v3;
  8932.       if ( (_WORD)result != -1 )
  8933.       {
  8934.         result = 0;
  8935.         if ( *v7 < 1u )
  8936.         {
  8937.           *v7 = 1;
  8938.           LOBYTE(result) = *v6;
  8939.           LOBYTE(result) = *(_BYTE *)(result + v8);
  8940.           *v6 = result;
  8941.         }
  8942.         if ( v7[1] < 1u )
  8943.         {
  8944.           v7[1] = 1;
  8945.           LOBYTE(result) = v6[1];
  8946.           LOBYTE(result) = *(_BYTE *)(result + v8);
  8947.           v6[1] = result;
  8948.         }
  8949.         v9 = (_WORD *)((char *)v7 + dword_1002A2AC);
  8950.         v10 = &v6[dword_1002A2A8];
  8951.         if ( *v9 < 1u )
  8952.         {
  8953.           *v9 = 1;
  8954.           LOBYTE(result) = *v10;
  8955.           LOBYTE(result) = *(_BYTE *)(result + v8);
  8956.           *v10 = result;
  8957.         }
  8958.         if ( v9[1] < 1u )
  8959.         {
  8960.           v9[1] = 1;
  8961.           LOBYTE(result) = v10[1];
  8962.           LOBYTE(result) = *(_BYTE *)(result + v8);
  8963.           v10[1] = result;
  8964.         }
  8965.         v7 = (_WORD *)((char *)v9 - dword_1002A2AC);
  8966.         v6 = &v10[-dword_1002A2A8];
  8967.       }
  8968.     }
  8969.     if ( !--v15 )
  8970.       break;
  8971.     v5 = v11;
  8972.     v3 = (int *)((char *)v3 + v12);
  8973.     v7 = (_WORD *)((char *)v7 + v13);
  8974.     v6 += v14;
  8975.   }
  8976.   return result;
  8977. }
  8978. // 1002A2A0: using guessed type int dword_1002A2A0;
  8979. // 1002A2A4: using guessed type int dword_1002A2A4;
  8980. // 1002A2A8: using guessed type int dword_1002A2A8;
  8981. // 1002A2AC: using guessed type int dword_1002A2AC;
  8982. // 1002A2B4: using guessed type int dword_1002A2B4;
  8983.  
  8984. //----- (10010090) --------------------------------------------------------
  8985. int __cdecl sub_10010090(double a1)
  8986. {
  8987.   return _ctrandisp1(a1);
  8988. }
  8989.  
  8990. //----- (1001009A) --------------------------------------------------------
  8991. void sub_1001009A()
  8992. {
  8993.   JUMPOUT(&loc_10010095);
  8994. }
  8995.  
  8996. //----- (100170F0) --------------------------------------------------------
  8997. int __cdecl sub_100170F0(int a1)
  8998. {
  8999.   int result; // eax@1
  9000.  
  9001.   result = a1;
  9002.   dword_10036CEC = a1;
  9003.   return result;
  9004. }
  9005. // 10036CEC: using guessed type int dword_10036CEC;
  9006.  
  9007. //----- (10017410) --------------------------------------------------------
  9008. double __usercall sub_10017410@<st0>(long double a1@<st1>, long double a2@<st0>)
  9009. {
  9010.   char v2; // cl@1
  9011.   double result; // st7@1
  9012.   char v4; // ch@1
  9013.  
  9014.   sub_1001744C();
  9015.   result = atan2(a1, a2);
  9016.   if ( v4 )
  9017.     result = 3.141592653589793116 - result;
  9018.   if ( v2 )
  9019.     result = -result;
  9020.   return result;
  9021. }
  9022. // 1001744C: using guessed type int sub_1001744C(void);
  9023.  
  9024. //----- (1001744C) --------------------------------------------------------
  9025. #error "10017477: positive sp value has been found (funcsize=0)"
  9026.  
  9027. //----- (100174A8) --------------------------------------------------------
  9028. int sub_100174A8()
  9029. {
  9030.   char v0; // cl@1
  9031.  
  9032.   _rtpiby2();
  9033.   JUMPOUT(v0, 0, chsifnegret);
  9034.   return chsifnegret();
  9035. }
  9036. // 1001747C: using guessed type double _rtpiby2(void);
  9037. // 1001B1B9: using guessed type int chsifnegret(void);
  9038.  
  9039. //----- (1001A9D0) --------------------------------------------------------
  9040. int __cdecl sub_1001A9D0(int a1, int a2)
  9041. {
  9042.   return _ld12cvt(a1, a2, &unk_10038318);
  9043. }
  9044. // 1001A760: using guessed type _DWORD __cdecl _ld12cvt(_DWORD, _DWORD, _DWORD);
  9045.  
  9046. //----- (1001AA00) --------------------------------------------------------
  9047. int __cdecl sub_1001AA00(int a1, int a2)
  9048. {
  9049.   return _ld12cvt(a1, a2, &unk_10038330);
  9050. }
  9051. // 1001A760: using guessed type _DWORD __cdecl _ld12cvt(_DWORD, _DWORD, _DWORD);
  9052.  
  9053. //----- (1001AB00) --------------------------------------------------------
  9054. int __cdecl sub_1001AB00(int a1, int a2)
  9055. {
  9056.   char v3; // [esp+Ch] [ebp-10h]@1
  9057.   char v4; // [esp+10h] [ebp-Ch]@1
  9058.  
  9059.   __strgtold12(&v4, &v3, a2, 0, 0, 0, 0);
  9060.   return sub_1001A9D0((int)&v4, a1);
  9061. }
  9062. // 1001DA90: using guessed type _DWORD __cdecl __strgtold12(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  9063.  
  9064. //----- (1001AB80) --------------------------------------------------------
  9065. int __cdecl sub_1001AB80(int a1, int a2)
  9066. {
  9067.   char v3; // [esp+Ch] [ebp-10h]@1
  9068.   char v4; // [esp+10h] [ebp-Ch]@1
  9069.  
  9070.   __strgtold12(&v4, &v3, a2, 0, 0, 0, 0);
  9071.   return sub_1001AA00((int)&v4, a1);
  9072. }
  9073. // 1001DA90: using guessed type _DWORD __cdecl __strgtold12(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  9074.  
  9075. #error "There were 1 decompilation failure(s) on 145 function(s)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement