; 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