KAZIK/src_graphics/card_table_assets.inc
Игорь Федосеев eef2039c7e feat(hell_tower): integrate custom hell sprites, redesign tower menu, and fix entrance crash
- Add ResolveHellAssetPath to automatically load *-hell variants during tournamentMode with fallback to vanilla assets
- Rebuild Hell Tower briefing menu using HellTower_menu background with smooth floor cursor and sliding callout info card
- Fix buffer overrun in RenderHellTower3D by packing helltower-menu at native 640x480 resolution with bounds-checked blit
- Temporarily disable tower background music per user request
- Add asset packing pipeline, verification tools, and automated 10-floor run-through smoke test
2026-10-26 19:44:06 +03:00

388 lines
8.9 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
local resolvedPath[260]:BYTE
cmp cardTablePixels3D, 0
jne card_load_ranks
invoke ResolveHellAssetPath, OFFSET cardTablePath3D, ADDR resolvedPath
invoke CreateFileA, eax, 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
cmp cardWidth, 20
jae @F
sub eax, 2
@@:
mov edx, y
add edx, 3
mov ecx, rank
lea ecx, [ecx+ecx*2]
add ecx, OFFSET cardRankNames3D
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