609 lines
15 KiB
PHP
609 lines
15 KiB
PHP
; Main and owned coin-detail windows are processed on the same thread; no CMD fallback.
|
|
WindowEvents3D PROC uses ebx esi edi hwnd:DWORD, uMsg:DWORD, wp:DWORD, lp:DWORD
|
|
cmp engineMode,MODE_SCRATCH
|
|
jne @F
|
|
invoke ScratchMouseEvent3D,hwnd,uMsg,wp,lp
|
|
test eax,eax
|
|
jz @F
|
|
ret
|
|
@@:
|
|
cmp uMsg, 102h
|
|
jne @F
|
|
invoke ArrivalChar3D, wp
|
|
xor eax, eax
|
|
ret
|
|
@@:
|
|
cmp uMsg, 201h
|
|
je event_mouse_down
|
|
cmp uMsg,203h
|
|
jne @F
|
|
cmp engineMode,MODE_POOL
|
|
je event_mouse_down
|
|
jmp event_default
|
|
@@:
|
|
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,50
|
|
jb event_done
|
|
cmp eax,211
|
|
jae event_done
|
|
@@:
|
|
cmp uMsg,203h
|
|
je pyr_event_pick
|
|
mov pyrPickClick3D,0
|
|
jmp pyr_event_pick_done
|
|
pyr_event_pick:
|
|
mov pyrPickClick3D,1
|
|
pyr_event_pick_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
|
|
local detailOpen:DWORD
|
|
mov eax,coinDetailWnd3D
|
|
mov detailOpen,eax
|
|
call CloseCoinDetail3D
|
|
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
|
|
jmp fullscreen_done
|
|
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:
|
|
cmp detailOpen,0
|
|
je @F
|
|
call OpenCoinDetail3D
|
|
@@:
|
|
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
|
|
mov charmCloverUses, 0
|
|
mov charmHorseshoeUses, 0
|
|
mov charmSkullUses, 0
|
|
mov charmDevilUses, 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, 32, OFFSET saveIo3D, 0
|
|
invoke CloseHandle, ebx
|
|
cmp saveIo3D, 16
|
|
jb 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
|
|
cmp saveIo3D, 32
|
|
jb progress_loaded
|
|
mov eax, saveData3D[16]
|
|
mov charmCloverUses, eax
|
|
mov eax, saveData3D[20]
|
|
mov charmHorseshoeUses, eax
|
|
mov eax, saveData3D[24]
|
|
mov charmSkullUses, eax
|
|
mov eax, saveData3D[28]
|
|
mov charmDevilUses, eax
|
|
progress_loaded:
|
|
ret
|
|
LoadProgress3D ENDP
|
|
|
|
SaveProgress3D PROC uses ebx
|
|
IFDEF CASINO_ACTION_TEST
|
|
ret
|
|
ENDIF
|
|
cmp arrivalConfirmed3D, 0
|
|
je progress_saved
|
|
call RefreshTerminalAchievements3D
|
|
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
|
|
mov eax, charmCloverUses
|
|
mov saveData3D[16], eax
|
|
mov eax, charmHorseshoeUses
|
|
mov saveData3D[20], eax
|
|
mov eax, charmSkullUses
|
|
mov saveData3D[24], eax
|
|
mov eax, charmDevilUses
|
|
mov saveData3D[28], 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, 32, OFFSET saveIo3D, 0
|
|
invoke CloseHandle, ebx
|
|
progress_saved:
|
|
ret
|
|
SaveProgress3D ENDP
|