Add native Durak, poker, blackjack, roulette, Buckshot and billiards scenes with animation assets and regression tests. Improve arrival, city, hall, profiles, shops, audio and exit handling; remove the portable C game core and refresh shipping executables.
295 lines
8.3 KiB
PHP
295 lines
8.3 KiB
PHP
; Logical 320x240 controls over the existing 640x480 first-person table.
|
|
DurakFlightPoint3D PROC uses ebx startPos:DWORD,endPos:DWORD
|
|
mov ebx, dkTimer3D
|
|
cmp ebx, TABLE_FLIGHT_MS
|
|
jbe @F
|
|
mov ebx, TABLE_FLIGHT_MS
|
|
@@:
|
|
; Smoothstep prevents the card/hand from abruptly starting and stopping.
|
|
mov eax, ebx
|
|
imul eax, ebx
|
|
mov ecx, TABLE_FLIGHT_MS*3
|
|
sub ecx, ebx
|
|
sub ecx, ebx
|
|
imul eax, ecx
|
|
xor edx, edx
|
|
mov ecx, TABLE_FLIGHT_MS*TABLE_FLIGHT_MS
|
|
div ecx
|
|
mov ebx, eax
|
|
mov eax, endPos
|
|
sub eax, startPos
|
|
imul eax, ebx
|
|
cdq
|
|
mov ecx, TABLE_FLIGHT_MS
|
|
idiv ecx
|
|
add eax, startPos
|
|
ret
|
|
DurakFlightPoint3D ENDP
|
|
|
|
RenderNativeDurak3D PROC uses ebx esi edi
|
|
local posX:DWORD,posY:DWORD,card:DWORD,hidden:DWORD,timeMs:DWORD
|
|
call RenderCardTable3D
|
|
invoke DrawBox, 0, 0, 320, 32, 00151D20h
|
|
invoke DrawString8x8, 8, 6, OFFSET dkTitle3D, 00E8D7ADh
|
|
invoke DrawString8x8, 8, 20, OFFSET textBank3D, 00A8DDB9h
|
|
invoke FormatNumber, bankroll, OFFSET hudNumBuffer
|
|
invoke DrawString8x8, 56, 20, OFFSET hudNumBuffer, 00F4F3E8h
|
|
invoke DrawString8x8, 180, 20, OFFSET textBet3D, 00D1B16Eh
|
|
invoke FormatNumber, dkBet3D, OFFSET hudNumBuffer
|
|
invoke DrawString8x8, 236, 20, OFFSET hudNumBuffer, 00F4F3E8h
|
|
mov eax, dkVariant3D
|
|
invoke DrawString8x8, 8, 36, dkVariantNames3D[eax*4], 00DFD4B9h
|
|
cmp dkError3D, 0
|
|
je @F
|
|
mov eax, OFFSET dkIllegalText3D
|
|
cmp dkError3D, 1
|
|
jne dk_render_error
|
|
mov eax, OFFSET textNoCash3D
|
|
dk_render_error:
|
|
invoke DrawString8x8, 144, 36, eax, 00F49880h
|
|
@@:
|
|
cmp dkState3D, DK_IDLE
|
|
je dk_render_ready
|
|
cmp dkState3D, DK_RESULT
|
|
je dk_render_final
|
|
invoke DrawString8x8, 8, 54, OFFSET dkAIText3D, 00C4D5C9h
|
|
invoke FormatNumber, durakAICnt, OFFSET hudNumBuffer
|
|
invoke DrawString8x8, 8, 66, OFFSET hudNumBuffer, 00F4F3E8h
|
|
invoke DrawString8x8, 264, 36, OFFSET dkDeckText3D, 00C4D5C9h
|
|
invoke FormatNumber, durakDeckLeft, OFFSET hudNumBuffer
|
|
invoke DrawString8x8, 280, 46, OFFSET hudNumBuffer, 00F4F3E8h
|
|
cmp durakDeckLeft, 0
|
|
je dk_render_ai
|
|
invoke DrawNativeCard3D, 254, 58, durakTrumpCard, 0, 34
|
|
cmp durakDeckLeft, 1
|
|
jbe dk_render_ai
|
|
invoke DrawNativeCard3D, 276, 54, 0, 1, 34
|
|
dk_render_ai:
|
|
mov edi, durakAICnt
|
|
cmp edi, 8
|
|
jbe @F
|
|
mov edi, 8
|
|
@@:
|
|
xor ebx, ebx
|
|
dk_render_ai_card:
|
|
cmp ebx, edi
|
|
jae dk_render_pairs
|
|
mov eax, ebx
|
|
imul eax, 18
|
|
mov ecx, edi
|
|
dec ecx
|
|
imul ecx, 18
|
|
add ecx, 34
|
|
mov edx, 320
|
|
sub edx, ecx
|
|
shr edx, 1
|
|
add eax, edx
|
|
mov posX, eax
|
|
cmp dkState3D, DK_DEAL
|
|
jne @F
|
|
mov eax, ebx
|
|
shl eax, 1
|
|
inc eax
|
|
imul eax, TABLE_FLIGHT_MS
|
|
mov edx, dkTimer3D
|
|
sub edx, eax
|
|
js dk_render_next_ai
|
|
invoke DrawSlidingCard3D, posX, 48, durakAIHand[ebx*4], 1, edx
|
|
jmp dk_render_next_ai
|
|
@@:
|
|
invoke DrawNativeCard3D, posX, 48, durakAIHand[ebx*4], 1, 34
|
|
dk_render_next_ai:
|
|
inc ebx
|
|
jmp dk_render_ai_card
|
|
dk_render_pairs:
|
|
xor ebx, ebx
|
|
dk_render_pair:
|
|
cmp ebx, durakTableCnt
|
|
jae dk_render_hand
|
|
mov eax, ebx
|
|
imul eax, 40
|
|
add eax, 12
|
|
mov posX, eax
|
|
invoke DrawNativeCard3D, posX, 98, durakAttackCards[ebx*4], 0, 34
|
|
cmp durakDefenseCards[ebx*4], 0FFFFFFFFh
|
|
jne dk_render_defense
|
|
cmp dkActor3D, 0
|
|
jne dk_render_next_pair
|
|
cmp dkAttacker3D, 0
|
|
je dk_render_next_pair
|
|
call DurakFirstUnbeaten
|
|
cmp eax, ebx
|
|
jne dk_render_next_pair
|
|
; A small edge marks the card currently needing defense.
|
|
invoke DrawBox, posX, 96, 34, 2, 00E5BF66h
|
|
jmp dk_render_next_pair
|
|
dk_render_defense:
|
|
add posX, 6
|
|
invoke DrawNativeCard3D, posX, 106, durakDefenseCards[ebx*4], 0, 34
|
|
dk_render_next_pair:
|
|
inc ebx
|
|
jmp dk_render_pair
|
|
dk_render_hand:
|
|
mov ebx, dkPage3D
|
|
xor edi, edi
|
|
dk_render_player_card:
|
|
cmp ebx, durakPlayerCnt
|
|
jae dk_render_paging
|
|
cmp edi, DK_PAGE_SIZE
|
|
jae dk_render_paging
|
|
mov eax, edi
|
|
imul eax, 35
|
|
add eax, 20
|
|
mov posX, eax
|
|
mov posY, 168
|
|
cmp dkState3D, DK_TURN
|
|
jne dk_render_player_anim
|
|
cmp dkActor3D, 0
|
|
jne dk_render_player_anim
|
|
cmp ebx, dkSelection3D
|
|
jne dk_render_player_anim
|
|
mov posY, 165
|
|
invoke DrawBoxBorder, posX, 164, 34, 50, 0023372Bh, 00E7C476h, 1
|
|
dk_render_player_anim:
|
|
cmp dkState3D, DK_DEAL
|
|
jne dk_render_player_fixed
|
|
mov eax, ebx
|
|
shl eax, 1
|
|
imul eax, TABLE_FLIGHT_MS
|
|
mov edx, dkTimer3D
|
|
sub edx, eax
|
|
js dk_render_player_next
|
|
invoke DrawSlidingCard3D, posX, posY, durakPlayerHand[ebx*4], 0, edx
|
|
jmp dk_render_player_next
|
|
dk_render_player_fixed:
|
|
invoke DrawNativeCard3D, posX, posY, durakPlayerHand[ebx*4], 0, 34
|
|
dk_render_player_next:
|
|
inc ebx
|
|
inc edi
|
|
jmp dk_render_player_card
|
|
dk_render_paging:
|
|
cmp durakPlayerCnt, DK_PAGE_SIZE
|
|
jbe dk_render_flight
|
|
invoke DrawBoxBorder, 2, 180, 14, 20, 00283732h, 00D5C79Eh, 1
|
|
invoke DrawString8x8, 5, 186, OFFSET dkLeftText3D, 00EEE2C3h
|
|
invoke DrawBoxBorder, 304, 180, 14, 20, 00283732h, 00D5C79Eh, 1
|
|
invoke DrawString8x8, 307, 186, OFFSET dkRightText3D, 00EEE2C3h
|
|
mov eax, dkPage3D
|
|
shr eax, 3
|
|
inc eax
|
|
invoke FormatNumber, eax, OFFSET hudNumBuffer
|
|
invoke DrawString8x8, 272, 156, OFFSET hudNumBuffer, 00EBD9B0h
|
|
invoke DrawString8x8, 282, 156, OFFSET dkPageText3D, 00EBD9B0h
|
|
mov eax, durakPlayerCnt
|
|
add eax, 7
|
|
shr eax, 3
|
|
invoke FormatNumber, eax, OFFSET hudNumBuffer
|
|
invoke DrawString8x8, 292, 156, OFFSET hudNumBuffer, 00EBD9B0h
|
|
dk_render_flight:
|
|
cmp dkState3D, DK_FLIGHT
|
|
jne dk_render_status
|
|
invoke DurakFlightPoint3D, dkPendingX3D, dkTargetX3D
|
|
mov posX, eax
|
|
invoke DurakFlightPoint3D, dkPendingY3D, dkTargetY3D
|
|
mov posY, eax
|
|
invoke DrawNativeCard3D, posX, posY, dkPendingCard3D, 0, 34
|
|
mov eax, 1
|
|
sub eax, dkPendingActor3D
|
|
invoke QueueTableHand3D, posX, posY, dkTimer3D, eax
|
|
dk_render_status:
|
|
call DrawQueuedTableHand3D
|
|
mov esi, OFFSET dkDealText3D
|
|
cmp dkState3D, DK_DEAL
|
|
je dk_render_status_text
|
|
mov esi, OFFSET dkWaitText3D
|
|
cmp dkState3D, DK_SWEEP
|
|
jne @F
|
|
mov esi, OFFSET dkCollectText3D
|
|
jmp dk_render_status_text
|
|
@@:
|
|
cmp dkState3D, DK_RESULT
|
|
jne @F
|
|
mov eax, dkOutcome3D
|
|
mov esi, dkResults3D[eax*4]
|
|
jmp dk_render_status_text
|
|
@@:
|
|
cmp dkActor3D, 0
|
|
jne dk_render_status_text
|
|
mov esi, OFFSET dkAttackText3D
|
|
cmp dkTaking3D, 0
|
|
je @F
|
|
mov esi, OFFSET dkTakingText3D
|
|
jmp dk_render_status_text
|
|
@@:
|
|
cmp dkAttacker3D, 0
|
|
je dk_render_status_text
|
|
mov esi, OFFSET dkDefendText3D
|
|
dk_render_status_text:
|
|
invoke DrawBox, 96, 3, 150, 14, 00151D20h
|
|
invoke DrawString8x8, 112, 6, esi, 00F3DFB3h
|
|
cmp dkState3D, DK_RESULT
|
|
je dk_render_ready
|
|
xor edi, edi
|
|
cmp dkState3D, DK_TURN
|
|
jne dk_render_action_buttons
|
|
cmp dkActor3D, 0
|
|
jne dk_render_action_buttons
|
|
inc edi
|
|
dk_render_action_buttons:
|
|
mov ebx, DK_ATTACK
|
|
cmp dkAttacker3D, 0
|
|
je @F
|
|
mov ebx, DK_DEFEND
|
|
@@:
|
|
invoke DurakCanPlay3D, 0, dkSelection3D, ebx
|
|
invoke DrawTableButton3D, 8, OFFSET dkPlayText3D, eax
|
|
mov ebx, edi
|
|
cmp dkAttacker3D, 0
|
|
jne @F
|
|
xor ebx, ebx
|
|
@@:
|
|
invoke DrawTableButton3D, 86, OFFSET dkTakeText3D, ebx
|
|
invoke DurakCanPlay3D, 0, dkSelection3D, DK_TRANSFER
|
|
invoke DrawTableButton3D, 164, OFFSET dkTransferText3D, eax
|
|
xor ebx, ebx
|
|
cmp edi, 0
|
|
je dk_render_done_button
|
|
cmp dkAttacker3D, 0
|
|
jne dk_render_done_button
|
|
cmp durakTableCnt, 0
|
|
je dk_render_done_button
|
|
cmp dkTaking3D, 0
|
|
jne dk_render_done_enabled
|
|
call DurakAllDefended
|
|
test eax, eax
|
|
jz dk_render_done_button
|
|
dk_render_done_enabled:
|
|
inc ebx
|
|
dk_render_done_button:
|
|
invoke DrawTableButton3D, 242, OFFSET dkDoneText3D, ebx
|
|
call RenderCardExit3D
|
|
ret
|
|
dk_render_ready:
|
|
invoke DrawStakeControls3D, 1
|
|
invoke DrawBoxBorder, 8, 222, 110, 16, 00283732h, 00D5C79Eh, 1
|
|
mov eax, dkVariant3D
|
|
invoke DrawString8x8, 13, 226, dkVariantNames3D[eax*4], 00EEE2C3h
|
|
invoke DrawTableButton3D, 125, OFFSET dkNextText3D, 1
|
|
call RenderCardExit3D
|
|
ret
|
|
dk_render_final:
|
|
mov eax, dkOutcome3D
|
|
mov esi, dkResults3D[eax*4]
|
|
xor ecx, ecx
|
|
dk_render_result_length:
|
|
cmp BYTE PTR [esi+ecx], 0
|
|
je @F
|
|
inc ecx
|
|
jmp dk_render_result_length
|
|
@@:
|
|
shl ecx, 2
|
|
mov eax, 160
|
|
sub eax, ecx
|
|
invoke DrawString8x8, eax, 144, esi, 00F3DFB3h
|
|
jmp dk_render_ready
|
|
RenderNativeDurak3D ENDP
|