KAZIK/src_graphics/platform_code.inc
Artvasil09 797ee366dc feat: implement upper lounge, manual stairs, cabaret, and casino terminals
- Native player-controlled stairs, upper lounge bar, and Hell Tower infernal portal
- Cabaret stage with musical acts, audience seating, and interaction
- Dedicated cash/trophy wall terminals with native balance and achievement screens
- Projecting 3D wall lanterns with ray/plane intersection
- Six roaming guests with seated poses and card rank rendering updates
- Synchronized launcher hash and updated binaries
2026-10-18 21:36:12 +03:00

587 lines
14 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
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
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
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