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.
381 lines
8.7 KiB
PHP
381 lines
8.7 KiB
PHP
; 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
|