KAZIK/src_graphics/native_blackjack.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

289 lines
6.2 KiB
PHP

; Single 52-card deck; dealer stands on all 17s, blackjack pays 3:2.
InitNativeBlackjack3D PROC
mov cardExitActive3D, 0
call LoadCardTableAssets3D
mov cbState3D, CB_IDLE
mov cbPlayerCount3D, 0
mov cbDealerCount3D, 0
mov cbStake3D, 0
mov cbError3D, 0
call ClearKeys3D
ret
InitNativeBlackjack3D ENDP
NativeBJScore3D PROC uses ebx esi edi hand:DWORD,count:DWORD
mov esi, hand
xor edi, edi
xor ebx, ebx
xor ecx, ecx
bj_score_card:
cmp ecx, count
jae bj_score_soft
mov eax, [esi+ecx*4]
push ecx
xor edx, edx
mov ecx, 13
div ecx
pop ecx
inc ecx
cmp edx, 12
je bj_score_ace
add edx, 2
cmp edx, 10
jbe @F
mov edx, 10
@@:
add edi, edx
jmp bj_score_card
bj_score_ace:
add edi, 11
inc ebx
jmp bj_score_card
bj_score_soft:
cmp edi, 21
jbe bj_score_done
test ebx, ebx
jz bj_score_done
sub edi, 10
dec ebx
jmp bj_score_soft
bj_score_done:
mov eax, edi
ret
NativeBJScore3D ENDP
NativeBJSettle3D PROC result:DWORD
cmp cbState3D, CB_RESULT
je bj_settle_done
mov cbState3D, CB_RESULT
mov cbVisible3D, 1
mov eax, result
mov cbOutcome3D, eax
cmp eax, 1
je bj_settle_loss
mov eax, cbStake3D
cmp result, 2
je bj_settle_credit
shl eax, 1
cmp result, 3
jne bj_settle_credit
mov edx, cbStake3D
shr edx, 1
add eax, edx
bj_settle_credit:
add bankroll, eax
invoke PlayCasinoSound3D, OFFSET soundRoundWin, 0, 1
jmp bj_settle_save
bj_settle_loss:
invoke PlayCasinoSound3D, OFFSET soundRoundLose, 0, 1
bj_settle_save:
call ClearKeys3D
call SaveProgress3D
bj_settle_done:
ret
NativeBJSettle3D ENDP
StartNativeBlackjack3D PROC
cmp cbState3D, CB_IDLE
je @F
cmp cbState3D, CB_RESULT
jne bj_start_done
@@:
mov eax, cbBet3D
cmp bankroll, eax
jb bj_start_empty
sub bankroll, eax
mov cbStake3D, eax
mov cbError3D, 0
mov cbDouble3D, 0
mov cbVisible3D, 0
mov cbPlayerCount3D, 2
mov cbDealerCount3D, 2
mov cbCursor3D, 4
invoke ShuffleCards3D, OFFSET cbDeck3D
mov eax, cbDeck3D[0]
mov cbPlayer3D[0], eax
mov eax, cbDeck3D[4]
mov cbDealer3D[0], eax
mov eax, cbDeck3D[8]
mov cbPlayer3D[4], eax
mov eax, cbDeck3D[12]
mov cbDealer3D[4], eax
invoke NativeBJScore3D, OFFSET cbPlayer3D, 2
mov cbPlayerScore3D, eax
invoke NativeBJScore3D, OFFSET cbDealer3D, 2
mov cbDealerScore3D, eax
mov cbTimer3D, 0
mov cbState3D, CB_DEAL
call ClearKeys3D
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
call SaveProgress3D
bj_start_done:
ret
bj_start_empty:
mov cbError3D, 1
ret
StartNativeBlackjack3D ENDP
NativeBJHit3D PROC uses ebx
cmp cbState3D, CB_PLAYER
jne bj_hit_done
cmp cbPlayerCount3D, 12
jae bj_hit_done
mov ebx, cbCursor3D
mov eax, cbDeck3D[ebx*4]
mov cbCard3D, eax
inc cbCursor3D
mov cbTimer3D, 0
mov cbState3D, CB_HIT
call ClearKeys3D
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
bj_hit_done:
ret
NativeBJHit3D ENDP
HandleNativeBlackjack3D PROC uses ebx
call HandleCardExit3D
test eax, eax
jnz bj_input_done
invoke CardTableMouse3D, MODE_BLACKJACK
cmp cardExitActive3D, 0
jne bj_input_done
cmp engineMode, MODE_BLACKJACK
jne bj_input_done
cmp cbState3D, CB_IDLE
je bj_ready_input
cmp cbState3D, CB_RESULT
je bj_ready_input
cmp cbState3D, CB_PLAYER
je bj_player_input
mov eax, deltaTime3D
add cbTimer3D, eax
cmp cbState3D, CB_DEAL
jne bj_animate_hit
cmp cbTimer3D, TABLE_FLIGHT_MS*4
jb bj_input_done
cmp cbDealerScore3D, 21
jne bj_player_natural
mov eax, 1
cmp cbPlayerScore3D, 21
jne @F
mov eax, 2
@@:
invoke NativeBJSettle3D, eax
ret
bj_player_natural:
cmp cbPlayerScore3D, 21
jne bj_begin_player
invoke NativeBJSettle3D, 3
ret
bj_begin_player:
mov cbState3D, CB_PLAYER
call ClearKeys3D
ret
bj_animate_hit:
cmp cbState3D, CB_HIT
jne bj_animate_dealer
cmp cbTimer3D, TABLE_FLIGHT_MS
jb bj_input_done
mov ebx, cbPlayerCount3D
mov eax, cbCard3D
mov cbPlayer3D[ebx*4], eax
inc cbPlayerCount3D
invoke NativeBJScore3D, OFFSET cbPlayer3D, cbPlayerCount3D
mov cbPlayerScore3D, eax
cmp eax, 21
ja bj_player_bust
je bj_begin_dealer
cmp cbDouble3D, 0
jne bj_begin_dealer
jmp bj_begin_player
bj_player_bust:
invoke NativeBJSettle3D, 1
ret
bj_animate_dealer:
cmp cbTimer3D, 600
jb bj_input_done
cmp cbDealerScore3D, 17
jae bj_compare_hands
cmp cbDealerCount3D, 12
jae bj_compare_hands
mov ebx, cbCursor3D
mov eax, cbDeck3D[ebx*4]
inc cbCursor3D
mov ebx, cbDealerCount3D
mov cbDealer3D[ebx*4], eax
inc cbDealerCount3D
invoke NativeBJScore3D, OFFSET cbDealer3D, cbDealerCount3D
mov cbDealerScore3D, eax
mov cbTimer3D, 0
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
ret
bj_compare_hands:
mov eax, cbDealerScore3D
cmp eax, 21
ja bj_player_win
cmp eax, cbPlayerScore3D
jb bj_player_win
je bj_player_push
invoke NativeBJSettle3D, 1
ret
bj_player_win:
invoke NativeBJSettle3D, 0
ret
bj_player_push:
invoke NativeBJSettle3D, 2
ret
bj_player_input:
invoke Pressed3D, 44h
test eax, eax
jz @F
cmp cbPlayerCount3D, 2
jne bj_input_done
mov eax, cbStake3D
cmp bankroll, eax
jb bj_input_done
sub bankroll, eax
add cbStake3D, eax
mov cbDouble3D, 1
call SaveProgress3D
call NativeBJHit3D
ret
@@:
invoke Pressed3D, 48h
test eax, eax
jz @F
call NativeBJHit3D
ret
@@:
invoke Pressed3D, 53h
test eax, eax
jz bj_input_done
bj_begin_dealer:
mov cbVisible3D, 1
mov cbState3D, CB_DEALER
mov cbTimer3D, 0
call ClearKeys3D
ret
bj_ready_input:
invoke Pressed3D, 26h
test eax, eax
jz @F
cmp cbBet3D, 10000
jae @F
add cbBet3D, 100
@@:
invoke Pressed3D, 28h
test eax, eax
jz @F
cmp cbBet3D, 100
jbe @F
sub cbBet3D, 100
@@:
invoke Pressed3D, 20h
test eax, eax
jz bj_input_done
call StartNativeBlackjack3D
bj_input_done:
ret
HandleNativeBlackjack3D ENDP