; All runtime rendering/gameplay is native. Artwork and rank tables are binary assets. FreeCardTableAssets3D PROC call FreeBJParty3D cmp cardTablePixels3D, 0 je @F invoke HeapFree, cardTableHeap3D, 0, cardTablePixels3D mov cardTablePixels3D, 0 @@: cmp cardRanks3D, 0 je @F invoke HeapFree, cardRanksHeap3D, 0, cardRanks3D mov cardRanks3D, 0 @@: ret FreeCardTableAssets3D ENDP LoadCardTableAssets3D PROC uses ebx local count:DWORD cmp cardTablePixels3D, 0 jne card_load_ranks invoke CreateFileA, OFFSET cardTablePath3D, 80000000h, 1, 0, 3, 80h, 0 cmp eax, -1 je card_load_ranks mov ebx, eax invoke ReadFile, ebx, OFFSET cardTableHeader3D, 16, ADDR count, 0 test eax, eax jz card_close_art cmp count, 16 jne card_close_art cmp cardTableHeader3D, 31415443h jne card_close_art cmp cardTableHeader3D[4], SCREEN_W jne card_close_art cmp cardTableHeader3D[8], SCREEN_H jne card_close_art cmp cardTableHeader3D[12], SCREEN_SIZE * 4 jne card_close_art invoke GetProcessHeap mov cardTableHeap3D, eax invoke HeapAlloc, eax, 0, SCREEN_SIZE * 4 mov cardTablePixels3D, eax test eax, eax jz card_close_art invoke ReadFile, ebx, cardTablePixels3D, SCREEN_SIZE * 4, ADDR count, 0 test eax, eax jz card_free_art cmp count, SCREEN_SIZE * 4 je card_close_art card_free_art: invoke HeapFree, cardTableHeap3D, 0, cardTablePixels3D mov cardTablePixels3D, 0 card_close_art: invoke CloseHandle, ebx card_load_ranks: cmp cardRanks3D, 0 jne card_assets_ready invoke CreateFileA, OFFSET cardRanksPath3D, 80000000h, 1, 0, 3, 80h, 0 cmp eax, -1 je card_assets_failed mov ebx, eax invoke ReadFile, ebx, OFFSET cardRanksHeader3D, 16, ADDR count, 0 test eax, eax jz card_close_ranks cmp count, 16 jne card_close_ranks cmp cardRanksHeader3D, 31524B50h jne card_close_ranks cmp cardRanksHeader3D[4], 1287 jne card_close_ranks cmp cardRanksHeader3D[8], 6175 jne card_close_ranks cmp cardRanksHeader3D[12], 59696 jne card_close_ranks invoke GetProcessHeap mov cardRanksHeap3D, eax invoke HeapAlloc, eax, 0, 59696 mov cardRanks3D, eax test eax, eax jz card_close_ranks invoke ReadFile, ebx, cardRanks3D, 59696, ADDR count, 0 test eax, eax jz card_free_ranks cmp count, 59696 jne card_free_ranks invoke CloseHandle, ebx card_assets_ready: mov eax, 1 ret card_free_ranks: invoke HeapFree, cardRanksHeap3D, 0, cardRanks3D mov cardRanks3D, 0 card_close_ranks: invoke CloseHandle, ebx card_assets_failed: xor eax, eax ret LoadCardTableAssets3D ENDP RenderCardTable3D PROC uses esi edi mov tableHandQueued3D, 0 cmp activeTablePack3D.pixels, 0 je card_table_original cmp activeTablePack3D.imageWidth, SCREEN_W jne card_table_original cmp activeTablePack3D.height, SCREEN_H jne card_table_original cmp activeTablePack3D.frames, 1 jne card_table_original mov esi, activeTablePack3D.pixels jmp card_table_copy card_table_original: cmp cardTablePixels3D, 0 je card_table_fallback mov esi, cardTablePixels3D card_table_copy: lea edi, screenBuffer mov ecx, SCREEN_SIZE rep movsd ret card_table_fallback: invoke DrawBox, 0, 0, 320, 240, 0015392Bh invoke DrawBox, 0, 0, 320, 45, 00171E20h invoke DrawBox, 0, 218, 320, 22, 0061283Ah ret RenderCardTable3D ENDP ShuffleCards3D PROC uses ebx esi edi deck:DWORD mov edi, deck xor esi, esi card_deck_fill: mov [edi+esi*4], esi inc esi cmp esi, 52 jb card_deck_fill mov esi, 51 card_deck_shuffle: lea eax, [esi+1] invoke RandomRange3D, eax mov ebx, [edi+esi*4] mov edx, [edi+eax*4] mov [edi+esi*4], edx mov [edi+eax*4], ebx dec esi jnz card_deck_shuffle ret ShuffleCards3D ENDP DrawNativeSuit3D PROC uses ebx esi edi x:DWORD,y:DWORD,suit:DWORD,ink:DWORD mov eax, suit and eax, 3 lea edi, cardSuitMasks3D[eax*8] xor esi, esi card_suit_row: movzx ebx, BYTE PTR [edi+esi] mov ecx, 8 card_suit_pixel: push ecx test ebx, 80h jz @F mov eax, 8 sub eax, ecx add eax, x mov edx, y add edx, esi invoke DrawPixel, eax, edx, ink @@: pop ecx shl ebx, 1 dec ecx jnz card_suit_pixel inc esi cmp esi, 8 jb card_suit_row ret DrawNativeSuit3D ENDP DrawNativeCard3D PROC uses ebx esi edi x:DWORD,y:DWORD,card:DWORD,hidden:DWORD,cardWidth:DWORD local ink:DWORD,rank:DWORD,suit:DWORD,fill:DWORD cmp cardWidth, 2 jb card_draw_done mov eax, x add eax, 2 mov edx, y add edx, 2 invoke DrawBox, eax, edx, cardWidth, 48, 000B1C15h mov fill, 00EEEDE2h cmp hidden, 0 je card_fill_ready mov eax, selectedBack3D cmp eax, 12 jbe card_fill_back xor eax, eax card_fill_back: mov eax, cardBackColors3D[eax*4] mov fill, eax card_fill_ready: invoke DrawBoxBorder, x, y, cardWidth, 48, fill, 00DEDFCCh, 1 cmp cardWidth, 18 jb card_draw_done cmp hidden, 0 jne card_draw_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 card_draw_face @@: mov ink, 00BF263Ch card_draw_face: mov eax, x add eax, 3 mov edx, y add edx, 3 mov ecx, rank lea ecx, cardRankNames3D[ecx*2] invoke DrawString8x8, eax, edx, ecx, ink mov eax, x add eax, 3 mov edx, y add edx, 13 invoke DrawNativeSuit3D, eax, edx, suit, ink mov eax, cardWidth shr eax, 1 add eax, x sub eax, 4 mov edx, y add edx, 27 invoke DrawNativeSuit3D, eax, edx, suit, ink mov eax, x add eax, cardWidth sub eax, 11 mov edx, y add edx, 37 invoke DrawNativeSuit3D, eax, edx, suit, ink ret card_draw_back: cmp backsPack3D.pixels, 0 je card_draw_back_fallback mov eax, x shl eax, 1 mov edx, y shl edx, 1 mov ecx, cardWidth shl ecx, 1 invoke DrawAnimSprite3D, OFFSET backsPack3D, selectedBack3D, eax, edx, ecx, 96 ret card_draw_back_fallback: mov eax, x add eax, 3 mov edx, y add edx, 3 mov ecx, cardWidth sub ecx, 6 invoke DrawBoxBorder, eax, edx, ecx, 42, fill, 00D7C394h, 1 mov esi, 9 card_back_pattern_row: mov edi, 7 card_back_pattern_col: mov eax, cardWidth sub eax, 5 cmp edi, eax jae card_back_pattern_next mov eax, x add eax, edi mov edx, y add edx, esi invoke DrawPixel, eax, edx, 00EEE1B9h add edi, 5 jmp card_back_pattern_col card_back_pattern_next: add esi, 5 cmp esi, 41 jb card_back_pattern_row mov eax, cardWidth shr eax, 1 add eax, x sub eax, 4 mov edx, y add edx, 20 invoke DrawNativeSuit3D, eax, edx, selectedBack3D, 00FAEDD3h card_draw_done: ret DrawNativeCard3D ENDP DrawNativeChips3D PROC uses ebx esi x:DWORD,y:DWORD,amount:DWORD,ink:DWORD mov eax, amount test eax, eax jz chips_draw_done xor edx, edx mov ecx, 50 div ecx cmp eax, 8 jbe @F mov eax, 8 @@: inc eax mov esi, eax xor ebx, ebx chips_draw_layer: mov eax, y sub eax, ebx push eax invoke DrawCircle, x, eax, 8, 00DFDCD2h pop eax invoke DrawCircle, x, eax, 6, ink add ebx, 3 dec esi jnz chips_draw_layer chips_draw_done: ret DrawNativeChips3D ENDP DrawSlidingCard3D PROC uses ebx x:DWORD,y:DWORD,card:DWORD,hidden:DWORD,timeMs:DWORD local renderX:DWORD,renderY:DWORD,renderWidth:DWORD,renderHidden:DWORD,motionMs:DWORD mov ebx, timeMs cmp ebx, TABLE_FLIGHT_MS jbe @F mov ebx, TABLE_FLIGHT_MS @@: mov eax, ebx sub eax, 60 jns @F xor eax, eax @@: cmp eax, 240 jbe @F mov eax, 240 @@: mov motionMs, eax mov eax, x sub eax, 266 imul eax, motionMs cdq mov ecx, 240 idiv ecx add eax, 266 mov renderX, eax mov eax, y sub eax, 58 imul eax, motionMs cdq idiv ecx add eax, 58 mov renderY, eax mov renderWidth, 34 invoke QueueTableHand3D, renderX, renderY, timeMs, 0 shr ebx, 1 mov eax, hidden mov renderHidden, eax cmp hidden, 0 jne card_slide_draw mov renderHidden, 1 cmp ebx, 90 jb card_slide_draw mov eax, ebx sub eax, 135 jns card_flip_front neg eax jmp card_flip_width card_flip_front: mov renderHidden, 0 card_flip_width: imul eax, 34 xor edx, edx mov ecx, 45 div ecx mov renderWidth, eax mov edx, 34 sub edx, eax shr edx, 1 add renderX, edx card_slide_draw: invoke DrawNativeCard3D, renderX, renderY, card, renderHidden, renderWidth ret DrawSlidingCard3D ENDP