; 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