Compare commits

...

7 commits

9 changed files with 1722 additions and 4308 deletions

Binary file not shown.

View file

@ -34,6 +34,17 @@ CopyFileA PROTO :DWORD,:DWORD,:DWORD
lstrcmpiA PROTO :DWORD,:DWORD
GetFileSize PROTO :DWORD,:DWORD
Sleep PROTO :DWORD
CreateThread PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
CreateEventA PROTO :DWORD,:DWORD,:DWORD,:DWORD
SetEvent PROTO :DWORD
WaitForSingleObject PROTO :DWORD,:DWORD
timeBeginPeriod PROTO :DWORD
timeEndPeriod PROTO :DWORD
timeGetTime PROTO
GetCursorPos PROTO :DWORD
SetCursorPos PROTO :DWORD,:DWORD
ShowCursor PROTO :DWORD
ClientToScreen PROTO :DWORD,:DWORD
C3D_POINT STRUCT
x dd ?
@ -164,6 +175,16 @@ h3DWnd dd 0
h3DDC dd 0
hCasinoConsole dd 0
ALIGN 4
hRaycastThread dd 0
hRaycastStartEvent dd 0
hRaycastDoneEvent dd 0
bRaycastQuit dd 0
raycastThreadId dd 0
ALIGN 4
mouseLocked3D dd 0
bmi3D C3D_BITMAPINFO <>
msg3D C3D_MSG <>
wc3D C3D_WNDCLASSEX <>
@ -696,7 +717,7 @@ DrawString8x8 ENDP
; --- True 3D Perspective Floor & Ceiling Rendering ---
; --- DDA Raycasting Walls ---
RenderWalls PROC
RenderWallsRange PROC colStart:DWORD, colLimit:DWORD
local col:DWORD
local originalStart:DWORD
local camX:DWORD
@ -746,9 +767,11 @@ RenderWalls PROC
idiv ecx
mov playerPlaneY, eax
mov col, 0
mov eax, colStart
mov col, eax
col_loop:
cmp col, SCREEN_W
mov eax, colLimit
cmp col, eax
jge walls_done
mov eax, col
@ -1231,6 +1254,69 @@ walls_done:
pop esi
pop ebx
ret
RenderWallsRange ENDP
; --- Raycasting Background Worker Thread ---
RaycastWorkerProc PROC uses ebx esi edi lpParam:DWORD
worker_loop:
invoke WaitForSingleObject, hRaycastStartEvent, 0FFFFFFFFh
cmp bRaycastQuit, 1
je worker_exit
invoke RenderWallsRange, 320, 640
invoke SetEvent, hRaycastDoneEvent
jmp worker_loop
worker_exit:
xor eax, eax
ret
RaycastWorkerProc ENDP
; --- Multi-Threaded DDA Raycasting Walls Dispatcher ---
RenderWalls PROC
push ebx
push esi
push edi
mov eax, playerAngle
and eax, 511
mov ebx, [tableCos + eax*4]
mov playerDirX, ebx
mov ebx, [tableSin + eax*4]
mov playerDirY, ebx
mov eax, ebx
imul eax, -66
cdq
mov ecx, 100
idiv ecx
mov playerPlaneX, eax
mov eax, playerDirX
imul eax, 66
cdq
idiv ecx
mov playerPlaneY, eax
cmp hRaycastStartEvent, 0
je single_thread_fallback
; Signal background worker to render columns [320..640)
invoke SetEvent, hRaycastStartEvent
; Main thread processes columns [0..320) in parallel
invoke RenderWallsRange, 0, 320
; Synchronize with worker completion
invoke WaitForSingleObject, hRaycastDoneEvent, 0FFFFFFFFh
jmp walls_finished
single_thread_fallback:
invoke RenderWallsRange, 0, SCREEN_W
walls_finished:
pop edi
pop esi
pop ebx
ret
RenderWalls ENDP
; --- Render 3D Billboard Sprites ---
@ -4310,10 +4396,101 @@ skill_render_keys:
ret
RenderSkillGame ENDP
; --- Mouse Lock & Unlock Routines for Free Camera Look ---
LockMouse3D PROC
LOCAL rcClient[16]:BYTE
LOCAL ptCenter:C3D_POINT
cmp mouseLocked3D, 1
je lock_done
mov mouseLocked3D, 1
invoke ShowCursor, 0
lea eax, rcClient
invoke GetClientRect, h3DWnd, eax
mov eax, dword ptr rcClient[8]
shr eax, 1
mov ptCenter.x, eax
mov eax, dword ptr rcClient[12]
shr eax, 1
mov ptCenter.y, eax
lea eax, ptCenter
invoke ClientToScreen, h3DWnd, eax
invoke SetCursorPos, ptCenter.x, ptCenter.y
lock_done:
ret
LockMouse3D ENDP
UnlockMouse3D PROC
cmp mouseLocked3D, 0
je unlock_done
mov mouseLocked3D, 0
invoke ShowCursor, 1
unlock_done:
ret
UnlockMouse3D ENDP
UpdateMouseLockState PROC
cmp engineMode, MODE_WALK
jne unlock_it
cmp paused3D, 0
jne unlock_it
invoke GetForegroundWindow
cmp eax, h3DWnd
jne unlock_it
invoke IsIconic, h3DWnd
test eax, eax
jnz unlock_it
call LockMouse3D
ret
unlock_it:
call UnlockMouse3D
ret
UpdateMouseLockState ENDP
HandlePlayerInput PROC uses ebx esi edi
local speed:DWORD
local nextX:DWORD
local nextY:DWORD
local fwdDir:DWORD
local strafeDir:DWORD
local deltaMoveX:DWORD
local deltaMoveY:DWORD
local rcClient[16]:BYTE
local ptCenter:C3D_POINT
local ptCursor:C3D_POINT
; --- Mouse Look Camera Rotation ---
cmp mouseLocked3D, 1
jne skip_mouse_look
lea eax, rcClient
invoke GetClientRect, h3DWnd, eax
mov eax, dword ptr rcClient[8]
shr eax, 1
mov ptCenter.x, eax
mov eax, dword ptr rcClient[12]
shr eax, 1
mov ptCenter.y, eax
lea eax, ptCenter
invoke ClientToScreen, h3DWnd, eax
lea eax, ptCursor
invoke GetCursorPos, eax
mov eax, ptCursor.x
sub eax, ptCenter.x
test eax, eax
jz mouse_recenter
cmp eax, 64
jle @F
mov eax, 64
@@:
cmp eax, -64
jge @F
mov eax, -64
@@:
add playerAngle, eax
mouse_recenter:
invoke SetCursorPos, ptCenter.x, ptCenter.y
skip_mouse_look:
; Movement speed with sprint (Shift = 10h)
mov eax, deltaTime3D
imul eax, 200
mov speed, eax
@ -4321,53 +4498,101 @@ HandlePlayerInput PROC uses ebx esi edi
je @F
shl speed, 1
@@:
; --- Keyboard Arrow Turning (VK_LEFT = 25h, VK_RIGHT = 27h) ---
mov eax, deltaTime3D
shr eax, 2
inc eax
cmp keys3D[41h], 0
jne input_turn_left
cmp keys3D[25h], 0
je input_right
input_turn_left:
je @F
sub playerAngle, eax
input_right:
cmp keys3D[44h], 0
jne input_turn_right
@@:
cmp keys3D[27h], 0
je input_forward
input_turn_right:
je @F
add playerAngle, eax
input_forward:
@@:
and playerAngle, 511
call UpdateCamera3D
xor edi, edi
; --- Forward / Backward Direction (W / Up / S / Down) ---
mov fwdDir, 0
cmp keys3D[57h], 0
jne input_go_forward
jne @F
cmp keys3D[26h], 0
je input_back
input_go_forward:
inc edi
input_back:
je check_back_key
@@:
inc fwdDir
check_back_key:
cmp keys3D[53h], 0
jne input_go_back
jne @F
cmp keys3D[28h], 0
je input_move
input_go_back:
dec edi
input_move:
je check_strafe_keys
@@:
dec fwdDir
check_strafe_keys:
; --- Strafe Direction (A = Left, D = Right) ---
mov strafeDir, 0
cmp keys3D[44h], 0
je @F
inc strafeDir
@@:
cmp keys3D[41h], 0
je @F
dec strafeDir
@@:
; --- Movement Calculation ---
mov deltaMoveX, 0
mov deltaMoveY, 0
; Forward / Backward component
mov edi, fwdDir
test edi, edi
jz input_action
jz calc_strafe_comp
imul edi, speed
mov eax, playerDirX
imul edi
shrd eax, edx, 16
add eax, playerX
mov nextX, eax
add deltaMoveX, eax
mov eax, playerDirY
imul edi
shrd eax, edx, 16
add eax, playerY
add deltaMoveY, eax
calc_strafe_comp:
; Strafe Left / Right component: Right vector is (-playerDirY, playerDirX)
mov edi, strafeDir
test edi, edi
jz check_total_movement
imul edi, speed
mov eax, playerDirY
neg eax
imul edi
shrd eax, edx, 16
add deltaMoveX, eax
mov eax, playerDirX
imul edi
shrd eax, edx, 16
add deltaMoveY, eax
check_total_movement:
mov eax, deltaMoveX
or eax, deltaMoveY
jz input_action
mov eax, playerX
add eax, deltaMoveX
mov nextX, eax
mov eax, playerY
add eax, deltaMoveY
mov nextY, eax
invoke CanWalk3D, nextX, playerY
test eax, eax
jz @F
@ -4379,6 +4604,7 @@ input_move:
jz input_action
mov eax, nextY
mov playerY, eax
input_action:
invoke Pressed3D, 45h
test eax, eax
@ -4437,238 +4663,7 @@ interaction_done:
ret
CheckInteractions ENDP
; --- RenderCabinetBezel: Îòðèñîâêà àðêàäíîãî áåçåëÿ òåðìèíàëà íà 3D ýêðàíå ---
RenderCabinetBezel PROC uses ebx esi edi, pTitle:DWORD
; Çàòåìíÿåì 3D-çàë â áóôåðå êàäðà (äåëèì ÿðêîñòü ïîïîëàì)
mov ecx, SCREEN_SIZE
xor esi, esi
dim_bezel_loop:
mov eax, [screenBuffer + esi*4]
shr eax, 1
and eax, 007F7F7Fh
mov [screenBuffer + esi*4], eax
inc esi
loop dim_bezel_loop
; Âíåøíÿÿ çîëîòàÿ ðàìêà òåðìèíàëà
invoke DrawBoxBorder, 10, 14, 300, 212, 000C0E14h, 00D8BC6Ah, 2
; Øàïêà òåðìèíàëà ñ íàçâàíèåì èãðû
invoke DrawBox, 12, 16, 296, 16, 00221A10h
invoke DrawString8x8, 20, 20, pTitle, 00F5E2B0h
; Ïîäâàëüíàÿ ïëàøêà ñ ïîäñêàçêîé ïî âûõîäó
invoke DrawBox, 12, 210, 296, 14, 00141416h
invoke DrawString8x8, 20, 213, OFFSET textCabinetFooter, 00AAAAAAh
; Âûâîäèì êàäð áåçåëÿ â îêíî
call Present3D
ret
RenderCabinetBezel ENDP
; --- LaunchClassicGame: Âñòðàèâàíèå èãðû â UI òåðìèíàëà êàçèíî ---
LaunchClassicGame PROC uses ebx esi edi, pGameProc:DWORD, gameId:DWORD, pTitle:DWORD
LOCAL rcClient[16]:BYTE
LOCAL ptScreen[8]:BYTE
LOCAL fontInfo[84]:BYTE
LOCAL conWnd:DWORD
LOCAL conW:DWORD, conH:DWORD, conX:DWORD, conY:DWORD
LOCAL viewW:DWORD, viewH:DWORD
LOCAL offsetX:DWORD, offsetY:DWORD
mov eax, gameId
mov currentGameId, eax
; 1. Ðèñóåì çîëîòîé áåçåëü òåðìèíàëà íà 3D ýêðàíå
cmp pTitle, 0
je @F
invoke RenderCabinetBezel, pTitle
@@:
; 2. Âûäåëÿåì êîíñîëü
invoke AllocConsole
test eax, eax
jz launch_ret
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hOut, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov hIn, eax
invoke SetConsoleCP, 1251
invoke SetConsoleOutputCP, 1251
cmp pTitle, 0
je @F
invoke SetConsoleTitleA, pTitle
@@:
call EnableAnsi
call ConfigureConsoleSize
; 3. Íàñòðàèâàåì øðèôò Consolas Bold 16pt
lea edi, fontInfo
xor eax, eax
mov ecx, 21
rep stosd
mov dword ptr fontInfo[0], 84 ; cbSize
mov word ptr fontInfo[8], 0 ; dwFontSize.X
mov word ptr fontInfo[10], 16 ; dwFontSize.Y
mov dword ptr fontInfo[16], 700 ; FontWeight = FW_BOLD
mov word ptr fontInfo[20], 'C'
mov word ptr fontInfo[22], 'o'
mov word ptr fontInfo[24], 'n'
mov word ptr fontInfo[26], 's'
mov word ptr fontInfo[28], 'o'
mov word ptr fontInfo[30], 'l'
mov word ptr fontInfo[32], 'a'
mov word ptr fontInfo[34], 's'
mov word ptr fontInfo[36], 0
lea eax, fontInfo
invoke SetCurrentConsoleFontEx, hOut, 0, eax
; 4. Ïîëó÷àåì äåñêðèïòîð îêíà êîíñîëè
invoke GetConsoleWindow
mov conWnd, eax
test eax, eax
jz run_game_body
; 5. Ñíèìàåì ñèñòåìíóþ ðàìêó Windows è çàãîëîâîê ñ êíîïêàìè çàêðûòèÿ/ñâîðà÷èâàíèÿ
invoke GetWindowLongA, conWnd, -16 ; GWL_STYLE
and eax, NOT (00C00000h or 00040000h or 00080000h or 00010000h or 00020000h)
or eax, 80000000h ; WS_POPUP
invoke SetWindowLongA, conWnd, -16, eax
; Ñâÿçûâàåì êàê äî÷åðíåå/ïðèíàäëåæàùåå îêíî ê îêíó èãðû
cmp h3DWnd, 0
je show_con_fallback
invoke SetWindowLongA, conWnd, -8, h3DWnd ; GWL_HWNDPARENT
; 6. Âû÷èñëÿåì òî÷íûå êîîðäèíàòû äëÿ ïîñàäêè ýêðàíà âíóòðü áåçåëÿ
lea eax, rcClient
invoke GetClientRect, h3DWnd, eax
mov esi, dword ptr rcClient[8] ; øèðèíà êëèåíòñêîé îáëàñòè
mov edi, dword ptr rcClient[12] ; âûñîòà êëèåíòñêîé îáëàñòè
test esi, esi
jz show_con_fallback
test edi, edi
jz show_con_fallback
; Ðàñ÷åò âüþïîðòà 4:3 òî÷íî êàê â Present3D
mov viewW, esi
mov eax, esi
imul eax, 3
shr eax, 2
cmp eax, edi
jle calc_view_h
mov eax, edi
imul eax, 4
xor edx, edx
mov ecx, 3
div ecx
mov viewW, eax
mov eax, edi
calc_view_h:
mov viewH, eax
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 dword ptr ptScreen[0], 0
mov dword ptr ptScreen[4], 0
lea eax, ptScreen
invoke ClientToScreen, h3DWnd, eax
; conW = viewW * 280 / 320 (âíóòðåííåå îêíî áåçåëÿ)
mov eax, viewW
imul eax, 280
xor edx, edx
mov ecx, 320
div ecx
mov conW, eax
; conH = viewH * 168 / 240
mov eax, viewH
imul eax, 168
xor edx, edx
mov ecx, 240
div ecx
mov conH, eax
; conX = ptScreen.x + offsetX + (viewW * 20 / 320)
mov eax, viewW
imul eax, 20
xor edx, edx
mov ecx, 320
div ecx
add eax, offsetX
add eax, dword ptr ptScreen[0]
mov conX, eax
; conY = ptScreen.y + offsetY + (viewH * 38 / 240)
mov eax, viewH
imul eax, 38
xor edx, edx
mov ecx, 240
div ecx
add eax, offsetY
add eax, dword ptr ptScreen[4]
mov conY, eax
; Ïîçèöèîíèðóåì áåçðàìî÷íûé ýêðàí òî÷íî âíóòðü çîëîòîé ðàìêè áåçåëÿ
invoke SetWindowPos, conWnd, 0, conX, conY, conW, conH, 20h or 40h ; SWP_FRAMECHANGED | SWP_SHOWWINDOW
jmp set_con_focus
show_con_fallback:
invoke ShowWindow, conWnd, 5 ; SW_SHOW
set_con_focus:
invoke SetForegroundWindow, conWnd
invoke SetFocus, conWnd
run_game_body:
invoke PlayCasinoSound3D, 0, 0, 0
call InitSounds
; Çàïóñê îðèãèíàëüíîé èãðû!
call pGameProc
call CloseLegacySounds3D
; Çàêðûâàåì êîíñîëü
invoke FreeConsole
mov hOut, 0
mov hIn, 0
; Âîçâðàùàåì ôîêóñ â îêíî 3D èãðû
cmp h3DWnd, 0
je cleanup_game_input
invoke SetForegroundWindow, h3DWnd
invoke SetFocus, h3DWnd
cleanup_game_input:
mov ecx, 256
xor eax, eax
lea edi, keys3D
rep stosb
mov ecx, 256
lea edi, pressedKeys3D
rep stosb
invoke GetTickCount
mov previousTick3D, eax
mov frameStart3D, eax
mov deltaTime3D, 0
call SaveProgress3D
launch_ret:
ret
LaunchClassicGame ENDP
; (Legacy console arcade bezel bridge removed)
Trigger3DInteraction PROC
call TriggerHallInteraction3D
@ -4846,6 +4841,7 @@ Init3DEngine PROC
push esi
push edi
invoke timeBeginPeriod, 1
call LoadDisplaySettings3D
call Create3DWindow
test eax, eax
@ -4856,6 +4852,15 @@ Init3DEngine PROC
call InitializeCasinoSprites3D
; Initialize raycasting worker thread and sync events
invoke CreateEventA, 0, 0, 0, 0
mov hRaycastStartEvent, eax
invoke CreateEventA, 0, 0, 0, 0
mov hRaycastDoneEvent, eax
mov bRaycastQuit, 0
invoke CreateThread, 0, 65536, OFFSET RaycastWorkerProc, 0, 0, ADDR raycastThreadId
mov hRaycastThread, eax
call InitHall3D
call BeginStartup3D
call RenderStartup3D
@ -5154,7 +5159,7 @@ StartCasino3D PROC uses ebx esi edi
call Init3DEngine
test eax, eax
jz engine_shutdown
invoke GetTickCount
invoke timeGetTime
mov rngSeed3D, eax
mov previousTick3D, eax
engine_loop:
@ -5168,7 +5173,7 @@ engine_loop:
jmp engine_loop
dispatch_frame:
invoke GetTickCount
invoke timeGetTime
mov frameStart3D, eax
sub eax, previousTick3D
cmp eax, 50
@ -5222,6 +5227,7 @@ leave_idle_table:
call ClearKeys3D
invoke PlayCasinoSound3D, 0, 0, 0
engine_tick:
call UpdateMouseLockState
cmp paused3D, 0
jne draw_pause
mov eax, deltaTime3D
@ -5467,7 +5473,7 @@ present_frame:
xor eax, eax
mov ecx, 64
rep stosd
invoke GetTickCount
invoke timeGetTime
sub eax, frameStart3D
mov ecx, 16
cmp settingsLowSpec, 1
@ -5484,9 +5490,23 @@ present_frame:
invoke Sleep, ecx
jmp engine_loop
engine_idle:
call UnlockMouse3D
invoke Sleep, 50
jmp engine_loop
engine_shutdown:
call UnlockMouse3D
cmp hRaycastThread, 0
je @F
mov bRaycastQuit, 1
invoke SetEvent, hRaycastStartEvent
invoke WaitForSingleObject, hRaycastThread, 1000
invoke CloseHandle, hRaycastThread
invoke CloseHandle, hRaycastStartEvent
invoke CloseHandle, hRaycastDoneEvent
mov hRaycastThread, 0
mov hRaycastStartEvent, 0
mov hRaycastDoneEvent, 0
@@:
call SaveProgress3D
invoke PlayCasinoSound3D, 0, 0, 0
call FreeRussianAssets3D
@ -5495,7 +5515,7 @@ engine_shutdown:
call FreeBuckshotAssets3D
call FreeNativeSlots3D
call FreeNativeClover3D
call FreePyramidAssets3D
call FreePyramidAssets3D
call FreeArrivalAssets3D
cmp h3DDC, 0
je @F
@ -5507,6 +5527,7 @@ engine_shutdown:
invoke DestroyWindow, h3DWnd
mov h3DWnd, 0
@@:
invoke timeEndPeriod, 1
ret
StartCasino3D ENDP
@ -5515,3 +5536,4 @@ include src_graphics\platform_code.inc
IFDEF CASINO_ACTION_TEST
include tools\tests\casino_actions_test.inc
ENDIF

