DrawBJPartySelector3D PROC uses ebx esi edi xor edi,edi cmp cbState3D,CB_IDLE je @F cmp cbState3D,CB_RESULT jne bj_party_selector @@: mov edi,1 bj_party_selector: invoke DrawString8x8,176,39,OFFSET cbBotsLabel3D,00D4C5A4h xor ebx,ebx bj_party_selector_loop: mov esi,ebx imul esi,25 add esi,212 mov ecx,00454D48h test edi,edi jz @F mov ecx,00D1B16Eh @@: mov eax,00202D26h cmp ebx,cbBotCount3D jne @F mov eax,003B6C59h @@: invoke DrawBoxBorder,esi,35,22,16,eax,ecx,1 lea edx,cbPartyDigit3D[ebx*2] lea eax,[esi+7] invoke DrawString8x8,eax,39,edx,00F2E9D3h inc ebx cmp ebx,4 jb bj_party_selector_loop ret DrawBJPartySelector3D ENDP ; Smaller guest cards retain an unambiguous rank and suit, never fake identities. DrawBJMiniCard3D PROC uses ebx esi x:DWORD,y:DWORD,card:DWORD,hidden:DWORD local ink:DWORD,rank:DWORD,suit:DWORD mov ecx,00EEEDE2h cmp hidden,0 je @F mov ecx,004A2941h @@: invoke DrawBoxBorder,x,y,20,30,ecx,00BCA878h,1 cmp hidden,0 jne bj_mini_back mov eax,card xor edx,edx mov ecx,13 div ecx mov suit,eax mov rank,edx mov ink,00191F24h cmp eax,1 je @F cmp eax,2 jne bj_mini_face @@: mov ink,00BF263Ch bj_mini_face: mov edx,rank lea edx,[edx+edx*2] add edx,OFFSET cardRankNames3D mov eax,x add eax,2 mov ecx,y add ecx,3 invoke DrawString8x8,eax,ecx,edx,ink mov eax,x add eax,6 mov edx,y add edx,17 invoke DrawNativeSuit3D,eax,edx,suit,ink ret bj_mini_back: mov eax,x add eax,4 mov edx,y add edx,4 invoke DrawBoxBorder,eax,edx,12,22,004A2941h,00C9B589h,1 ret DrawBJMiniCard3D ENDP DrawBJMiniFlight3D PROC uses ebx x:DWORD,y:DWORD,card:DWORD,timeMs:DWORD local px:DWORD,py:DWORD mov ebx,timeMs cmp ebx,TABLE_FLIGHT_MS jbe @F mov ebx,TABLE_FLIGHT_MS @@: mov eax,x sub eax,170 imul eax,ebx cdq mov ecx,TABLE_FLIGHT_MS idiv ecx add eax,170 mov px,eax mov eax,y sub eax,24 imul eax,ebx cdq idiv ecx add eax,24 mov py,eax invoke QueueTableHand3D,px,py,timeMs,0 invoke DrawBJMiniCard3D,px,py,card,0 ret DrawBJMiniFlight3D ENDP RenderBJParty3D PROC uses ebx esi edi local guest:DWORD,stepX:DWORD,px:DWORD,pose:DWORD,shown:DWORD,slide:DWORD,cardId:DWORD,hide:DWORD call RenderCardTable3D cmp cbPartyRoom3D.pixels,0 je @F mov esi,cbPartyRoom3D.pixels lea edi,screenBuffer mov ecx,SCREEN_SIZE rep movsd @@: invoke DrawBox,0,0,320,52,00151D20h invoke DrawString8x8,8,6,OFFSET cbTitle3D,00E8D7ADh invoke DrawString8x8,8,20,OFFSET cbDealerLabel3D,00D1B16Eh invoke DrawString8x8,192,20,OFFSET textBank3D,00A8DDB9h invoke FormatNumber,bankroll,OFFSET hudNumBuffer invoke DrawString8x8,240,20,OFFSET hudNumBuffer,00F4F3E8h call DrawBJPartySelector3D xor edi,edi bj_party_render_guest: cmp edi,cbBotCount3D jae bj_party_render_dealer mov esi,edi imul esi,SIZEOF BJBot3D add esi,OFFSET cbBots3D mov guest,esi mov ebx,cbPartyX3D[edi*4] invoke DrawString8x8,ebx,54,cbPartyNames3D[edi*4],00E8D7ADh mov pose,edi cmp cbState3D,CB_BOTS jne @F cmp edi,cbBotTurn3D jne @F add pose,3 @@: mov eax,ebx add eax,4 shl eax,1 invoke DrawAnimSprite3D,OFFSET cbPartyArt3D,pose,eax,112,144,144 cmp cbState3D,CB_IDLE je bj_party_next_guest cmp cbState3D,CB_DEAL je @F invoke FormatNumber,[esi].BJBot3D.score,OFFSET hudNumBuffer lea eax,[ebx+64] invoke DrawString8x8,eax,54,OFFSET hudNumBuffer,00EDDFB1h @@: mov eax,[esi].BJBot3D.count mov shown,eax cmp cbState3D,CB_BOTS jne @F cmp edi,cbBotTurn3D jne @F cmp [esi].BJBot3D.state,BJ_BOT_FLIGHT jne @F inc shown inc eax @@: mov stepX,16 cmp eax,4 jbe @F dec eax mov ecx,eax mov eax,60 xor edx,edx div ecx mov stepX,eax @@: xor ebx,ebx bj_party_guest_card: mov eax,ebx imul eax,stepX add eax,cbPartyX3D[edi*4] mov px,eax cmp ebx,[esi].BJBot3D.count jb bj_party_guest_existing invoke DrawBJMiniFlight3D,px,124,cbBotCard3D,cbBotTimer3D jmp bj_party_guest_next_card bj_party_guest_existing: mov edx,[esi+ebx*4].BJBot3D.cards mov cardId,edx cmp cbState3D,CB_DEAL jne bj_party_guest_fixed mov eax,cbBotCount3D add eax,2 imul eax,ebx lea eax,[eax+edi+1] imul eax,TABLE_FLIGHT_MS mov ecx,cbTimer3D sub ecx,eax js bj_party_guest_next_card invoke DrawBJMiniFlight3D,px,124,cardId,ecx jmp bj_party_guest_next_card bj_party_guest_fixed: invoke DrawBJMiniCard3D,px,124,cardId,0 bj_party_guest_next_card: inc ebx cmp ebx,shown jb bj_party_guest_card mov ecx,OFFSET cbBotWaitText3D cmp cbState3D,CB_RESULT jne bj_party_guest_live_status mov eax,[esi].BJBot3D.outcome mov ecx,cbBotResults3D[eax*4] jmp bj_party_guest_status bj_party_guest_live_status: cmp [esi].BJBot3D.state,BJ_BOT_DONE jne @F mov ecx,OFFSET cbBotStandText3D @@: cmp [esi].BJBot3D.score,21 jbe @F mov ecx,OFFSET cbBotBustText3D @@: cmp cbState3D,CB_BOTS jne bj_party_guest_status cmp edi,cbBotTurn3D jne bj_party_guest_status mov ecx,OFFSET cbBotHitText3D bj_party_guest_status: mov eax,cbPartyX3D[edi*4] invoke DrawString8x8,eax,158,ecx,00DCE7DBh bj_party_next_guest: inc edi jmp bj_party_render_guest bj_party_render_dealer: cmp cbState3D,CB_IDLE je bj_party_render_controls mov stepX,22 cmp cbDealerCount3D,5 jbe @F mov eax,cbDealerCount3D dec eax mov ecx,eax mov eax,100 xor edx,edx div ecx mov stepX,eax @@: xor ebx,ebx bj_party_dealer_card: mov eax,ebx imul eax,stepX add eax,64 mov px,eax mov edx,cbDealer3D[ebx*4] mov cardId,edx mov hide,0 cmp ebx,1 jne @F cmp cbVisible3D,0 jne @F mov hide,1 @@: cmp cbState3D,CB_DEAL jne bj_party_dealer_fixed mov eax,cbBotCount3D add eax,2 imul eax,ebx add eax,cbBotCount3D inc eax imul eax,TABLE_FLIGHT_MS mov ecx,cbTimer3D sub ecx,eax js bj_party_dealer_next ; Initial dealer cards stay inside the header, with the hole card hidden. bj_party_dealer_fixed: invoke DrawBJMiniCard3D,px,20,cardId,hide bj_party_dealer_next: inc ebx cmp ebx,cbDealerCount3D jb bj_party_dealer_card xor ebx,ebx mov shown,0 cmp cbState3D,CB_HIT jne @F mov shown,1 @@: mov eax,cbPlayerCount3D add shown,eax mov stepX,40 cmp shown,4 jbe @F mov eax,shown dec eax mov ecx,eax mov eax,126 xor edx,edx div ecx mov stepX,eax @@: mov eax,shown dec eax imul eax,stepX add eax,34 mov edx,320 sub edx,eax shr edx,1 mov slide,edx bj_party_player_card: mov eax,ebx imul eax,stepX add eax,slide mov px,eax cmp ebx,cbPlayerCount3D jb bj_party_player_existing invoke DrawSlidingCard3D,px,168,cbCard3D,0,cbTimer3D jmp bj_party_player_next bj_party_player_existing: mov edx,cbPlayer3D[ebx*4] mov cardId,edx cmp cbState3D,CB_DEAL jne bj_party_player_fixed mov eax,cbBotCount3D add eax,2 imul eax,ebx imul eax,TABLE_FLIGHT_MS mov ecx,cbTimer3D sub ecx,eax js bj_party_player_next invoke DrawSlidingCard3D,px,168,cardId,0,ecx jmp bj_party_player_next bj_party_player_fixed: invoke DrawNativeCard3D,px,168,cardId,0,34 bj_party_player_next: inc ebx cmp ebx,shown jb bj_party_player_card invoke DrawString8x8,64,174,OFFSET cbPartyPlayerText3D,00E8D7ADh invoke FormatNumber,cbPlayerScore3D,OFFSET hudNumBuffer invoke DrawString8x8,64,188,OFFSET hudNumBuffer,00EDDFB1h bj_party_render_controls: call DrawQueuedTableHand3D ; UI labels stay above animated hands instead of disappearing during a deal. invoke DrawBox,0,52,320,10,00151D20h xor edi,edi bj_party_final_names: cmp edi,cbBotCount3D jae bj_party_final_names_done mov ebx,cbPartyX3D[edi*4] invoke DrawString8x8,ebx,54,cbPartyNames3D[edi*4],00E8D7ADh cmp cbState3D,CB_IDLE je bj_party_final_name_next cmp cbState3D,CB_DEAL je bj_party_final_name_next mov esi,edi imul esi,SIZEOF BJBot3D add esi,OFFSET cbBots3D invoke FormatNumber,[esi].BJBot3D.score,OFFSET hudNumBuffer lea eax,[ebx+64] invoke DrawString8x8,eax,54,OFFSET hudNumBuffer,00EDDFB1h bj_party_final_name_next: inc edi jmp bj_party_final_names bj_party_final_names_done: invoke DrawString8x8,8,174,OFFSET textBet3D,00DDCFB1h invoke FormatNumber,cbBet3D,OFFSET hudNumBuffer invoke DrawString8x8,8,186,OFFSET hudNumBuffer,00F6F4DDh xor edi,edi cmp cbState3D,CB_IDLE je bj_party_ready cmp cbState3D,CB_RESULT je bj_party_ready invoke DrawStakeControls3D,0 cmp cbState3D,CB_PLAYER jne @F mov edi,1 @@: invoke DrawTableButton3D,8,OFFSET cbHitText3D,edi invoke DrawTableButton3D,86,OFFSET cbStandText3D,edi cmp cbPlayerCount3D,2 jne bj_party_no_double mov eax,cbStake3D cmp bankroll,eax jae @F bj_party_no_double: xor edi,edi @@: invoke DrawTableButton3D,164,OFFSET cbDoubleText3D,edi jmp bj_party_render_exit bj_party_ready: invoke DrawStakeControls3D,1 invoke DrawTableButton3D,125,OFFSET pkDealText3D,1 cmp cbState3D,CB_RESULT jne bj_party_render_exit mov eax,cbOutcome3D mov ecx,OFFSET cbNaturalText3D cmp eax,3 je @F mov ecx,cbResults3D[eax*4] @@: invoke DrawString8x8,8,226,ecx,00EFD583h bj_party_render_exit: cmp cbError3D,0 je @F invoke DrawString8x8,80,183,OFFSET textNoCash3D,00F89880h @@: call RenderCardExit3D ret RenderBJParty3D ENDP