KAZIK/src_graphics/native_wheel.inc
Artvasil09 3ad5bf4c9d Develop assembly-only casino scenes and native games
Add native Durak, poker, blackjack, roulette, Buckshot and billiards scenes with animation assets and regression tests. Improve arrival, city, hall, profiles, shops, audio and exit handling; remove the portable C game core and refresh shipping executables.
2026-10-08 22:39:19 +03:00

380 lines
8 KiB
PHP

InitNativeWheel3D PROC uses edi
lea edi, wheelBets3D
xor eax, eax
mov ecx, 49
rep stosd
mov roulState, 0
mov wheelStake3D, 0
mov wheelReturn3D, 0
mov wheelTime3D, 0
ret
InitNativeWheel3D ENDP
WheelAddBet3D PROC index:DWORD
cmp roulState, 1
je wheel_add_done
mov ecx, index
cmp ecx, 48
ja wheel_add_done
mov eax, wheelStake3D
add eax, wheelChip3D
jc wheel_add_done
cmp eax, bankroll
ja wheel_add_done
mov wheelStake3D, eax
mov eax, wheelChip3D
add wheelBets3D[ecx*4], eax
wheel_add_done:
ret
WheelAddBet3D ENDP
; Gross returns include the stake, so zero is a loss for every outside bet.
WheelBetMultiplier3D PROC uses ebx index:DWORD,result:DWORD
mov ecx, index
mov ebx, result
xor eax, eax
cmp ecx, 37
jae wheel_outside
cmp ecx, ebx
jne wheel_multiplier_done
mov eax, 36
ret
wheel_outside:
test ebx, ebx
jz wheel_multiplier_done
cmp ecx, 39
jae wheel_parity
bt wheelRedMask3D, ebx
setc al
cmp ecx, 37
je @F
xor eax, 1
@@:
shl eax, 1
ret
wheel_parity:
cmp ecx, 41
jae wheel_halves
mov eax, ebx
and eax, 1
cmp ecx, 40
je @F
xor eax, 1
@@:
shl eax, 1
ret
wheel_halves:
cmp ecx, 43
jae wheel_dozen_column
cmp ebx, 18
seta al
cmp ecx, 42
je @F
xor eax, 1
@@:
shl eax, 1
ret
wheel_dozen_column:
mov eax, ebx
dec eax
xor edx, edx
cmp ecx, 46
jae wheel_column
mov ebx, 12
div ebx
sub ecx, 43
cmp eax, ecx
jne wheel_multiplier_zero
mov eax, 3
ret
wheel_column:
mov ebx, 3
div ebx
sub ecx, 46
cmp edx, ecx
jne wheel_multiplier_zero
mov eax, 3
ret
wheel_multiplier_zero:
xor eax, eax
wheel_multiplier_done:
ret
WheelBetMultiplier3D ENDP
WheelSettle3D PROC uses ebx esi
cmp roulState, 1
jne wheel_settle_done
mov wheelReturn3D, 0
xor esi, esi
wheel_settle_loop:
invoke WheelBetMultiplier3D, esi,wheelResult3D
mul wheelBets3D[esi*4]
test edx, edx
jnz wheel_settle_cap
add wheelReturn3D, eax
jc wheel_settle_cap
cmp wheelReturn3D, 1000000000
jbe wheel_settle_next
wheel_settle_cap:
mov wheelReturn3D, 1000000000
wheel_settle_next:
inc esi
cmp esi, 49
jb wheel_settle_loop
mov eax, wheelReturn3D
add bankroll, eax
jc wheel_bank_cap
cmp bankroll, 1000000000
jbe @F
wheel_bank_cap:
mov bankroll, 1000000000
@@:
mov roulState, 2
call SaveProgress3D
wheel_settle_done:
ret
WheelSettle3D ENDP
HandleNativeWheel3D PROC uses ebx esi edi
cmp roulState, 1
jne wheel_draft_input
mov eax, deltaTime3D
add wheelTime3D, eax
cmp wheelTime3D, 4200
jb wheel_handle_done
call WheelSettle3D
ret
wheel_draft_input:
cmp roulState, 2
jne @F
; Keep last winnings visible, but a new spin begins with an empty layout.
lea edi, wheelBets3D
xor eax, eax
mov ecx, 49
rep stosd
mov wheelStake3D, 0
mov roulState, 0
@@:
invoke Pressed3D, 57h
test eax, eax
jz @F
cmp wheelChip3D, 1000000
jae @F
add wheelChip3D, 50
@@:
invoke Pressed3D, 53h
test eax, eax
jz @F
cmp wheelChip3D, 50
jbe @F
sub wheelChip3D, 50
@@:
invoke Pressed3D, 08h
test eax, eax
jz wheel_mouse
call InitNativeWheel3D
wheel_mouse:
cmp mouseClick3D, 0
je wheel_spin_input
cmp mouseY3D, 123
jb wheel_button
cmp mouseY3D, 183
jae wheel_mouse_outside
cmp mouseX3D, 60
jae wheel_mouse_number
cmp mouseX3D, 24
jb wheel_spin_input
invoke WheelAddBet3D, 0
jmp wheel_spin_input
wheel_mouse_number:
cmp mouseX3D, 300
jae wheel_spin_input
mov eax, mouseX3D
sub eax, 60
xor edx, edx
mov ecx, 20
div ecx
imul ebx, eax, 3
mov eax, mouseY3D
sub eax, 123
xor edx, edx
div ecx
add eax, ebx
inc eax
invoke WheelAddBet3D, eax
jmp wheel_spin_input
wheel_mouse_outside:
cmp mouseY3D, 223
jae wheel_button
cmp mouseX3D, 24
jb wheel_spin_input
cmp mouseX3D, 300
jae wheel_spin_input
mov eax, mouseX3D
sub eax, 24
xor edx, edx
mov ecx, 46
div ecx
mov ebx, eax
mov eax, mouseY3D
sub eax, 183
xor edx, edx
mov ecx, 20
div ecx
imul eax, 6
add eax, ebx
add eax, 37
invoke WheelAddBet3D, eax
jmp wheel_spin_input
wheel_button:
cmp mouseY3D, 105
jb wheel_spin_input
cmp mouseY3D, 121
jae wheel_spin_input
cmp mouseX3D, 230
jb wheel_spin_input
mov pressedKeys3D[20h], 1
wheel_spin_input:
invoke Pressed3D, 20h
test eax, eax
jz wheel_handle_done
mov eax, wheelStake3D
test eax, eax
jz wheel_handle_done
cmp eax, bankroll
ja wheel_handle_done
sub bankroll, eax
mov roulState, 1
mov wheelTime3D, 0
invoke RandomRange3D, 37
mov wheelResult3D, eax
call SaveProgress3D
invoke PlayCasinoSound3D, OFFSET soundRoulette,0,1
wheel_handle_done:
ret
HandleNativeWheel3D ENDP
RenderNativeWheel3D PROC uses ebx esi edi
local x:DWORD,y:DWORD,ink:DWORD,angle:DWORD
invoke DrawBox,0,0,320,240,00142D22h
invoke DrawString8x8,16,12,OFFSET wheelTitle3D,00E5D29Eh
invoke DrawNumber,206,12,bankroll,00F4E7C8h
invoke DrawCircle,160,66,42,00886E42h
invoke DrawCircle,160,66,38,00232C29h
invoke DrawCircle,160,66,24,005E422Bh
xor esi, esi
wheel_result_slot:
mov eax, wheelOrder3D[esi*4]
cmp eax, wheelResult3D
je wheel_slot_found
inc esi
cmp esi, 37
jb wheel_result_slot
wheel_slot_found:
mov eax, esi
imul eax, 512
xor edx, edx
mov ecx, 37
div ecx
cmp roulState, 1
jne @F
mov ecx, 4200
sub ecx, wheelTime3D
imul ecx, 3
add eax, ecx
@@:
and eax, 511
mov angle, eax
mov ebx, tableCos[eax*4]
imul ebx, 34
sar ebx, 16
add ebx, 160
mov edx, tableSin[eax*4]
imul edx, 34
sar edx, 16
add edx, 66
invoke DrawCircle,ebx,edx,3,00F4EAD8h
invoke DrawNumber,153,60,wheelResult3D,00FFFFFFh
invoke DrawString8x8,18,104,OFFSET wheelAmountText3D,00DEDACAh
invoke DrawNumber,74,104,wheelChip3D,00FFFFFFh
invoke DrawString8x8,116,104,OFFSET wheelStakedText3D,00DEDACAh
invoke DrawNumber,180,104,wheelStake3D,00FFFFFFh
invoke DrawBoxBorder,230,104,70,16,00423929h,00C6AA66h,1
invoke DrawString8x8,250,108,OFFSET wheelSpin3D,00FFFFFFh
invoke DrawBoxBorder,24,123,34,60,00174A33h,009C9A76h,1
invoke DrawNumber,36,147,0,00FFFFFFh
cmp wheelBets3D, 0
je @F
invoke DrawCircle,49,174,3,00DCC671h
@@:
mov esi, 1
wheel_render_numbers:
mov eax, esi
dec eax
xor edx, edx
mov ecx, 3
div ecx
imul eax, 20
add eax, 60
mov x, eax
imul edx, 20
add edx, 123
mov y, edx
mov ink, 001E2523h
bt wheelRedMask3D, esi
jnc @F
mov ink, 00822C32h
@@:
invoke DrawBoxBorder,x,y,20,20,ink,009C9A76h,1
mov ebx, x
add ebx, 2
mov edi, y
add edi, 4
invoke DrawNumber,ebx,edi,esi,00FFFFFFh
cmp wheelBets3D[esi*4], 0
je @F
add ebx, 12
add edi, 11
invoke DrawCircle,ebx,edi,2,00EAD47Eh
@@:
inc esi
cmp esi, 37
jb wheel_render_numbers
xor esi, esi
wheel_render_outside:
mov eax, esi
xor edx, edx
mov ecx, 6
div ecx
imul eax, 20
add eax, 183
mov y, eax
imul edx, 46
add edx, 24
mov x, edx
invoke DrawBoxBorder,x,y,46,20,0022392Ah,009C9A76h,1
mov ebx, x
add ebx, 3
mov edi, y
add edi, 5
invoke DrawString8x8,ebx,edi,wheelLabels3D[esi*4],00E4D7B4h
lea eax, [esi+37]
cmp wheelBets3D[eax*4], 0
je @F
add ebx, 35
add edi, 10
invoke DrawCircle,ebx,edi,2,00EAD47Eh
@@:
inc esi
cmp esi, 12
jb wheel_render_outside
invoke DrawString8x8,24,228,OFFSET wheelPaidText3D,00D3C08Fh
invoke DrawNumber,88,228,wheelReturn3D,00FFFFFFh
ret
RenderNativeWheel3D ENDP
DrawNumber PROC x:DWORD,y:DWORD,value:DWORD,ink:DWORD
invoke FormatNumber,value,OFFSET hudNumBuffer
invoke DrawString8x8,x,y,OFFSET hudNumBuffer,ink
ret
DrawNumber ENDP