KAZIK/src_graphics/native_blackjack.inc
Игорь Федосеев fed880cce2 feat(charms): port and integrate roguelike charms system into 3D casino
- Add 4 unique charms: Clover of Luck, Golden Horseshoe, Skull of Immortality, Devil's Contract

- Add Sidorovich shop tabs ([РУБАШКИ] / [ТАЛИСМАНЫ]) with TAB/arrow navigation and purchases

- Extend casino3d-progress.dat to 32 bytes with backward-compatible save/load

- Hook event triggers into Blackjack, Poker, Durak, Coin, Dice, Scratch, Slots, Roulette, Russian Roulette, Buckshot, and Hell Tower

- Display active charm badges on HUD and Hell Tower briefing
2026-10-16 13:48:11 +03:00

345 lines
7.7 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 InitBJParty3D
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
call ResolveBJParty3D
mov eax, result
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 TriggerCharmLossProtection, cbStake3D
test eax, eax
jnz bj_settle_save
invoke PlayCasinoSound3D, OFFSET soundRoundLose, 0, 1
bj_settle_save:
call ClearKeys3D
xor eax,eax
cmp cbOutcome3D,0
sete al
cmp cbOutcome3D,3
jne @F
mov eax,1
@@:
invoke NpcRecordRound3D,1,eax
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 cbEarlyOutcome3D, -1
mov cbBotsSettled3D, 0
mov cbInitialFlights3D, 4
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
cmp cbBotCount3D, 0
je @F
call DealBJParty3D
@@:
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
cmp cbCursor3D, 52
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
call BJPartyInput3D
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
cmp cbState3D, CB_BOTS
jne @F
call UpdateBJParty3D
ret
@@:
mov eax, deltaTime3D
add cbTimer3D, eax
cmp cbState3D, CB_DEAL
jne bj_animate_hit
mov eax, cbInitialFlights3D
imul eax, TABLE_FLIGHT_MS
cmp cbTimer3D, eax
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 FinishBJPlayer3D, 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 FinishBJPlayer3D, 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
cmp cbCursor3D, 52
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:
cmp cbEarlyOutcome3D, -1
je @F
invoke NativeBJSettle3D, cbEarlyOutcome3D
ret
@@:
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:
invoke FinishBJPlayer3D, -1
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
@@:
cmp tournamentMode, 1
jne bj_regular_start
cmp cbState3D, CB_RESULT
jne bj_regular_start
invoke Pressed3D, 20h
test eax, eax
jnz bj_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz bj_tourney_report
ret
bj_tourney_report:
cmp cbOutcome3D, 1
je bj_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
bj_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
bj_regular_start:
invoke Pressed3D, 20h
test eax, eax
jz bj_input_done
call StartNativeBlackjack3D
bj_input_done:
ret
HandleNativeBlackjack3D ENDP
include src_graphics\native_blackjack_party.inc