; Events are processed on one thread. No secondary window or console is created. WindowEvents3D PROC uses ebx esi edi hwnd:DWORD, uMsg:DWORD, wp:DWORD, lp:DWORD cmp uMsg, 102h jne @F invoke ArrivalChar3D, wp xor eax, eax ret @@: cmp uMsg, 201h je event_mouse_down cmp uMsg, 200h jne @F cmp engineMode, MODE_POOL jne event_default test wp, 1 jnz event_mouse_down jmp event_default @@: cmp uMsg, 100h je event_key_down cmp uMsg, 104h jne @F cmp wp, 0Dh je event_fullscreen @@: cmp uMsg, 101h je event_key_up cmp uMsg, 8 je event_focus_lost cmp uMsg, 14h je event_erase cmp uMsg, 0Fh je event_paint cmp uMsg, WM_CLOSE je event_close cmp uMsg, WM_DESTROY je event_close event_default: invoke DefWindowProcA, hwnd, uMsg, wp, lp ret event_mouse_down: cmp viewWidth3D, 0 je event_done cmp viewHeight3D, 0 je event_done movsx eax, WORD PTR lp sub eax, viewLeft3D cmp eax, viewWidth3D jae event_done imul eax, 320 xor edx, edx div viewWidth3D mov mouseX3D, eax movsx eax, WORD PTR lp[2] sub eax, viewTop3D cmp eax, viewHeight3D jae event_done imul eax, 240 xor edx, edx div viewHeight3D mov mouseY3D, eax cmp uMsg,200h jne @F cmp eax,211 jae event_done @@: mov mouseClick3D, 1 jmp event_done event_key_down: mov ecx, wp cmp ecx, 255 ja event_done test lp, 40000000h jnz event_done mov keys3D[ecx], 1 mov pressedKeys3D[ecx], 1 jmp event_done event_key_up: mov ecx, wp cmp ecx, 255 ja event_done mov keys3D[ecx], 0 jmp event_done event_fullscreen: test lp, 40000000h jnz event_done call ToggleFullscreen3D jmp event_done event_focus_lost: call ClearKeys3D jmp event_done event_erase: mov eax, 1 ret event_paint: invoke BeginPaint, hwnd, OFFSET paint3D cmp h3DDC, 0 je @F call Present3D @@: invoke EndPaint, hwnd, OFFSET paint3D jmp event_done event_close: invoke PostQuitMessage, 0 event_done: xor eax, eax ret WindowEvents3D ENDP LoadDisplaySettings3D PROC uses ebx invoke CreateFileA, OFFSET displaySettingsPath3D, 80000000h, 1, 0, 3, 80h, 0 cmp eax, -1 je display_settings_load_done mov ebx, eax invoke ReadFile, ebx, OFFSET displaySettingsData3D, 12, OFFSET displaySettingsIo3D, 0 invoke CloseHandle, ebx cmp displaySettingsIo3D, 12 jne display_settings_load_done cmp displaySettingsData3D, 44535031h jne display_settings_load_done mov eax, displaySettingsData3D[4] and eax, 1 mov displayFill3D, eax display_settings_load_done: ret LoadDisplaySettings3D ENDP SaveDisplaySettings3D PROC uses ebx invoke CreateDirectoryA, OFFSET runtime3D, 0 mov displaySettingsData3D, 44535031h mov eax, displayFill3D mov displaySettingsData3D[4], eax mov displaySettingsData3D[8], 0 invoke CreateFileA, OFFSET displaySettingsPath3D, 40000000h, 0, 0, 2, 80h, 0 cmp eax, -1 je display_settings_save_done mov ebx, eax invoke WriteFile, ebx, OFFSET displaySettingsData3D, 12, OFFSET displaySettingsIo3D, 0 invoke CloseHandle, ebx display_settings_save_done: ret SaveDisplaySettings3D ENDP Pressed3D PROC key:DWORD mov ecx, key xor eax, eax cmp ecx, 255 ja @F cmp pressedKeys3D[ecx], 0 je @F mov pressedKeys3D[ecx], 0 mov eax, 8000h @@: ret Pressed3D ENDP InitPaths3D PROC uses ebx esi edi invoke GetModuleFileNameA, 0, OFFSET directory3D, SIZEOF directory3D test eax, eax jz path_done lea esi, directory3D mov edi, esi path_scan: mov al, [esi] test al, al jz path_found cmp al, '\' jne @F mov edi, esi @@: inc esi jmp path_scan path_found: mov BYTE PTR [edi], 0 invoke SetCurrentDirectoryA, OFFSET directory3D mov ebx, 3 path_assets: invoke GetFileAttributesA, OFFSET szTexturesRelPath cmp eax, -1 jne path_done dec ebx jz path_restore ; Root, bin and build/graphics launches resolve the same asset directory. invoke SetCurrentDirectoryA, OFFSET parent3D test eax, eax jnz path_assets path_restore: invoke SetCurrentDirectoryA, OFFSET directory3D path_done: ret InitPaths3D ENDP Create3DWindow PROC uses ebx esi edi local widthPx:DWORD local heightPx:DWORD invoke GetModuleHandleA, OFFSET user32Name3D invoke GetProcAddress, eax, OFFSET dpiName3D test eax, eax jz @F call eax @@: invoke GetModuleHandleA, 0 mov h3DInst, eax mov wc3D.hInstance, eax invoke LoadIconA, eax, 1 mov wc3D.hIcon, eax mov wc3D.hIconSm, eax invoke LoadCursorA, 0, 32512 mov wc3D.hCursor, eax mov wc3D.cbSize, SIZEOF C3D_WNDCLASSEX mov wc3D.style, CS_HREDRAW or CS_VREDRAW mov wc3D.lpfnWndProc, OFFSET Casino3DWndProc mov wc3D.lpszClassName, OFFSET sz3DClassName invoke RegisterClassExA, OFFSET wc3D mov bmi3D.bmiHeader.biSize, SIZEOF C3D_BITMAPINFOHEADER mov bmi3D.bmiHeader.biWidth, SCREEN_W mov bmi3D.bmiHeader.biHeight, -SCREEN_H mov bmi3D.bmiHeader.biPlanes, 1 mov bmi3D.bmiHeader.biBitCount, 32 mov bmi3D.bmiHeader.biSizeImage, SCREEN_SIZE * 4 invoke GetSystemMetrics, 0 mov esi, eax sub eax, 80 cmp eax, 1120 jle @F mov eax, 1120 @@: mov widthPx, eax invoke GetSystemMetrics, 1 mov edi, eax sub eax, 120 mov heightPx, eax mov eax, widthPx imul eax, 3 shr eax, 2 cmp eax, heightPx jle @F mov eax, heightPx imul eax, 4 xor edx, edx mov ecx, 3 div ecx mov widthPx, eax @@: mov eax, widthPx imul eax, 3 shr eax, 2 mov clientRect3D[12], eax mov eax, widthPx mov clientRect3D[8], eax invoke AdjustWindowRectEx, OFFSET clientRect3D, WS_OVERLAPPEDWINDOW, 0, 0 mov eax, clientRect3D[8] sub eax, clientRect3D mov widthPx, eax sub esi, eax sar esi, 1 mov eax, clientRect3D[12] sub eax, clientRect3D[4] mov heightPx, eax sub edi, eax sar edi, 1 invoke CreateWindowExA, 0, OFFSET sz3DClassName, OFFSET sz3DWindowTitle, WS_OVERLAPPEDWINDOW, esi, edi, widthPx, heightPx, 0, 0, h3DInst, 0 test eax, eax jz window_failed mov h3DWnd, eax invoke GetDC, h3DWnd mov h3DDC, eax test eax, eax jz window_failed invoke SetStretchBltMode, h3DDC, 3 ; Resize while hidden. Init3DEngine paints the ident before showing it. mov fullscreen3D, 0 call ToggleFullscreen3D mov eax, 1 window_failed: ret Create3DWindow ENDP LoadTextures3D PROC uses ebx local count:DWORD invoke CreateFileA, OFFSET szTexturesRelPath, 80000000h, 1, 0, 3, 80h, 0 cmp eax, -1 je assets_failed mov ebx, eax invoke ReadFile, ebx, OFFSET texturesBuffer, 48*128*128*4, ADDR count, 0 push eax invoke CloseHandle, ebx pop eax test eax, eax jz assets_failed cmp count, 48*128*128*4 jne assets_failed mov eax, 1 ret assets_failed: invoke MessageBoxA, h3DWnd, OFFSET textMissing3D, OFFSET sz3DWindowTitle, 10h xor eax, eax ret LoadTextures3D ENDP Present3D PROC uses ebx esi edi local viewW:DWORD local viewH:DWORD local offsetX:DWORD local offsetY:DWORD invoke GetClientRect, h3DWnd, OFFSET clientRect3D mov esi, clientRect3D[8] mov edi, clientRect3D[12] test esi, esi jz present_done test edi, edi jz present_done cmp displayFill3D, 0 je present_keep_aspect mov viewW, esi mov viewH, edi jmp present_geometry_ready present_keep_aspect: mov viewW, esi mov eax, esi imul eax, 3 shr eax, 2 cmp eax, edi jle @F mov eax, edi imul eax, 4 xor edx, edx mov ecx, 3 div ecx mov viewW, eax mov eax, edi @@: mov viewH, eax present_geometry_ready: mov ebx, esi sub ebx, viewW shr ebx, 1 mov offsetX, ebx mov ebx, edi sub ebx, viewH shr ebx, 1 mov offsetY, ebx mov viewTop3D, ebx mov eax, offsetX mov viewLeft3D, eax mov eax, viewW mov viewWidth3D, eax mov eax, viewH mov viewHeight3D, eax ; Only clear the letterbox bars, never erase under the next frame. cmp offsetY, 0 je @F invoke PatBlt, h3DDC, 0, 0, esi, offsetY, 42h @@: mov eax, offsetY add eax, viewH mov ecx, edi sub ecx, eax test ecx, ecx jz @F invoke PatBlt, h3DDC, 0, eax, esi, ecx, 42h @@: cmp offsetX, 0 je @F invoke PatBlt, h3DDC, 0, 0, offsetX, edi, 42h @@: mov eax, offsetX add eax, viewW mov ecx, esi sub ecx, eax test ecx, ecx jz @F invoke PatBlt, h3DDC, eax, 0, ecx, edi, 42h @@: invoke StretchDIBits, h3DDC, offsetX, offsetY, viewW, viewH, 0, 0, SCREEN_W, SCREEN_H, OFFSET screenBuffer, OFFSET bmi3D, 0, SRCCOPY present_done: ret Present3D ENDP ToggleFullscreen3D PROC uses ebx esi edi local visibleStyle:DWORD invoke GetWindowLongA, h3DWnd, -16 and eax, 10000000h mov visibleStyle, eax cmp fullscreen3D, 0 jne restore_window invoke GetWindowRect, h3DWnd, OFFSET savedRect3D invoke MonitorFromWindow, h3DWnd, 2 invoke GetMonitorInfoA, eax, OFFSET monitor3D test eax, eax jz fullscreen_done mov eax, visibleStyle or eax, 80000000h invoke SetWindowLongA, h3DWnd, -16, eax mov eax, monitor3D[12] sub eax, monitor3D[4] mov ebx, monitor3D[16] sub ebx, monitor3D[8] invoke SetWindowPos, h3DWnd, 0, monitor3D[4], monitor3D[8], eax, ebx, 24h mov fullscreen3D, 1 ret restore_window: mov eax, visibleStyle or eax, WS_OVERLAPPEDWINDOW invoke SetWindowLongA, h3DWnd, -16, eax mov eax, savedRect3D[8] sub eax, savedRect3D mov ebx, savedRect3D[12] sub ebx, savedRect3D[4] invoke SetWindowPos, h3DWnd, 0, savedRect3D, savedRect3D[4], eax, ebx, 24h mov fullscreen3D, 0 fullscreen_done: ret ToggleFullscreen3D ENDP UpdateCamera3D PROC uses ebx mov eax, playerAngle and eax, 511 mov ebx, tableCos[eax*4] mov playerDirX, ebx mov eax, tableSin[eax*4] mov playerDirY, eax imul eax, -66 cdq mov ecx, 100 idiv ecx mov playerPlaneX, eax mov eax, playerDirX imul eax, 66 cdq idiv ecx mov playerPlaneY, eax ret UpdateCamera3D ENDP ; Four corners of a 0.3-tile-wide body; bounds checked before every map read. CanWalk3D PROC uses ebx esi edi px:DWORD, py:DWORD invoke CanWalkHall3D, px, py test eax, eax jz walk_blocked mov esi, -9830 walk_corner_x: mov edi, -9830 walk_corner_y: mov eax, px add eax, esi sar eax, 16 cmp eax, MAP_WIDTH jae walk_blocked mov ebx, eax mov eax, py add eax, edi sar eax, 16 cmp eax, MAP_HEIGHT jae walk_blocked shl eax, 5 add eax, ebx mov ecx, worldMap3D cmp BYTE PTR [ecx+eax], 0 jne walk_blocked add edi, 19660 cmp edi, 9830 jle walk_corner_y add esi, 19660 cmp esi, 9830 jle walk_corner_x mov eax, 1 ret walk_blocked: xor eax, eax ret CanWalk3D ENDP LoadProgress3D PROC uses ebx mov bankroll, 10000 mov ownedBacks3D, 1 mov selectedBack3D, 0 invoke CreateFileA, OFFSET savePath3D, 80000000h, 1, 0, 3, 80h, 0 cmp eax, -1 je progress_loaded mov ebx, eax invoke ReadFile, ebx, OFFSET saveData3D, 16, OFFSET saveIo3D, 0 invoke CloseHandle, ebx cmp saveIo3D, 16 jne progress_loaded cmp saveData3D, 33443343h je progress_version_ok cmp saveData3D, 32443343h jne progress_loaded ; Preserve the old preview's gold/emerald/crimson purchases by identity. mov edx, 1 test saveData3D[8], 2 jz @F or edx, 8 @@: test saveData3D[8], 4 jz @F or edx, 20h @@: test saveData3D[8], 8 jz @F or edx, 4 @@: mov saveData3D[8], edx mov ecx, saveData3D[12] cmp ecx, 3 ja progress_loaded mov eax, previewBackMap3D[ecx*4] mov saveData3D[12], eax progress_version_ok: mov eax, saveData3D[4] cmp eax, 1000000000 ja progress_loaded mov bankroll, eax mov eax, saveData3D[8] and eax, 1FFFh or eax, 1 mov ownedBacks3D, eax mov ecx, saveData3D[12] cmp ecx, 12 ja progress_loaded bt eax, ecx jnc progress_loaded mov selectedBack3D, ecx progress_loaded: ret LoadProgress3D ENDP SaveProgress3D PROC uses ebx IFDEF CASINO_ACTION_TEST ret ENDIF cmp arrivalConfirmed3D, 0 je progress_saved cmp nativeProfileActive3D, 0 je @F call SaveGraphicProfile3D ret @@: invoke CreateDirectoryA, OFFSET runtime3D, 0 mov saveData3D, 33443343h mov eax, bankroll mov saveData3D[4], eax mov eax, ownedBacks3D mov saveData3D[8], eax mov eax, selectedBack3D mov saveData3D[12], eax invoke CreateFileA, OFFSET savePath3D, 40000000h, 0, 0, 2, 80h, 0 cmp eax, -1 je progress_saved mov ebx, eax invoke WriteFile, ebx, OFFSET saveData3D, 16, OFFSET saveIo3D, 0 invoke CloseHandle, ebx progress_saved: ret SaveProgress3D ENDP