KAZIK/src_graphics/charms.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

204 lines
5.5 KiB
PHP

.code
; ------------------------------------------------------------------------------
; TriggerCharmLossProtection: Checks Devil's Contract and Clover to save bet
; Input: betAmount (DWORD)
; Output: eax = 1 if saved (bet refunded to bankroll), 0 if not saved
; ------------------------------------------------------------------------------
TriggerCharmLossProtection PROC uses ebx ecx edx, betAmount:DWORD
; 1. Check Devil's Contract (50% chance to refund full bet)
cmp charmDevilUses, 0
jle check_clover
invoke RandomRange, 100
cmp eax, 50
jge check_clover
; Devil Contract Triggered!
dec charmDevilUses
mov eax, betAmount
test eax, eax
jz @F
add bankroll, eax
@@:
invoke CopyString3D, OFFSET msgCharmDevilSave, OFFSET flashMessage
mov flashTimer, 120
invoke PlayCasinoSound3D, OFFSET soundJackpot, 0, 1
call SaveProgress3D
mov eax, 1
ret
check_clover:
; 2. Check Clover of Luck (15% chance to refund bet)
cmp charmCloverUses, 0
jle protection_none
invoke RandomRange, 100
cmp eax, 15
jge protection_none
; Clover Triggered!
dec charmCloverUses
mov eax, betAmount
test eax, eax
jz @F
add bankroll, eax
@@:
invoke CopyString3D, OFFSET msgCharmCloverSave, OFFSET flashMessage
mov flashTimer, 120
invoke PlayCasinoSound3D, OFFSET soundJackpot, 0, 1
call SaveProgress3D
mov eax, 1
ret
protection_none:
xor eax, eax
ret
TriggerCharmLossProtection ENDP
; ------------------------------------------------------------------------------
; TriggerCharmWinBonus: Grants +15% extra payout on slot / roulette win
; Input: winAmount (DWORD)
; Output: eax = bonus amount added to bankroll, 0 if no horseshoe active
; ------------------------------------------------------------------------------
TriggerCharmWinBonus PROC uses ebx ecx edx, winAmount:DWORD
cmp charmHorseshoeUses, 0
jle bonus_none
mov eax, winAmount
test eax, eax
jle bonus_none
; Calculate 15% bonus: (winAmount * 15) / 100
imul eax, 15
xor edx, edx
mov ecx, 100
div ecx
cmp eax, 1
jge @F
mov eax, 1
@@:
mov ebx, eax
add bankroll, ebx
dec charmHorseshoeUses
invoke CopyString3D, OFFSET msgCharmHorseshoeWin, OFFSET flashMessage
mov flashTimer, 120
invoke PlayCasinoSound3D, OFFSET soundCoin, 0, 1
call SaveProgress3D
mov eax, ebx
ret
bonus_none:
xor eax, eax
ret
TriggerCharmWinBonus ENDP
; ------------------------------------------------------------------------------
; TriggerCharmBulletProtection: Protects player from fatal gunshot
; Output: eax = 1 if saved (bullet misfired), 0 if no skull active
; ------------------------------------------------------------------------------
TriggerCharmBulletProtection PROC uses ebx ecx edx
cmp charmSkullUses, 0
jle bullet_none
dec charmSkullUses
invoke CopyString3D, OFFSET msgCharmSkullSave, OFFSET flashMessage
mov flashTimer, 140
invoke PlayCasinoSound3D, OFFSET rrDrySound3D, 0, 1
call SaveProgress3D
mov eax, 1
ret
bullet_none:
xor eax, eax
ret
TriggerCharmBulletProtection ENDP
; ------------------------------------------------------------------------------
; DrawCharmsHUD: Draws active charm badges with remaining charges
; Input: drawX, drawY (screen coordinates)
; ------------------------------------------------------------------------------
DrawCharmsHUD PROC uses ebx esi edi, drawX:DWORD, drawY:DWORD
local curX:DWORD, tempBuf[16]:BYTE
mov eax, charmCloverUses
or eax, charmHorseshoeUses
or eax, charmSkullUses
or eax, charmDevilUses
test eax, eax
jz hud_done
mov eax, drawX
mov curX, eax
; 1. Clover Badge
cmp charmCloverUses, 0
jle check_horse_hud
invoke DrawString8x8, curX, drawY, OFFSET badgeCloverPrefix, 0080FF80h
add curX, 32
invoke FormatNumber, charmCloverUses, ADDR tempBuf
invoke DrawString8x8, curX, drawY, ADDR tempBuf, 00FFFFFFh
cmp charmCloverUses, 10
jb @F
add curX, 8
@@:
add curX, 8
invoke DrawString8x8, curX, drawY, OFFSET badgeCloseBracket, 0080FF80h
add curX, 16
check_horse_hud:
; 2. Horseshoe Badge
cmp charmHorseshoeUses, 0
jle check_skull_hud
invoke DrawString8x8, curX, drawY, OFFSET badgeHorsePrefix, 00FFE060h
add curX, 32
invoke FormatNumber, charmHorseshoeUses, ADDR tempBuf
invoke DrawString8x8, curX, drawY, ADDR tempBuf, 00FFFFFFh
cmp charmHorseshoeUses, 10
jb @F
add curX, 8
@@:
add curX, 8
invoke DrawString8x8, curX, drawY, OFFSET badgeCloseBracket, 00FFE060h
add curX, 16
check_skull_hud:
; 3. Skull Badge
cmp charmSkullUses, 0
jle check_devil_hud
invoke DrawString8x8, curX, drawY, OFFSET badgeSkullPrefix, 0080FFFFh
add curX, 32
invoke FormatNumber, charmSkullUses, ADDR tempBuf
invoke DrawString8x8, curX, drawY, ADDR tempBuf, 00FFFFFFh
cmp charmSkullUses, 10
jb @F
add curX, 8
@@:
add curX, 8
invoke DrawString8x8, curX, drawY, OFFSET badgeCloseBracket, 0080FFFFh
add curX, 16
check_devil_hud:
; 4. Devil Contract Badge
cmp charmDevilUses, 0
jle hud_done
invoke DrawString8x8, curX, drawY, OFFSET badgeDevilPrefix, 00FF6060h
add curX, 32
invoke FormatNumber, charmDevilUses, ADDR tempBuf
invoke DrawString8x8, curX, drawY, ADDR tempBuf, 00FFFFFFh
cmp charmDevilUses, 10
jb @F
add curX, 8
@@:
add curX, 8
invoke DrawString8x8, curX, drawY, OFFSET badgeCloseBracket, 00FF6060h
add curX, 16
hud_done:
ret
DrawCharmsHUD ENDP