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.
407 lines
9.7 KiB
PHP
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
|