; 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 mov hidden,1 cmp obsActive3D,0 je @F mov hidden,0 @@: 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], hidden, edx jmp dk_render_next_ai @@: invoke DrawNativeCard3D, posX, 48, durakAIHand[ebx*4], hidden, 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