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.
322 lines
6.8 KiB
PHP
322 lines
6.8 KiB
PHP
; 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 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
|
|
@@:
|
|
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
|