2834
poker.asm

File diff suppressed because it is too large Load diff

BIN
poker.exe

Binary file not shown.

BIN
poker.obj

Binary file not shown.

Binary file not shown.

View file

@ -118,7 +118,7 @@ ProjectCityPoint3D ENDP
DrawCityObject3D PROC uses ebx esi edi object:DWORD,firstSourceRow:DWORD
local depth:DWORD,left:DWORD,top:DWORD,widthPx:DWORD,heightPx:DWORD
local xEnd:DWORD,yEnd:DWORD,xStart:DWORD,yStart:DWORD
local xRight:DWORD,yEnd:DWORD,xStart:DWORD,yStart:DWORD
local xStep:DWORD,yStep:DWORD,texColumn:DWORD,source:DWORD,row:DWORD,asset:DWORD
local sourceWidth:DWORD,sourceHeight:DWORD,sourcePitch:DWORD,cropX:DWORD,cropY:DWORD
IFDEF CASINO_ACTION_TEST
@ -224,7 +224,7 @@ city_object_project:
jle @F
mov eax, SCREEN_W
@@:
mov xEnd, eax
mov xRight, eax
cmp xStart, 0
jge @F
mov xStart, 0
@ -242,7 +242,7 @@ city_object_project:
mov yStart, 0
@@:
mov eax, xStart
cmp eax, xEnd
cmp eax, xRight
jge city_object_done
mov eax, yStart
cmp eax, yEnd
@ -334,7 +334,7 @@ city_object_next_row:
jb city_object_row
city_object_next_column:
inc ebx
cmp ebx, xEnd
cmp ebx, xRight
jb city_object_column
city_object_done:
ret

View file

@ -25,6 +25,9 @@ RenderPatrons3D PROTO
ResolveWorldSurface3D PROTO :DWORD
include src_graphics\hall_layout.inc
.data
ALIGN 4
tableInvDelta3D dd 241 dup(0)
tableStepRatio3D dd 241 dup(0)
hallSign3D AnimPack3D <>
hallSignPath3D db "assets\animations\hall\sign.bin",0
hallCityDetail3D AnimPack3D <>

File diff suppressed because it is too large Load diff