.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