InitBJParty3D PROC uses edi invoke LoadAnimPack3D,OFFSET cbPartyRoom3D,OFFSET cbPartyRoomPath3D cmp cbPartyRoom3D.frames,1 jne bj_party_invalid_room cmp cbPartyRoom3D.imageWidth,SCREEN_W jne bj_party_invalid_room cmp cbPartyRoom3D.height,SCREEN_H je bj_party_room_ready bj_party_invalid_room: invoke FreeAnimPack3D,OFFSET cbPartyRoom3D bj_party_room_ready: cmp cbBotCount3D,3 jbe @F mov cbBotCount3D,0 @@: mov cbEarlyOutcome3D,-1 mov cbBotsSettled3D,0 mov cbBotTurn3D,0 mov cbBotTimer3D,0 lea edi,cbBots3D mov ecx,SIZEOF BJBot3D*3/4 xor eax,eax rep stosd invoke LoadAnimPack3D,OFFSET cbPartyArt3D,OFFSET cbPartyArtPath3D cmp cbPartyArt3D.frames,6 jne bj_party_invalid_art cmp cbPartyArt3D.imageWidth,160 jne bj_party_invalid_art cmp cbPartyArt3D.height,160 jne bj_party_invalid_art ret bj_party_invalid_art: call FreeBJParty3D ret InitBJParty3D ENDP FreeBJParty3D PROC invoke FreeAnimPack3D,OFFSET cbPartyArt3D invoke FreeAnimPack3D,OFFSET cbPartyRoom3D ret FreeBJParty3D ENDP ; Round-robin: player, each guest, then dealer. Old solo order is unchanged. DealBJParty3D PROC uses ebx esi edi call InitBJParty3D mov eax,cbBotCount3D add eax,2 shl eax,1 mov cbInitialFlights3D,eax mov cbCursor3D,0 xor edi,edi bj_party_deal_pass: mov ecx,cbCursor3D mov eax,cbDeck3D[ecx*4] mov cbPlayer3D[edi*4],eax inc cbCursor3D xor ebx,ebx bj_party_deal_guest: cmp ebx,cbBotCount3D jae bj_party_deal_dealer mov esi,ebx imul esi,SIZEOF BJBot3D add esi,OFFSET cbBots3D mov ecx,cbCursor3D mov eax,cbDeck3D[ecx*4] mov [esi+edi*4].BJBot3D.cards,eax inc cbCursor3D mov [esi].BJBot3D.count,2 mov eax,cbBet3D mov [esi].BJBot3D.stake,eax inc ebx jmp bj_party_deal_guest bj_party_deal_dealer: mov ecx,cbCursor3D mov eax,cbDeck3D[ecx*4] mov cbDealer3D[edi*4],eax inc cbCursor3D inc edi cmp edi,2 jb bj_party_deal_pass xor ebx,ebx bj_party_deal_score: cmp ebx,cbBotCount3D jae bj_party_deal_done mov esi,ebx imul esi,SIZEOF BJBot3D add esi,OFFSET cbBots3D invoke NativeBJScore3D,esi,2 mov [esi].BJBot3D.score,eax inc ebx jmp bj_party_deal_score bj_party_deal_done: ret DealBJParty3D ENDP BeginBJDealer3D PROC mov cbVisible3D,1 mov cbState3D,CB_DEALER mov cbTimer3D,0 call ClearKeys3D ret BeginBJDealer3D ENDP ; Keep the table alive after a player bust/natural so other seats finish. FinishBJPlayer3D PROC pending:DWORD mov eax,pending mov cbEarlyOutcome3D,eax cmp cbBotCount3D,0 je bj_party_solo_finish mov cbBotTurn3D,0 mov cbBotTimer3D,0 mov cbState3D,CB_BOTS call ClearKeys3D ret bj_party_solo_finish: cmp pending,-1 jne @F call BeginBJDealer3D ret @@: invoke NativeBJSettle3D,pending ret FinishBJPlayer3D ENDP ; No hidden dealer card, other hands, future deck cards or RNG are consulted. BJBotDecision3D PROC uses ebx esi slot:DWORD cmp slot,3 jae bj_bot_stand mov esi,slot imul esi,SIZEOF BJBot3D add esi,OFFSET cbBots3D cmp [esi].BJBot3D.count,12 jae bj_bot_stand mov eax,cbDealer3D xor edx,edx mov ecx,13 div ecx lea ebx,[edx+2] cmp ebx,11 jbe @F mov ebx,10 @@: cmp edx,12 jne @F mov ebx,11 @@: mov eax,[esi].BJBot3D.score cmp eax,21 jae bj_bot_stand cmp [esi].BJBot3D.count,2 jne bj_bot_threshold cmp eax,11 jne bj_bot_threshold cmp ebx,10 jae bj_bot_threshold mov eax,2 ret bj_bot_threshold: mov ecx,17 cmp slot,1 jne @F mov ecx,19 @@: cmp slot,2 jne @F cmp ebx,7 jae @F mov ecx,13 @@: cmp eax,ecx jae bj_bot_stand mov eax,1 ret bj_bot_stand: xor eax,eax ret BJBotDecision3D ENDP UpdateBJParty3D PROC uses ebx esi mov eax,deltaTime3D cmp eax,250 jbe @F mov eax,250 @@: add cbBotTimer3D,eax mov ebx,cbBotTurn3D cmp ebx,cbBotCount3D jae bj_bot_finish_table mov esi,ebx imul esi,SIZEOF BJBot3D add esi,OFFSET cbBots3D cmp [esi].BJBot3D.state,BJ_BOT_FLIGHT je bj_bot_commit cmp cbBotTimer3D,BJ_PARTY_MS jb bj_bot_tick_done invoke BJBotDecision3D,ebx test eax,eax jz bj_bot_finish_seat cmp cbCursor3D,52 jae bj_bot_finish_seat cmp eax,2 jne @F shl [esi].BJBot3D.stake,1 @@: mov ecx,cbCursor3D mov eax,cbDeck3D[ecx*4] mov cbBotCard3D,eax inc cbCursor3D mov cbBotTimer3D,0 mov [esi].BJBot3D.state,BJ_BOT_FLIGHT invoke PlayCasinoSound3D,OFFSET soundCards,0,1 ret bj_bot_commit: cmp cbBotTimer3D,TABLE_FLIGHT_MS jb bj_bot_tick_done mov ecx,[esi].BJBot3D.count cmp ecx,12 jae bj_bot_finish_seat mov eax,cbBotCard3D mov [esi+ecx*4].BJBot3D.cards,eax inc [esi].BJBot3D.count invoke NativeBJScore3D,esi,[esi].BJBot3D.count mov [esi].BJBot3D.score,eax cmp eax,21 jae bj_bot_finish_seat mov eax,cbBet3D cmp [esi].BJBot3D.stake,eax ja bj_bot_finish_seat mov [esi].BJBot3D.state,BJ_BOT_WAIT mov cbBotTimer3D,0 ret bj_bot_finish_seat: mov [esi].BJBot3D.state,BJ_BOT_DONE inc cbBotTurn3D mov cbBotTimer3D,0 ret bj_bot_finish_table: call BeginBJDealer3D bj_bot_tick_done: ret UpdateBJParty3D ENDP ResolveBJParty3D PROC uses ebx esi cmp cbBotsSettled3D,0 jne bj_bot_resolve_done mov cbBotsSettled3D,1 xor ebx,ebx bj_bot_resolve: cmp ebx,cbBotCount3D jae bj_bot_resolve_done mov esi,ebx imul esi,SIZEOF BJBot3D add esi,OFFSET cbBots3D mov [esi].BJBot3D.state,BJ_BOT_DONE mov eax,1 mov ecx,[esi].BJBot3D.score cmp ecx,21 ja bj_bot_result cmp cbDealerScore3D,21 jne bj_bot_no_dealer_natural cmp cbDealerCount3D,2 jne bj_bot_no_dealer_natural cmp ecx,21 jne bj_bot_result cmp [esi].BJBot3D.count,2 jne bj_bot_result mov eax,2 jmp bj_bot_result bj_bot_no_dealer_natural: cmp ecx,21 jne bj_bot_compare cmp [esi].BJBot3D.count,2 jne bj_bot_compare mov eax,3 jmp bj_bot_result bj_bot_compare: cmp cbDealerScore3D,21 ja bj_bot_won cmp ecx,cbDealerScore3D jb bj_bot_result je bj_bot_pushed bj_bot_won: xor eax,eax jmp bj_bot_result bj_bot_pushed: mov eax,2 bj_bot_result: mov [esi].BJBot3D.outcome,eax inc ebx jmp bj_bot_resolve bj_bot_resolve_done: ret ResolveBJParty3D ENDP SetBJPartyCount3D PROC count:DWORD cmp count,3 ja bj_party_count_done cmp cbState3D,CB_IDLE je @F cmp cbState3D,CB_RESULT jne bj_party_count_done @@: mov eax,count cmp eax,cbBotCount3D je bj_party_count_done mov cbBotCount3D,eax mov cbState3D,CB_IDLE mov cbPlayerCount3D,0 mov cbDealerCount3D,0 mov cbStake3D,0 mov cbError3D,0 call InitBJParty3D bj_party_count_done: ret SetBJPartyCount3D ENDP BJPartyInput3D PROC uses ebx cmp cbState3D,CB_IDLE je @F cmp cbState3D,CB_RESULT jne bj_party_input_done @@: xor ebx,ebx bj_party_key: lea eax,[ebx+30h] invoke Pressed3D,eax test eax,eax jz @F invoke SetBJPartyCount3D,ebx ret @@: inc ebx cmp ebx,4 jb bj_party_key cmp mouseClick3D,0 je bj_party_input_done cmp mouseY3D,35 jb bj_party_input_done cmp mouseY3D,51 jae bj_party_input_done mov eax,mouseX3D sub eax,212 jc bj_party_input_done cmp eax,100 jae bj_party_input_done xor edx,edx mov ecx,25 div ecx cmp edx,22 jae bj_party_input_done invoke SetBJPartyCount3D,eax mov mouseClick3D,0 bj_party_input_done: ret BJPartyInput3D ENDP include src_graphics\native_blackjack_party_render.inc