KAZIK/src_graphics/native_blackjack_party_render.inc
Artvasil09 881a0061dc Add native NPC visitors with contracts, Clover slots, Pyramid, and party table scenes
Implement 32x32 BFS visitor navigation and daily contracts system with companion .npc journals; add native assembly scenes for Clover slots, Pyramid cards, Blackjack Party and Russian Party; package animation and sprite packs; add comprehensive offline test suites and rebuild shipping binaries.
2026-10-13 09:47:33 +03:00

407 lines
9.7 KiB
PHP

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:
lea edx,cardRankNames3D[edx*2]
mov eax,x
add eax,3
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