KAZIK/src_graphics/merchant_scene.inc
Игорь Федосеев fed880cce2 feat(charms): port and integrate roguelike charms system into 3D casino
- Add 4 unique charms: Clover of Luck, Golden Horseshoe, Skull of Immortality, Devil's Contract

- Add Sidorovich shop tabs ([РУБАШКИ] / [ТАЛИСМАНЫ]) with TAB/arrow navigation and purchases

- Extend casino3d-progress.dat to 32 bytes with backward-compatible save/load

- Hook event triggers into Blackjack, Poker, Durak, Coin, Dice, Scratch, Slots, Roulette, Russian Roulette, Buckshot, and Hell Tower

- Display active charm badges on HUD and Hell Tower briefing
2026-10-16 13:48:11 +03:00

453 lines
11 KiB
PHP
Raw Blame History

BeginMerchant3D PROC
call LoadArrivalAssets3D
mov engineMode, MODE_SHOP
mov merchantTime3D, 0
mov merchantReaction3D, 1280
mov merchantMessage3D, 0
mov merchantTab3D, 0
mov merchantCharmSelected3D, 0
mov eax, selectedBack3D
cmp eax, 12
jbe @F
xor eax, eax
@@:
mov merchantSelected3D, eax
mov merchantPreviousFocus3D, eax
call ClearKeys3D
ret
BeginMerchant3D ENDP
BuyMerchantBack3D PROC uses ebx style:DWORD
mov ebx, style
cmp ebx, 12
ja merchant_purchase_done
bt ownedBacks3D, ebx
jc merchant_equip
mov eax, merchantPrices3D[ebx*4]
cmp bankroll, eax
jb merchant_purchase_poor
sub bankroll, eax
bts ownedBacks3D, ebx
; Keep the existing shopper achievement bit without opening a console popup.
cmp nativeProfileActive3D, 0
je merchant_equip
or achievements, 10h
merchant_equip:
mov selectedBack3D, ebx
mov merchantMessage3D, 1
mov merchantReaction3D, 0
mov merchantReactionKind3D, 2
call SaveProgress3D
invoke PlayCasinoSound3D, OFFSET soundClick, 0, 1
ret
merchant_purchase_poor:
mov merchantMessage3D, 2
mov merchantReaction3D, 0
mov merchantReactionKind3D, 1
merchant_purchase_done:
ret
BuyMerchantBack3D ENDP
BuyMerchantCharm3D PROC uses ebx charmIndex:DWORD
mov ebx, charmIndex
cmp ebx, 3
ja charm_purchase_done
mov eax, charmPrices3D[ebx*4]
cmp bankroll, eax
jb charm_purchase_poor
sub bankroll, eax
mov ecx, charmUsesPack3D[ebx*4]
cmp ebx, 0
jne @F
add charmCloverUses, ecx
jmp charm_bought
@@:
cmp ebx, 1
jne @F
add charmHorseshoeUses, ecx
jmp charm_bought
@@:
cmp ebx, 2
jne @F
add charmSkullUses, ecx
jmp charm_bought
@@:
cmp ebx, 3
jne charm_bought
add charmDevilUses, ecx
charm_bought:
mov merchantMessage3D, 1
mov merchantReaction3D, 0
mov merchantReactionKind3D, 2
call SaveProgress3D
invoke PlayCasinoSound3D, OFFSET soundCoin, 0, 1
ret
charm_purchase_poor:
mov merchantMessage3D, 2
mov merchantReaction3D, 0
mov merchantReactionKind3D, 1
charm_purchase_done:
ret
BuyMerchantCharm3D ENDP
HandleMerchant3D PROC uses ebx
mov eax, merchantSelected3D
cmp eax, merchantPreviousFocus3D
je @F
mov merchantPreviousFocus3D, eax
mov merchantReaction3D, 0
mov merchantReactionKind3D, 1
@@:
mov eax, deltaTime3D
add merchantTime3D, eax
add merchantReaction3D, eax
; TAB (09h), Left Arrow (25h), Right Arrow (27h) toggle tabs
invoke Pressed3D, 09h
test eax, eax
jnz merchant_tab_toggle
invoke Pressed3D, 25h
test eax, eax
jnz merchant_tab_toggle
invoke Pressed3D, 27h
test eax, eax
jz @F
merchant_tab_toggle:
xor merchantTab3D, 1
mov merchantReaction3D, 0
mov merchantReactionKind3D, 1
invoke PlayCasinoSound3D, OFFSET soundClick, 0, 1
@@:
cmp merchantTab3D, 0
jne handle_charms_vertical
; Shirts vertical navigation
invoke Pressed3D, 26h
test eax, eax
jz @F
cmp merchantSelected3D, 0
je @F
dec merchantSelected3D
@@:
invoke Pressed3D, 28h
test eax, eax
jz merchant_after_vertical
cmp merchantSelected3D, 12
jae merchant_after_vertical
inc merchantSelected3D
jmp merchant_after_vertical
handle_charms_vertical:
; Charms vertical navigation
invoke Pressed3D, 26h
test eax, eax
jz @F
cmp merchantCharmSelected3D, 0
je @F
dec merchantCharmSelected3D
@@:
invoke Pressed3D, 28h
test eax, eax
jz merchant_after_vertical
cmp merchantCharmSelected3D, 3
jae merchant_after_vertical
inc merchantCharmSelected3D
merchant_after_vertical:
cmp mouseClick3D, 0
je merchant_enter
cmp mouseX3D, 168
jb merchant_enter
cmp mouseX3D, 311
jae merchant_enter
; Tab header clicks (y 31..46)
cmp mouseY3D, 31
jb merchant_enter
cmp mouseY3D, 46
jae merchant_mouse_content
cmp mouseX3D, 235
jae tab_charms_click
mov merchantTab3D, 0
ret
tab_charms_click:
mov merchantTab3D, 1
ret
merchant_mouse_content:
cmp merchantTab3D, 0
jne merchant_mouse_charms
cmp mouseY3D, 48
jae merchant_mouse_rows
cmp mouseY3D, 34
jb merchant_enter
cmp mouseX3D, 248
jb merchant_enter
cmp mouseX3D, 278
jae merchant_mouse_next
cmp merchantSelected3D, 0
je merchant_handle_done
dec merchantSelected3D
ret
merchant_mouse_next:
cmp merchantSelected3D, 12
jae merchant_handle_done
inc merchantSelected3D
ret
merchant_mouse_rows:
mov eax, mouseY3D
sub eax, 52
js merchant_handle_done
cmp eax, 130
jae merchant_mouse_buy
xor edx, edx
mov ecx, 26
div ecx
mov ebx, eax
mov eax, merchantSelected3D
xor edx, edx
mov ecx, 5
div ecx
imul eax, 5
add eax, ebx
cmp eax, 12
ja merchant_handle_done
mov merchantSelected3D, eax
ret
merchant_mouse_charms:
cmp mouseY3D, 50
jb merchant_mouse_buy
cmp mouseY3D, 178
jae merchant_mouse_buy
mov eax, mouseY3D
sub eax, 50
xor edx, edx
mov ecx, 32
div ecx
cmp eax, 3
ja merchant_handle_done
mov merchantCharmSelected3D, eax
ret
merchant_mouse_buy:
cmp mouseY3D, 193
jb merchant_handle_done
cmp mouseY3D, 211
ja merchant_handle_done
jmp merchant_confirm
merchant_enter:
invoke Pressed3D, 0Dh
test eax, eax
jz merchant_handle_done
merchant_confirm:
cmp merchantTab3D, 0
jne @F
invoke BuyMerchantBack3D, merchantSelected3D
ret
@@:
invoke BuyMerchantCharm3D, merchantCharmSelected3D
merchant_handle_done:
ret
HandleMerchant3D ENDP
RenderMerchant3D PROC uses ebx esi edi
local rowY:DWORD,start:DWORD,frame:DWORD,ink:DWORD
invoke DrawBox, 0, 0, 320, 240, 00252B24h
invoke DrawBox, 0, 21, 320, 7, 00836638h
invoke DrawBox, 0, 151, 320, 63, 003C3024h
invoke DrawAnimSprite3D, OFFSET propsPack3D, 4, 8, 111, 298, 298
mov frame, 0
cmp merchantReaction3D, 1280
jae merchant_idle_pose
mov eax, merchantReaction3D
xor edx, edx
mov ecx, 160
div ecx
add eax, 16
cmp merchantReactionKind3D, 2
jne @F
sub eax, 8
@@:
mov frame, eax
jmp merchant_draw_pose
merchant_idle_pose:
mov eax, merchantTime3D
xor edx, edx
mov ecx, 5400
div ecx
cmp edx, 3640
jb merchant_draw_pose
mov eax, edx
sub eax, 3640
xor edx, edx
mov ecx, 220
div ecx
mov frame, eax
merchant_draw_pose:
invoke DrawAnimSprite3D, OFFSET merchantPack3D, frame, -10, 66, 342, 342
invoke DrawBox, 0, 194, 162, 29, 0045372Ah
invoke DrawBox, 0, 192, 162, 3, 00B79B63h
mov esi, OFFSET merchantHello3D
cmp merchantMessage3D, 1
jne @F
mov esi, OFFSET merchantThanks3D
@@:
invoke DrawString8x8, 6, 209, esi, 00F0D7ABh
; Draw card back preview only on Shirts tab
cmp merchantTab3D, 0
jne @F
invoke DrawAnimSprite3D, OFFSET backsPack3D, merchantSelected3D, 24, 282, 68, 96
@@:
invoke DrawBox, 0, 0, 320, 21, 00181D1Bh
invoke DrawString8x8, 8, 6, OFFSET merchantTitle3D, 00E9CD9Ah
invoke DrawString8x8, 152, 6, OFFSET textBank3D, 00B8D5B3h
invoke FormatNumber, bankroll, OFFSET hudNumBuffer
invoke DrawString8x8, 203, 6, OFFSET hudNumBuffer, 00FFFFFFh
; Right Panel
invoke DrawBoxBorder, 166, 31, 147, 187, 00191D1Fh, 009A825Ah, 1
; Tab 1: [ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ] (x 169..232)
cmp merchantTab3D, 0
jne @F
invoke DrawBox, 169, 33, 64, 13, 00395046h
invoke DrawString8x8, 171, 36, OFFSET merchantStock3D, 00FFFFFFh
jmp tab2_draw
@@:
invoke DrawString8x8, 171, 36, OFFSET merchantStock3D, 007E8E81h
tab2_draw:
; Tab 2: [ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ] (x 236..310)
cmp merchantTab3D, 1
jne @F
invoke DrawBox, 236, 33, 74, 13, 00395046h
invoke DrawString8x8, 238, 36, OFFSET merchantTabCharmsLabel, 00FFFFFFh
jmp tab_draw_done
@@:
invoke DrawString8x8, 238, 36, OFFSET merchantTabCharmsLabel, 007E8E81h
tab_draw_done:
cmp merchantTab3D, 0
jne render_charms_view
; --- SHIRTS VIEW ---
invoke DrawBoxBorder, 248, 34, 24, 12, 00373F3Bh, 00889985h, 1
invoke DrawString8x8, 256, 36, OFFSET merchantArrowUp3D, 00FFFFFFh
invoke DrawBoxBorder, 279, 34, 24, 12, 00373F3Bh, 00889985h, 1
invoke DrawString8x8, 287, 36, OFFSET merchantArrowDown3D, 00FFFFFFh
mov eax, merchantSelected3D
xor edx, edx
mov ecx, 5
div ecx
imul eax, 5
mov start, eax
mov ebx, eax
mov rowY, 52
merchant_render_row:
cmp ebx, 12
ja merchant_render_footer
mov ink, 00C1C8C1h
cmp ebx, merchantSelected3D
jne @F
invoke DrawBoxBorder, 169, rowY, 140, 24, 00395046h, 00A7C4AEh, 1
mov ink, 00FFFFFFh
@@:
mov eax, rowY
add eax, 3
invoke DrawString8x8, 173, eax, merchantNames3D[ebx*4], ink
mov esi, OFFSET merchantOwned3D
cmp ebx, selectedBack3D
jne @F
mov esi, OFFSET merchantEquipped3D
jmp merchant_item_status
@@:
bt ownedBacks3D, ebx
jc merchant_item_status
invoke FormatNumber, merchantPrices3D[ebx*4], OFFSET hudNumBuffer
mov esi, OFFSET hudNumBuffer
merchant_item_status:
mov eax, rowY
add eax, 14
invoke DrawString8x8, 173, eax, esi, 00C7B58Ah
add rowY, 26
inc ebx
mov eax, ebx
sub eax, start
cmp eax, 5
jb merchant_render_row
jmp merchant_render_footer
render_charms_view:
; --- CHARMS VIEW ---
xor ebx, ebx
mov rowY, 50
charm_render_loop:
cmp ebx, 4
jae merchant_render_footer
mov ink, 00C1C8C1h
cmp ebx, merchantCharmSelected3D
jne @F
invoke DrawBoxBorder, 168, rowY, 142, 28, 00395046h, 00A7C4AEh, 1
mov ink, 00FFFFFFh
@@:
; Line 1: Charm Name
mov eax, rowY
add eax, 2
invoke DrawString8x8, 171, eax, charmNames3D[ebx*4], ink
; Line 2: Charm Description
mov eax, rowY
add eax, 11
invoke DrawString8x8, 171, eax, charmDescs3D[ebx*4], 0088B8A8h
; Line 3: Price and Charges
mov eax, rowY
add eax, 20
push eax
invoke DrawString8x8, 171, eax, OFFSET merchantDollar3D, 00C7B58Ah
invoke FormatNumber, charmPrices3D[ebx*4], OFFSET hudNumBuffer
pop eax
push eax
invoke DrawString8x8, 179, eax, OFFSET hudNumBuffer, 00FFFFFFh
pop eax
push eax
invoke DrawString8x8, 234, eax, OFFSET merchantStockUsesLabel, 00A0A0A0h
mov edx, charmCloverUses
cmp ebx, 0
je draw_cur_uses
mov edx, charmHorseshoeUses
cmp ebx, 1
je draw_cur_uses
mov edx, charmSkullUses
cmp ebx, 2
je draw_cur_uses
mov edx, charmDevilUses
draw_cur_uses:
invoke FormatNumber, edx, OFFSET hudNumBuffer
pop eax
invoke DrawString8x8, 274, eax, OFFSET hudNumBuffer, 00FFE060h
add rowY, 31
inc ebx
jmp charm_render_loop
merchant_render_footer:
cmp merchantMessage3D, 2
jne @F
invoke DrawString8x8, 172, 182, OFFSET merchantPoor3D, 00EA8A77h
@@:
invoke DrawBoxBorder, 171, 194, 136, 17, 003B5949h, 00CBAF73h, 1
invoke DrawString8x8, 194, 199, OFFSET merchantBuy3D, 00FFFFFFh
invoke DrawBox, 0, 224, 320, 16, 00181D1Bh
invoke DrawString8x8, 8, 229, OFFSET merchantShopKeysWithTabs, 00C5C7B8h
ret
RenderMerchant3D ENDP