Merge branch 'origin/main' into main: integrate charms system with hall expansion, cabaret and terminals

This commit is contained in:
Artvasil09 2026-10-18 22:02:50 +03:00
commit d0cee618cf
24 changed files with 8576 additions and 7991 deletions

Binary file not shown.

View file

@ -8,7 +8,7 @@ namespace AssemblerCasinoLauncher
{
static class Program
{
const string ExpectedPokerSha256 = "C0B5A1DD9A678E68599724138AF009D29C935EEFDD6D70D28789AABF071395F8";
const string ExpectedPokerSha256 = "071F09A64F0E2F3EC267AC1C963D9849AA3A1DBDA81B3417C90E3499C1D5102F";
[STAThread]
static void Main()

Binary file not shown.

View file

@ -170,6 +170,7 @@ include src_graphics\native_coin_data.inc
include src_graphics\native_dice_data.inc
include src_graphics\scratch_data.inc
include src_graphics\hell_tower_data.inc
include src_graphics\charms_data.inc
.data
ALIGN 4
@ -1376,10 +1377,14 @@ RenderHUD PROC uses ebx esi edi
invoke DrawBox, 159, 118, 2, 5, 00E7DFC8h
invoke DrawBox, 157, 120, 6, 1, 00E7DFC8h
cmp interactPromptPtr, 0
je @F
je hud_charms_bottom
invoke DrawBoxBorder, 4, 199, 312, 18, 0014191Dh, 00D8BC6Ah, 1
invoke DrawString8x8, 10, 204, interactPromptPtr, 00F5E2B0h
@@:
invoke DrawCharmsHUD, 8, 18
jmp hud_charms_done
hud_charms_bottom:
invoke DrawCharmsHUD, 8, 214
hud_charms_done:
cmp flashTimer, 0
je hud_finished
dec flashTimer
@ -3266,7 +3271,11 @@ dice_check_win:
dice_roll_lost:
mov dice3d_win, 0
mov dice3d_state, 2
invoke TriggerCharmLossProtection, dice3d_bet
test eax, eax
jnz @F
invoke PlayCasinoSound3D, OFFSET soundLose, 0, 1
@@:
invoke NpcRecordRound3D,8,0
call SaveProgress3D
ret
@ -5165,6 +5174,7 @@ include src_graphics\buckshot.inc
include src_graphics\russian_table.inc
include src_graphics\unavailable.inc
include src_graphics\hell_tower.inc
include src_graphics\charms.inc
; --- Main Loop of the 3D Casino Engine ---
StartHellTower3D PROC uses ebx esi edi

Binary file not shown.

BIN
poker.exe

Binary file not shown.

BIN
poker.obj

Binary file not shown.

File diff suppressed because it is too large Load diff

204
src_graphics/charms.inc Normal file
View file

@ -0,0 +1,204 @@
.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

View file

@ -0,0 +1,58 @@
CHARM_COUNT equ 4
CHARM_CLOVER_PRICE equ 12000
CHARM_CLOVER_USES equ 3
CHARM_HORSESHOE_PRICE equ 20000
CHARM_HORSESHOE_USES equ 5
CHARM_SKULL_PRICE equ 35000
CHARM_SKULL_USES equ 1
CHARM_DEVIL_PRICE equ 50000
CHARM_DEVIL_USES equ 2
TriggerCharmLossProtection PROTO :DWORD
TriggerCharmWinBonus PROTO :DWORD
TriggerCharmBulletProtection PROTO
DrawCharmsHUD PROTO :DWORD, :DWORD
.data
; Active Charm Charges
charmCloverUses dd 0
charmHorseshoeUses dd 0
charmSkullUses dd 0
charmDevilUses dd 0
; Charm Store Metadata
charmPrices3D dd CHARM_CLOVER_PRICE, CHARM_HORSESHOE_PRICE, CHARM_SKULL_PRICE, CHARM_DEVIL_PRICE
charmUsesPack3D dd CHARM_CLOVER_USES, CHARM_HORSESHOE_USES, CHARM_SKULL_USES, CHARM_DEVIL_USES
charmNameClover db 'Êëåâåð Óäà÷è',0
charmNameHorseshoe db 'Çîëîòàÿ Ïîäêîâà',0
charmNameSkull db '×åðåï Áåññìåðòèÿ',0
charmNameDevil db 'Êîíòðàêò Äüÿâîëà',0
charmNames3D dd OFFSET charmNameClover, OFFSET charmNameHorseshoe, OFFSET charmNameSkull, OFFSET charmNameDevil
charmDescClover db '15% øàíñ ñïàñòè ñòàâêó',0
charmDescHorseshoe db '+15% ê âûèãðûøó â ñëîòàõ',0
charmDescSkull db '100% ñïàñåíèå îò ïóëè',0
charmDescDevil db '50% øàíñ ñïàñòè ñòàâêó',0
charmDescs3D dd OFFSET charmDescClover, OFFSET charmDescHorseshoe, OFFSET charmDescSkull, OFFSET charmDescDevil
; HUD Flash Messages
msgCharmCloverSave db 'Êëåâåð ñïàñ âàøó ñòàâêó!',0
msgCharmDevilSave db 'Äüÿâîë: ñòàâêà âîçâðàùåíà!',0
msgCharmHorseshoeWin db 'Ïîäêîâà: +15% ê âûèãðûøó!',0
msgCharmSkullSave db '×åðåï: Îñå÷êà! Âû âûæèëè!',0
msgCharmTowerSave db 'Òàëèñìàí ñïàñ âàñ îò ïàäåíèÿ ñ Áàøíè!',0
; Compact HUD Badges
badgeCloverPrefix db '[ÊË:',0
badgeHorsePrefix db '[ÏÊ:',0
badgeSkullPrefix db '[×Ð:',0
badgeDevilPrefix db '[ÊÒ:',0
badgeCloseBracket db '] ',0

View file

@ -1,364 +1,375 @@
; --- hell_tower.inc: Implementation of Hell Tower (10-floor Boss Rush) ---
.code
InitHellTower3D PROC
mov tournamentMode, 1
mov towerStage, 1
mov towerFloorState, TOWER_STATE_BRIEFING
mov towerAnimClock, 0
call PlayTowerRandomMusic
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
InitHellTower3D ENDP
TowerExitToHall PROC
call StopTowerMusic
mov tournamentMode, 0
mov engineMode, MODE_WALK
call ClearKeys3D
ret
TowerExitToHall ENDP
TowerLaunchCurrentFloor PROC uses ebx esi edi
mov eax, towerStage
dec eax
cmp eax, 10
jae @F
jmp launch_valid
@@:
xor eax, eax
launch_valid:
mov edx, towerFloorModes[eax*4]
mov towerCurrentGame, edx
mov towerFloorState, TOWER_STATE_IN_GAME
; Launch corresponding game
cmp edx, MODE_COIN
jne @F
call InitCoinGame
mov engineMode, MODE_COIN
jmp launch_done
@@:
cmp edx, MODE_DICE
jne @F
call InitDiceGame
mov engineMode, MODE_DICE
jmp launch_done
@@:
cmp edx, MODE_SKULLS
jne @F
call InitSkullsGame
mov engineMode, MODE_SKULLS
jmp launch_done
@@:
cmp edx, MODE_BLACKJACK
jne @F
call InitNativeBlackjack3D
mov engineMode, MODE_BLACKJACK
jmp launch_done
@@:
cmp edx, MODE_POKER
jne @F
call InitNativePoker3D
mov engineMode, MODE_POKER
jmp launch_done
@@:
cmp edx, MODE_RUSSIAN
jne @F
call InitRussianGame3D
mov engineMode, MODE_RUSSIAN
jmp launch_done
@@:
cmp edx, MODE_ROULETTE
jne @F
call InitNativeWheel3D
mov engineMode, MODE_ROULETTE
jmp launch_done
@@:
cmp edx, MODE_DURAK
jne @F
call InitNativeDurak3D
mov engineMode, MODE_DURAK
jmp launch_done
@@:
cmp edx, MODE_SKILL
jne @F
call InitSkillGame
mov engineMode, MODE_SKILL
jmp launch_done
@@:
cmp edx, MODE_BUCKSHOT
jne launch_done
call InitBuckshot3D
mov engineMode, MODE_BUCKSHOT
launch_done:
call ClearKeys3D
ret
TowerLaunchCurrentFloor ENDP
TowerReportRoundOutcome PROC uses eax outcome:DWORD
cmp tournamentMode, 1
jne report_exit
mov eax, outcome
cmp eax, 1
jne report_loss
; --- Victory ---
cmp towerStage, 10
jae report_champion
mov towerFloorState, TOWER_STATE_CLEAR
invoke PlayCasinoSound3D, OFFSET soundRoundWin, 0, 1
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
report_champion:
mov towerFloorState, TOWER_STATE_CHAMPION
mov eax, towerPrizeAmount
add bankroll, eax
invoke PlayCasinoSound3D, OFFSET soundRoundWin, 0, 1
call SaveProgress3D
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
report_loss:
mov towerFloorState, TOWER_STATE_DEFEAT
call StopTowerMusic
invoke PlayCasinoSound3D, OFFSET soundRoundLose, 0, 1
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
report_exit:
ret
TowerReportRoundOutcome ENDP
HandleHellTowerInput PROC
mov eax, towerFloorState
cmp eax, TOWER_STATE_BRIEFING
je input_briefing
cmp eax, TOWER_STATE_CLEAR
je input_clear
cmp eax, TOWER_STATE_DEFEAT
je input_defeat
cmp eax, TOWER_STATE_CHAMPION
je input_champion
ret
input_briefing:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jz @F
call TowerExitToHall
ret
@@:
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz start_stage
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz start_stage
ret
start_stage:
call TowerLaunchCurrentFloor
ret
input_clear:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jz @F
call TowerExitToHall
ret
@@:
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz advance_stage
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz advance_stage
ret
advance_stage:
inc towerStage
mov towerFloorState, TOWER_STATE_BRIEFING
call ClearKeys3D
ret
input_defeat:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz exit_to_hall
ret
input_champion:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz exit_to_hall
ret
exit_to_hall:
call TowerExitToHall
ret
HandleHellTowerInput ENDP
RenderHellTower3D PROC uses ebx esi edi
; 1. Clear background with deep infernal maroon
lea edi, screenBuffer
mov ecx, SCREEN_SIZE
mov eax, 00100202h
rep stosd
; 2. Outer and inner border
invoke DrawBoxBorder, 8, 8, 304, 224, 00120202h, 00CC2222h, 2
invoke DrawBoxBorder, 12, 12, 296, 216, 000C0202h, 00881111h, 1
; 3. Header Banner (Centered: 192px wide, (320 - 192)/2 = 64)
invoke DrawBoxBorder, 18, 16, 284, 20, 00220404h, 00FF4444h, 1
invoke DrawString8x8, 64, 22, OFFSET towerHeader, 00FFDD66h
; 4. Floor Header & Segment Progress Bar
invoke DrawString8x8, 26, 42, OFFSET towerFloorPrefix, 00FF6666h
invoke FormatNumber, towerStage, OFFSET hudNumBuffer
invoke DrawString8x8, 66, 42, OFFSET hudNumBuffer, 00FFFFFFh
invoke DrawString8x8, 74, 42, OFFSET towerOfTen, 00AAAAAAh
; Draw 10 stage pips across x = 26 .. 293
xor esi, esi
draw_pips_loop:
mov eax, esi
imul eax, 27
add eax, 26 ; x position
mov ebx, eax
; Color based on state
mov ecx, towerStage
dec ecx
cmp esi, ecx
jae pip_future
; Past stage (Cleared): Bright Gold
invoke DrawBoxBorder, ebx, 54, 24, 6, 00DDBB22h, 00FFEE44h, 1
jmp pip_next
pip_future:
je pip_current
; Future stage: Dark
invoke DrawBoxBorder, ebx, 54, 24, 6, 002A0808h, 00441111h, 1
jmp pip_next
pip_current:
; Current stage: Pulsing Fire Red/Orange
invoke DrawBoxBorder, ebx, 54, 24, 6, 00EE3311h, 00FFAA33h, 1
pip_next:
inc esi
cmp esi, 10
jb draw_pips_loop
; 5. Specific State Panels
mov eax, towerFloorState
cmp eax, TOWER_STATE_BRIEFING
je render_briefing
cmp eax, TOWER_STATE_CLEAR
je render_clear
cmp eax, TOWER_STATE_DEFEAT
je render_defeat
cmp eax, TOWER_STATE_CHAMPION
je render_champion
ret
render_briefing:
; Boss & Game Card
invoke DrawBoxBorder, 20, 66, 280, 58, 001E0404h, 00AA2222h, 1
invoke DrawString8x8, 28, 72, OFFSET towerEnemyLabel, 00FFAA55h
mov eax, towerStage
dec eax
mov edx, towerBossNames[eax*4]
invoke DrawString8x8, 76, 72, edx, 00FFFFFFh
invoke DrawString8x8, 28, 86, OFFSET towerGameLabel, 00FFAA55h
mov eax, towerStage
dec eax
mov edx, towerGameNames[eax*4]
invoke DrawString8x8, 76, 86, edx, 00FFDD66h
mov eax, towerStage
dec eax
mov edx, towerDescriptions[eax*4]
invoke DrawString8x8, 28, 104, edx, 00CCCCCCh
; Rules & Warning (fits cleanly inside 300px boundary)
invoke DrawString8x8, 24, 132, OFFSET towerRuleText, 00FFAA33h
invoke DrawString8x8, 24, 146, OFFSET towerLossWarning, 00EE4444h
; Bankroll Display
invoke DrawString8x8, 24, 164, OFFSET textBank3D, 00AAAAAAh
invoke FormatNumber, bankroll, OFFSET hudNumBuffer
invoke DrawString8x8, 76, 164, OFFSET hudNumBuffer, 0066FF66h
; Action Buttons (Centered text inside buttons)
invoke DrawBoxBorder, 22, 184, 132, 24, 003D0C0Ch, 00FF4444h, 1
invoke DrawString8x8, 32, 192, OFFSET towerStartBtn, 00FFFFFFh
invoke DrawBoxBorder, 164, 184, 132, 24, 00220606h, 00882222h, 1
invoke DrawString8x8, 178, 192, OFFSET towerEscBtn, 00AAAAAAh
ret
render_clear:
invoke DrawBoxBorder, 20, 76, 280, 74, 00082208h, 0033CC33h, 2
invoke DrawString8x8, 48, 90, OFFSET towerClearTitle, 0066FF66h
invoke DrawString8x8, 24, 112, OFFSET towerClearDesc, 00FFFFFFh
invoke DrawBoxBorder, 50, 174, 220, 26, 00114411h, 0044FF44h, 1
invoke DrawString8x8, 100, 183, OFFSET towerNextBtn, 00FFFFFFh
ret
render_defeat:
invoke DrawBoxBorder, 20, 76, 280, 74, 002A0404h, 00FF2222h, 2
invoke DrawString8x8, 60, 90, OFFSET towerDefeatTitle, 00FF4444h
invoke DrawString8x8, 36, 112, OFFSET towerDefeatDesc, 00FFFFFFh
invoke DrawBoxBorder, 32, 174, 256, 26, 00441010h, 00FF4444h, 1
invoke DrawString8x8, 48, 183, OFFSET towerReturnBtn, 00FFFFFFh
ret
render_champion:
invoke DrawBoxBorder, 18, 70, 284, 86, 00332200h, 00FFD700h, 2
invoke DrawString8x8, 40, 82, OFFSET towerChampTitle, 00FFE066h
invoke DrawString8x8, 56, 100, OFFSET towerChampSubtitle, 00FFFFFFh
invoke DrawString8x8, 36, 122, OFFSET towerPrizeText, 0066FF66h
invoke DrawBoxBorder, 32, 174, 256, 26, 00443300h, 00FFCC00h, 1
invoke DrawString8x8, 48, 183, OFFSET towerReturnBtn, 00FFFFFFh
ret
RenderHellTower3D ENDP
RenderTowerInGameBadge PROC
cmp tournamentMode, 1
jne badge_done
cmp engineMode, MODE_HELL_TOWER
je badge_done
cmp engineMode, MODE_WALK
je badge_done
invoke DrawBoxBorder, 4, 4, 96, 16, 00220404h, 00FF3333h, 1
invoke DrawString8x8, 8, 8, OFFSET towerHudBadge, 00FFAA55h
invoke FormatNumber, towerStage, OFFSET hudNumBuffer
invoke DrawString8x8, 64, 8, OFFSET hudNumBuffer, 00FFFFFFh
invoke DrawString8x8, 72, 8, OFFSET towerHudOfTen, 00AAAAAAh
badge_done:
ret
RenderTowerInGameBadge ENDP
; --- hell_tower.inc: Implementation of Hell Tower (10-floor Boss Rush) ---
.code
InitHellTower3D PROC
mov tournamentMode, 1
mov towerStage, 1
mov towerFloorState, TOWER_STATE_BRIEFING
mov towerAnimClock, 0
call PlayTowerRandomMusic
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
InitHellTower3D ENDP
TowerExitToHall PROC
call StopTowerMusic
mov tournamentMode, 0
mov engineMode, MODE_WALK
call ClearKeys3D
ret
TowerExitToHall ENDP
TowerLaunchCurrentFloor PROC uses ebx esi edi
mov eax, towerStage
dec eax
cmp eax, 10
jae @F
jmp launch_valid
@@:
xor eax, eax
launch_valid:
mov edx, towerFloorModes[eax*4]
mov towerCurrentGame, edx
mov towerFloorState, TOWER_STATE_IN_GAME
; Launch corresponding game
cmp edx, MODE_COIN
jne @F
call InitCoinGame
mov engineMode, MODE_COIN
jmp launch_done
@@:
cmp edx, MODE_DICE
jne @F
call InitDiceGame
mov engineMode, MODE_DICE
jmp launch_done
@@:
cmp edx, MODE_SKULLS
jne @F
call InitSkullsGame
mov engineMode, MODE_SKULLS
jmp launch_done
@@:
cmp edx, MODE_BLACKJACK
jne @F
call InitNativeBlackjack3D
mov engineMode, MODE_BLACKJACK
jmp launch_done
@@:
cmp edx, MODE_POKER
jne @F
call InitNativePoker3D
mov engineMode, MODE_POKER
jmp launch_done
@@:
cmp edx, MODE_RUSSIAN
jne @F
call InitRussianGame3D
mov engineMode, MODE_RUSSIAN
jmp launch_done
@@:
cmp edx, MODE_ROULETTE
jne @F
call InitNativeWheel3D
mov engineMode, MODE_ROULETTE
jmp launch_done
@@:
cmp edx, MODE_DURAK
jne @F
call InitNativeDurak3D
mov engineMode, MODE_DURAK
jmp launch_done
@@:
cmp edx, MODE_SKILL
jne @F
call InitSkillGame
mov engineMode, MODE_SKILL
jmp launch_done
@@:
cmp edx, MODE_BUCKSHOT
jne launch_done
call InitBuckshot3D
mov engineMode, MODE_BUCKSHOT
launch_done:
call ClearKeys3D
ret
TowerLaunchCurrentFloor ENDP
TowerReportRoundOutcome PROC uses eax outcome:DWORD
cmp tournamentMode, 1
jne report_exit
mov eax, outcome
cmp eax, 1
jne report_loss
; --- Victory ---
cmp towerStage, 10
jae report_champion
mov towerFloorState, TOWER_STATE_CLEAR
invoke PlayCasinoSound3D, OFFSET soundRoundWin, 0, 1
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
report_champion:
mov towerFloorState, TOWER_STATE_CHAMPION
mov eax, towerPrizeAmount
add bankroll, eax
invoke PlayCasinoSound3D, OFFSET soundRoundWin, 0, 1
call SaveProgress3D
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
report_loss:
invoke TriggerCharmLossProtection, 0
test eax, eax
jz @F
mov towerFloorState, TOWER_STATE_BRIEFING
invoke CopyString3D, OFFSET msgCharmTowerSave, OFFSET flashMessage
mov flashTimer, 140
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
@@:
mov towerFloorState, TOWER_STATE_DEFEAT
call StopTowerMusic
invoke PlayCasinoSound3D, OFFSET soundRoundLose, 0, 1
mov engineMode, MODE_HELL_TOWER
call ClearKeys3D
ret
report_exit:
ret
TowerReportRoundOutcome ENDP
HandleHellTowerInput PROC
mov eax, towerFloorState
cmp eax, TOWER_STATE_BRIEFING
je input_briefing
cmp eax, TOWER_STATE_CLEAR
je input_clear
cmp eax, TOWER_STATE_DEFEAT
je input_defeat
cmp eax, TOWER_STATE_CHAMPION
je input_champion
ret
input_briefing:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jz @F
call TowerExitToHall
ret
@@:
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz start_stage
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz start_stage
ret
start_stage:
call TowerLaunchCurrentFloor
ret
input_clear:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jz @F
call TowerExitToHall
ret
@@:
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz advance_stage
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz advance_stage
ret
advance_stage:
inc towerStage
mov towerFloorState, TOWER_STATE_BRIEFING
call ClearKeys3D
ret
input_defeat:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz exit_to_hall
ret
input_champion:
invoke Pressed3D, 1Bh ; ESC
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 20h ; SPACE
test eax, eax
jnz exit_to_hall
invoke Pressed3D, 0Dh ; ENTER
test eax, eax
jnz exit_to_hall
ret
exit_to_hall:
call TowerExitToHall
ret
HandleHellTowerInput ENDP
RenderHellTower3D PROC uses ebx esi edi
; 1. Clear background with deep infernal maroon
lea edi, screenBuffer
mov ecx, SCREEN_SIZE
mov eax, 00100202h
rep stosd
; 2. Outer and inner border
invoke DrawBoxBorder, 8, 8, 304, 224, 00120202h, 00CC2222h, 2
invoke DrawBoxBorder, 12, 12, 296, 216, 000C0202h, 00881111h, 1
; 3. Header Banner (Centered: 192px wide, (320 - 192)/2 = 64)
invoke DrawBoxBorder, 18, 16, 284, 20, 00220404h, 00FF4444h, 1
invoke DrawString8x8, 64, 22, OFFSET towerHeader, 00FFDD66h
; 4. Floor Header & Segment Progress Bar
invoke DrawString8x8, 26, 42, OFFSET towerFloorPrefix, 00FF6666h
invoke FormatNumber, towerStage, OFFSET hudNumBuffer
invoke DrawString8x8, 66, 42, OFFSET hudNumBuffer, 00FFFFFFh
invoke DrawString8x8, 74, 42, OFFSET towerOfTen, 00AAAAAAh
invoke DrawCharmsHUD, 130, 42
; Draw 10 stage pips across x = 26 .. 293
xor esi, esi
draw_pips_loop:
mov eax, esi
imul eax, 27
add eax, 26 ; x position
mov ebx, eax
; Color based on state
mov ecx, towerStage
dec ecx
cmp esi, ecx
jae pip_future
; Past stage (Cleared): Bright Gold
invoke DrawBoxBorder, ebx, 54, 24, 6, 00DDBB22h, 00FFEE44h, 1
jmp pip_next
pip_future:
je pip_current
; Future stage: Dark
invoke DrawBoxBorder, ebx, 54, 24, 6, 002A0808h, 00441111h, 1
jmp pip_next
pip_current:
; Current stage: Pulsing Fire Red/Orange
invoke DrawBoxBorder, ebx, 54, 24, 6, 00EE3311h, 00FFAA33h, 1
pip_next:
inc esi
cmp esi, 10
jb draw_pips_loop
; 5. Specific State Panels
mov eax, towerFloorState
cmp eax, TOWER_STATE_BRIEFING
je render_briefing
cmp eax, TOWER_STATE_CLEAR
je render_clear
cmp eax, TOWER_STATE_DEFEAT
je render_defeat
cmp eax, TOWER_STATE_CHAMPION
je render_champion
ret
render_briefing:
; Boss & Game Card
invoke DrawBoxBorder, 20, 66, 280, 58, 001E0404h, 00AA2222h, 1
invoke DrawString8x8, 28, 72, OFFSET towerEnemyLabel, 00FFAA55h
mov eax, towerStage
dec eax
mov edx, towerBossNames[eax*4]
invoke DrawString8x8, 76, 72, edx, 00FFFFFFh
invoke DrawString8x8, 28, 86, OFFSET towerGameLabel, 00FFAA55h
mov eax, towerStage
dec eax
mov edx, towerGameNames[eax*4]
invoke DrawString8x8, 76, 86, edx, 00FFDD66h
mov eax, towerStage
dec eax
mov edx, towerDescriptions[eax*4]
invoke DrawString8x8, 28, 104, edx, 00CCCCCCh
; Rules & Warning (fits cleanly inside 300px boundary)
invoke DrawString8x8, 24, 132, OFFSET towerRuleText, 00FFAA33h
invoke DrawString8x8, 24, 146, OFFSET towerLossWarning, 00EE4444h
; Bankroll Display
invoke DrawString8x8, 24, 164, OFFSET textBank3D, 00AAAAAAh
invoke FormatNumber, bankroll, OFFSET hudNumBuffer
invoke DrawString8x8, 76, 164, OFFSET hudNumBuffer, 0066FF66h
; Action Buttons (Centered text inside buttons)
invoke DrawBoxBorder, 22, 184, 132, 24, 003D0C0Ch, 00FF4444h, 1
invoke DrawString8x8, 32, 192, OFFSET towerStartBtn, 00FFFFFFh
invoke DrawBoxBorder, 164, 184, 132, 24, 00220606h, 00882222h, 1
invoke DrawString8x8, 178, 192, OFFSET towerEscBtn, 00AAAAAAh
ret
render_clear:
invoke DrawBoxBorder, 20, 76, 280, 74, 00082208h, 0033CC33h, 2
invoke DrawString8x8, 48, 90, OFFSET towerClearTitle, 0066FF66h
invoke DrawString8x8, 24, 112, OFFSET towerClearDesc, 00FFFFFFh
invoke DrawBoxBorder, 50, 174, 220, 26, 00114411h, 0044FF44h, 1
invoke DrawString8x8, 100, 183, OFFSET towerNextBtn, 00FFFFFFh
ret
render_defeat:
invoke DrawBoxBorder, 20, 76, 280, 74, 002A0404h, 00FF2222h, 2
invoke DrawString8x8, 60, 90, OFFSET towerDefeatTitle, 00FF4444h
invoke DrawString8x8, 36, 112, OFFSET towerDefeatDesc, 00FFFFFFh
invoke DrawBoxBorder, 32, 174, 256, 26, 00441010h, 00FF4444h, 1
invoke DrawString8x8, 48, 183, OFFSET towerReturnBtn, 00FFFFFFh
ret
render_champion:
invoke DrawBoxBorder, 18, 70, 284, 86, 00332200h, 00FFD700h, 2
invoke DrawString8x8, 40, 82, OFFSET towerChampTitle, 00FFE066h
invoke DrawString8x8, 56, 100, OFFSET towerChampSubtitle, 00FFFFFFh
invoke DrawString8x8, 36, 122, OFFSET towerPrizeText, 0066FF66h
invoke DrawBoxBorder, 32, 174, 256, 26, 00443300h, 00FFCC00h, 1
invoke DrawString8x8, 48, 183, OFFSET towerReturnBtn, 00FFFFFFh
ret
RenderHellTower3D ENDP
RenderTowerInGameBadge PROC
cmp tournamentMode, 1
jne badge_done
cmp engineMode, MODE_HELL_TOWER
je badge_done
cmp engineMode, MODE_WALK
je badge_done
invoke DrawBoxBorder, 4, 4, 96, 16, 00220404h, 00FF3333h, 1
invoke DrawString8x8, 8, 8, OFFSET towerHudBadge, 00FFAA55h
invoke FormatNumber, towerStage, OFFSET hudNumBuffer
invoke DrawString8x8, 64, 8, OFFSET hudNumBuffer, 00FFFFFFh
invoke DrawString8x8, 72, 8, OFFSET towerHudOfTen, 00AAAAAAh
badge_done:
ret
RenderTowerInGameBadge ENDP

View file

@ -1,42 +1,49 @@
BeginMerchant3D PROTO
HandleMerchant3D PROTO
RenderMerchant3D PROTO
BuyMerchantBack3D PROTO :DWORD
.data
merchantSelected3D dd 0
merchantTime3D dd 0
merchantReaction3D dd 1200
merchantReactionKind3D dd 1
merchantPreviousFocus3D dd 0
merchantMessage3D dd 0
merchantPrices3D dd 0,3000,3000,10000,12000,15000,17000,18000,20000,22000,22000,23000,24000
merchantGrey3D db 209,197,208,197,193,208,206,0
merchantBlue3D db 209,192,207,212,200,208,206,194,192,223,32,194,206,203,205,192,0
merchantRed3D db 193,192,195,208,206,194,219,201,32,202,208,197,209,210,0
merchantGold3D db 199,206,203,206,210,206,197,32,209,206,203,205,214,197,0
merchantSkull3D db 215,197,208,197,207,32,200,32,208,206,199,219,0
merchantClover3D db 202,203,197,194,197,208,0
merchantArcane3D db 192,208,202,192,205,192,0
merchantNoir3D db 205,211,192,208,0
merchantDiamond3D db 192,203,204,192,199,0
merchantRider3D db 205,192,197,199,196,205,200,202,0
merchantBee3D db 207,215,197,203,192,0
merchantFan3D db 194,197,197,208,0
merchantWeb3D db 207,192,211,210,200,205,192,0
merchantNames3D dd OFFSET merchantGrey3D,OFFSET merchantBlue3D,OFFSET merchantRed3D
dd OFFSET merchantGold3D,OFFSET merchantSkull3D,OFFSET merchantClover3D
dd OFFSET merchantArcane3D,OFFSET merchantNoir3D,OFFSET merchantDiamond3D
dd OFFSET merchantRider3D,OFFSET merchantBee3D,OFFSET merchantFan3D,OFFSET merchantWeb3D
merchantTitle3D db 209,200,196,206,208,206,194,200,215,0
merchantStock3D db 208,211,193,192,216,202,200,0
merchantBuy3D db 202,211,207,200,210,220,0
merchantOwned3D db 197,209,210,220,0
merchantEquipped3D db 205,192,196,197,210,206,0
merchantPoor3D db 204,192,203,206,32,212,200,216,197,202,0
merchantShopKeys3D db 194,194,197,208,213,47,194,205,200,199,32,32,69,78,84,69,82,58,32,202,211,207,200,210,220,32,32,69,83,67,58,32
db 213,206,203,203,0
merchantHello3D db 207,206,209,204,206,210,208,200,44,32,215,210,206,32,197,209,210,220,46,0
merchantThanks3D db 213,206,208,206,216,200,201,32,194,219,193,206,208,46,0
merchantArrowUp3D db "^",0
merchantArrowDown3D db "v",0
.code
BeginMerchant3D PROTO
HandleMerchant3D PROTO
RenderMerchant3D PROTO
BuyMerchantBack3D PROTO :DWORD
BuyMerchantCharm3D PROTO :DWORD
.data
merchantTab3D dd 0
merchantCharmSelected3D dd 0
merchantSelected3D dd 0
merchantTime3D dd 0
merchantReaction3D dd 1200
merchantReactionKind3D dd 1
merchantPreviousFocus3D dd 0
merchantMessage3D dd 0
merchantPrices3D dd 0,3000,3000,10000,12000,15000,17000,18000,20000,22000,22000,23000,24000
merchantGrey3D db 209,197,208,197,193,208,206,0
merchantBlue3D db 209,192,207,212,200,208,206,194,192,223,32,194,206,203,205,192,0
merchantRed3D db 193,192,195,208,206,194,219,201,32,202,208,197,209,210,0
merchantGold3D db 199,206,203,206,210,206,197,32,209,206,203,205,214,197,0
merchantSkull3D db 215,197,208,197,207,32,200,32,208,206,199,219,0
merchantClover3D db 202,203,197,194,197,208,0
merchantArcane3D db 192,208,202,192,205,192,0
merchantNoir3D db 205,211,192,208,0
merchantDiamond3D db 192,203,204,192,199,0
merchantRider3D db 205,192,197,199,196,205,200,202,0
merchantBee3D db 207,215,197,203,192,0
merchantFan3D db 194,197,197,208,0
merchantWeb3D db 207,192,211,210,200,205,192,0
merchantNames3D dd OFFSET merchantGrey3D,OFFSET merchantBlue3D,OFFSET merchantRed3D
dd OFFSET merchantGold3D,OFFSET merchantSkull3D,OFFSET merchantClover3D
dd OFFSET merchantArcane3D,OFFSET merchantNoir3D,OFFSET merchantDiamond3D
dd OFFSET merchantRider3D,OFFSET merchantBee3D,OFFSET merchantFan3D,OFFSET merchantWeb3D
merchantTitle3D db 209,200,196,206,208,206,194,200,215,0
merchantStock3D db 208,211,193,192,216,202,200,0
merchantBuy3D db 202,211,207,200,210,220,0
merchantOwned3D db 197,209,210,220,0
merchantEquipped3D db 205,192,196,197,210,206,0
merchantPoor3D db 204,192,203,206,32,212,200,216,197,202,0
merchantShopKeys3D db 194,194,197,208,213,47,194,205,200,199,32,32,69,78,84,69,82,58,32,202,211,207,200,210,220,32,32,69,83,67,58,32
db 213,206,203,203,0
merchantTabCharmsLabel db 210,192,203,200,209,204,192,205,219,0
merchantDollar3D db '$',0
merchantStockUsesLabel db 199,224,240,58,32,0
merchantShopKeysWithTabs db 84,65,66,58,32,194,234,235,224,228,234,224,32,32,69,78,84,69,82,58,32,202,243,239,232,242,252,32,32,69,83,67,58,32,213,238,235,235,0
merchantHello3D db 207,206,209,204,206,210,208,200,44,32,215,210,206,32,197,209,210,220,46,0
merchantThanks3D db 213,206,208,206,216,200,201,32,194,219,193,206,208,46,0
merchantArrowUp3D db "^",0
merchantArrowDown3D db "v",0
.code

View file

@ -4,6 +4,8 @@ BeginMerchant3D PROC
mov merchantTime3D, 0
mov merchantReaction3D, 1280
mov merchantMessage3D, 0
mov merchantTab3D, 0
mov merchantCharmSelected3D, 0
mov eax, selectedBack3D
cmp eax, 12
jbe @F
@ -46,6 +48,48 @@ 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
@ -57,6 +101,27 @@ HandleMerchant3D PROC uses ebx
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
@ -66,17 +131,53 @@ HandleMerchant3D PROC uses ebx
@@:
invoke Pressed3D, 28h
test eax, eax
jz @F
jz merchant_after_vertical
cmp merchantSelected3D, 12
jae @F
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
@ -114,18 +215,41 @@ merchant_mouse_rows:
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
@ -173,14 +297,45 @@ merchant_draw_pose:
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
invoke DrawString8x8, 173, 36, OFFSET merchantStock3D, 00E9CD9Ah
; Tab 1: [ ÐÓÁÀØÊÈ ] (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: [ ÒÀËÈÑÌÀÍÛ ] (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
@ -225,6 +380,66 @@ merchant_item_status:
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
@ -233,6 +448,6 @@ merchant_render_footer:
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 merchantShopKeys3D, 00C5C7B8h
invoke DrawString8x8, 8, 229, OFFSET merchantShopKeysWithTabs, 00C5C7B8h
ret
RenderMerchant3D ENDP

View file

@ -1,342 +1,345 @@
; Single 52-card deck; dealer stands on all 17s, blackjack pays 3:2.
InitNativeBlackjack3D PROC
mov cardExitActive3D, 0
call LoadCardTableAssets3D
mov cbState3D, CB_IDLE
mov cbPlayerCount3D, 0
mov cbDealerCount3D, 0
mov cbStake3D, 0
mov cbError3D, 0
call InitBJParty3D
call ClearKeys3D
ret
InitNativeBlackjack3D ENDP
NativeBJScore3D PROC uses ebx esi edi hand:DWORD,count:DWORD
mov esi, hand
xor edi, edi
xor ebx, ebx
xor ecx, ecx
bj_score_card:
cmp ecx, count
jae bj_score_soft
mov eax, [esi+ecx*4]
push ecx
xor edx, edx
mov ecx, 13
div ecx
pop ecx
inc ecx
cmp edx, 12
je bj_score_ace
add edx, 2
cmp edx, 10
jbe @F
mov edx, 10
@@:
add edi, edx
jmp bj_score_card
bj_score_ace:
add edi, 11
inc ebx
jmp bj_score_card
bj_score_soft:
cmp edi, 21
jbe bj_score_done
test ebx, ebx
jz bj_score_done
sub edi, 10
dec ebx
jmp bj_score_soft
bj_score_done:
mov eax, edi
ret
NativeBJScore3D ENDP
NativeBJSettle3D PROC result:DWORD
cmp cbState3D, CB_RESULT
je bj_settle_done
mov cbState3D, CB_RESULT
mov cbVisible3D, 1
mov eax, result
mov cbOutcome3D, eax
call ResolveBJParty3D
mov eax, result
cmp eax, 1
je bj_settle_loss
mov eax, cbStake3D
cmp result, 2
je bj_settle_credit
shl eax, 1
cmp result, 3
jne bj_settle_credit
mov edx, cbStake3D
shr edx, 1
add eax, edx
bj_settle_credit:
add bankroll, eax
invoke PlayCasinoSound3D, OFFSET soundRoundWin, 0, 1
jmp bj_settle_save
bj_settle_loss:
invoke PlayCasinoSound3D, OFFSET soundRoundLose, 0, 1
bj_settle_save:
call ClearKeys3D
xor eax,eax
cmp cbOutcome3D,0
sete al
cmp cbOutcome3D,3
jne @F
mov eax,1
@@:
invoke NpcRecordRound3D,1,eax
call SaveProgress3D
bj_settle_done:
ret
NativeBJSettle3D ENDP
StartNativeBlackjack3D PROC
cmp cbState3D, CB_IDLE
je @F
cmp cbState3D, CB_RESULT
jne bj_start_done
@@:
mov eax, cbBet3D
cmp bankroll, eax
jb bj_start_empty
sub bankroll, eax
mov cbStake3D, eax
mov cbError3D, 0
mov cbDouble3D, 0
mov cbEarlyOutcome3D, -1
mov cbBotsSettled3D, 0
mov cbInitialFlights3D, 4
mov cbVisible3D, 0
mov cbPlayerCount3D, 2
mov cbDealerCount3D, 2
mov cbCursor3D, 4
invoke ShuffleCards3D, OFFSET cbDeck3D
mov eax, cbDeck3D[0]
mov cbPlayer3D[0], eax
mov eax, cbDeck3D[4]
mov cbDealer3D[0], eax
mov eax, cbDeck3D[8]
mov cbPlayer3D[4], eax
mov eax, cbDeck3D[12]
mov cbDealer3D[4], eax
cmp cbBotCount3D, 0
je @F
call DealBJParty3D
@@:
invoke NativeBJScore3D, OFFSET cbPlayer3D, 2
mov cbPlayerScore3D, eax
invoke NativeBJScore3D, OFFSET cbDealer3D, 2
mov cbDealerScore3D, eax
mov cbTimer3D, 0
mov cbState3D, CB_DEAL
call ClearKeys3D
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
call SaveProgress3D
bj_start_done:
ret
bj_start_empty:
mov cbError3D, 1
ret
StartNativeBlackjack3D ENDP
NativeBJHit3D PROC uses ebx
cmp cbState3D, CB_PLAYER
jne bj_hit_done
cmp cbPlayerCount3D, 12
jae bj_hit_done
cmp cbCursor3D, 52
jae bj_hit_done
mov ebx, cbCursor3D
mov eax, cbDeck3D[ebx*4]
mov cbCard3D, eax
inc cbCursor3D
mov cbTimer3D, 0
mov cbState3D, CB_HIT
call ClearKeys3D
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
bj_hit_done:
ret
NativeBJHit3D ENDP
HandleNativeBlackjack3D PROC uses ebx
call HandleCardExit3D
test eax, eax
jnz bj_input_done
call BJPartyInput3D
invoke CardTableMouse3D, MODE_BLACKJACK
cmp cardExitActive3D, 0
jne bj_input_done
cmp engineMode, MODE_BLACKJACK
jne bj_input_done
cmp cbState3D, CB_IDLE
je bj_ready_input
cmp cbState3D, CB_RESULT
je bj_ready_input
cmp cbState3D, CB_PLAYER
je bj_player_input
cmp cbState3D, CB_BOTS
jne @F
call UpdateBJParty3D
ret
@@:
mov eax, deltaTime3D
add cbTimer3D, eax
cmp cbState3D, CB_DEAL
jne bj_animate_hit
mov eax, cbInitialFlights3D
imul eax, TABLE_FLIGHT_MS
cmp cbTimer3D, eax
jb bj_input_done
cmp cbDealerScore3D, 21
jne bj_player_natural
mov eax, 1
cmp cbPlayerScore3D, 21
jne @F
mov eax, 2
@@:
invoke NativeBJSettle3D, eax
ret
bj_player_natural:
cmp cbPlayerScore3D, 21
jne bj_begin_player
invoke FinishBJPlayer3D, 3
ret
bj_begin_player:
mov cbState3D, CB_PLAYER
call ClearKeys3D
ret
bj_animate_hit:
cmp cbState3D, CB_HIT
jne bj_animate_dealer
cmp cbTimer3D, TABLE_FLIGHT_MS
jb bj_input_done
mov ebx, cbPlayerCount3D
mov eax, cbCard3D
mov cbPlayer3D[ebx*4], eax
inc cbPlayerCount3D
invoke NativeBJScore3D, OFFSET cbPlayer3D, cbPlayerCount3D
mov cbPlayerScore3D, eax
cmp eax, 21
ja bj_player_bust
je bj_begin_dealer
cmp cbDouble3D, 0
jne bj_begin_dealer
jmp bj_begin_player
bj_player_bust:
invoke FinishBJPlayer3D, 1
ret
bj_animate_dealer:
cmp cbTimer3D, 600
jb bj_input_done
cmp cbDealerScore3D, 17
jae bj_compare_hands
cmp cbDealerCount3D, 12
jae bj_compare_hands
cmp cbCursor3D, 52
jae bj_compare_hands
mov ebx, cbCursor3D
mov eax, cbDeck3D[ebx*4]
inc cbCursor3D
mov ebx, cbDealerCount3D
mov cbDealer3D[ebx*4], eax
inc cbDealerCount3D
invoke NativeBJScore3D, OFFSET cbDealer3D, cbDealerCount3D
mov cbDealerScore3D, eax
mov cbTimer3D, 0
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
ret
bj_compare_hands:
cmp cbEarlyOutcome3D, -1
je @F
invoke NativeBJSettle3D, cbEarlyOutcome3D
ret
@@:
mov eax, cbDealerScore3D
cmp eax, 21
ja bj_player_win
cmp eax, cbPlayerScore3D
jb bj_player_win
je bj_player_push
invoke NativeBJSettle3D, 1
ret
bj_player_win:
invoke NativeBJSettle3D, 0
ret
bj_player_push:
invoke NativeBJSettle3D, 2
ret
bj_player_input:
invoke Pressed3D, 44h
test eax, eax
jz @F
cmp cbPlayerCount3D, 2
jne bj_input_done
mov eax, cbStake3D
cmp bankroll, eax
jb bj_input_done
sub bankroll, eax
add cbStake3D, eax
mov cbDouble3D, 1
call SaveProgress3D
call NativeBJHit3D
ret
@@:
invoke Pressed3D, 48h
test eax, eax
jz @F
call NativeBJHit3D
ret
@@:
invoke Pressed3D, 53h
test eax, eax
jz bj_input_done
bj_begin_dealer:
invoke FinishBJPlayer3D, -1
ret
bj_ready_input:
invoke Pressed3D, 26h
test eax, eax
jz @F
cmp cbBet3D, 10000
jae @F
add cbBet3D, 100
@@:
invoke Pressed3D, 28h
test eax, eax
jz @F
cmp cbBet3D, 100
jbe @F
sub cbBet3D, 100
@@:
cmp tournamentMode, 1
jne bj_regular_start
cmp cbState3D, CB_RESULT
jne bj_regular_start
invoke Pressed3D, 20h
test eax, eax
jnz bj_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz bj_tourney_report
ret
bj_tourney_report:
cmp cbOutcome3D, 1
je bj_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
bj_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
bj_regular_start:
invoke Pressed3D, 20h
test eax, eax
jz bj_input_done
call StartNativeBlackjack3D
bj_input_done:
ret
HandleNativeBlackjack3D ENDP
include src_graphics\native_blackjack_party.inc
; Single 52-card deck; dealer stands on all 17s, blackjack pays 3:2.
InitNativeBlackjack3D PROC
mov cardExitActive3D, 0
call LoadCardTableAssets3D
mov cbState3D, CB_IDLE
mov cbPlayerCount3D, 0
mov cbDealerCount3D, 0
mov cbStake3D, 0
mov cbError3D, 0
call InitBJParty3D
call ClearKeys3D
ret
InitNativeBlackjack3D ENDP
NativeBJScore3D PROC uses ebx esi edi hand:DWORD,count:DWORD
mov esi, hand
xor edi, edi
xor ebx, ebx
xor ecx, ecx
bj_score_card:
cmp ecx, count
jae bj_score_soft
mov eax, [esi+ecx*4]
push ecx
xor edx, edx
mov ecx, 13
div ecx
pop ecx
inc ecx
cmp edx, 12
je bj_score_ace
add edx, 2
cmp edx, 10
jbe @F
mov edx, 10
@@:
add edi, edx
jmp bj_score_card
bj_score_ace:
add edi, 11
inc ebx
jmp bj_score_card
bj_score_soft:
cmp edi, 21
jbe bj_score_done
test ebx, ebx
jz bj_score_done
sub edi, 10
dec ebx
jmp bj_score_soft
bj_score_done:
mov eax, edi
ret
NativeBJScore3D ENDP
NativeBJSettle3D PROC result:DWORD
cmp cbState3D, CB_RESULT
je bj_settle_done
mov cbState3D, CB_RESULT
mov cbVisible3D, 1
mov eax, result
mov cbOutcome3D, eax
call ResolveBJParty3D
mov eax, result
cmp eax, 1
je bj_settle_loss
mov eax, cbStake3D
cmp result, 2
je bj_settle_credit
shl eax, 1
cmp result, 3
jne bj_settle_credit
mov edx, cbStake3D
shr edx, 1
add eax, edx
bj_settle_credit:
add bankroll, eax
invoke PlayCasinoSound3D, OFFSET soundRoundWin, 0, 1
jmp bj_settle_save
bj_settle_loss:
invoke TriggerCharmLossProtection, cbStake3D
test eax, eax
jnz bj_settle_save
invoke PlayCasinoSound3D, OFFSET soundRoundLose, 0, 1
bj_settle_save:
call ClearKeys3D
xor eax,eax
cmp cbOutcome3D,0
sete al
cmp cbOutcome3D,3
jne @F
mov eax,1
@@:
invoke NpcRecordRound3D,1,eax
call SaveProgress3D
bj_settle_done:
ret
NativeBJSettle3D ENDP
StartNativeBlackjack3D PROC
cmp cbState3D, CB_IDLE
je @F
cmp cbState3D, CB_RESULT
jne bj_start_done
@@:
mov eax, cbBet3D
cmp bankroll, eax
jb bj_start_empty
sub bankroll, eax
mov cbStake3D, eax
mov cbError3D, 0
mov cbDouble3D, 0
mov cbEarlyOutcome3D, -1
mov cbBotsSettled3D, 0
mov cbInitialFlights3D, 4
mov cbVisible3D, 0
mov cbPlayerCount3D, 2
mov cbDealerCount3D, 2
mov cbCursor3D, 4
invoke ShuffleCards3D, OFFSET cbDeck3D
mov eax, cbDeck3D[0]
mov cbPlayer3D[0], eax
mov eax, cbDeck3D[4]
mov cbDealer3D[0], eax
mov eax, cbDeck3D[8]
mov cbPlayer3D[4], eax
mov eax, cbDeck3D[12]
mov cbDealer3D[4], eax
cmp cbBotCount3D, 0
je @F
call DealBJParty3D
@@:
invoke NativeBJScore3D, OFFSET cbPlayer3D, 2
mov cbPlayerScore3D, eax
invoke NativeBJScore3D, OFFSET cbDealer3D, 2
mov cbDealerScore3D, eax
mov cbTimer3D, 0
mov cbState3D, CB_DEAL
call ClearKeys3D
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
call SaveProgress3D
bj_start_done:
ret
bj_start_empty:
mov cbError3D, 1
ret
StartNativeBlackjack3D ENDP
NativeBJHit3D PROC uses ebx
cmp cbState3D, CB_PLAYER
jne bj_hit_done
cmp cbPlayerCount3D, 12
jae bj_hit_done
cmp cbCursor3D, 52
jae bj_hit_done
mov ebx, cbCursor3D
mov eax, cbDeck3D[ebx*4]
mov cbCard3D, eax
inc cbCursor3D
mov cbTimer3D, 0
mov cbState3D, CB_HIT
call ClearKeys3D
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
bj_hit_done:
ret
NativeBJHit3D ENDP
HandleNativeBlackjack3D PROC uses ebx
call HandleCardExit3D
test eax, eax
jnz bj_input_done
call BJPartyInput3D
invoke CardTableMouse3D, MODE_BLACKJACK
cmp cardExitActive3D, 0
jne bj_input_done
cmp engineMode, MODE_BLACKJACK
jne bj_input_done
cmp cbState3D, CB_IDLE
je bj_ready_input
cmp cbState3D, CB_RESULT
je bj_ready_input
cmp cbState3D, CB_PLAYER
je bj_player_input
cmp cbState3D, CB_BOTS
jne @F
call UpdateBJParty3D
ret
@@:
mov eax, deltaTime3D
add cbTimer3D, eax
cmp cbState3D, CB_DEAL
jne bj_animate_hit
mov eax, cbInitialFlights3D
imul eax, TABLE_FLIGHT_MS
cmp cbTimer3D, eax
jb bj_input_done
cmp cbDealerScore3D, 21
jne bj_player_natural
mov eax, 1
cmp cbPlayerScore3D, 21
jne @F
mov eax, 2
@@:
invoke NativeBJSettle3D, eax
ret
bj_player_natural:
cmp cbPlayerScore3D, 21
jne bj_begin_player
invoke FinishBJPlayer3D, 3
ret
bj_begin_player:
mov cbState3D, CB_PLAYER
call ClearKeys3D
ret
bj_animate_hit:
cmp cbState3D, CB_HIT
jne bj_animate_dealer
cmp cbTimer3D, TABLE_FLIGHT_MS
jb bj_input_done
mov ebx, cbPlayerCount3D
mov eax, cbCard3D
mov cbPlayer3D[ebx*4], eax
inc cbPlayerCount3D
invoke NativeBJScore3D, OFFSET cbPlayer3D, cbPlayerCount3D
mov cbPlayerScore3D, eax
cmp eax, 21
ja bj_player_bust
je bj_begin_dealer
cmp cbDouble3D, 0
jne bj_begin_dealer
jmp bj_begin_player
bj_player_bust:
invoke FinishBJPlayer3D, 1
ret
bj_animate_dealer:
cmp cbTimer3D, 600
jb bj_input_done
cmp cbDealerScore3D, 17
jae bj_compare_hands
cmp cbDealerCount3D, 12
jae bj_compare_hands
cmp cbCursor3D, 52
jae bj_compare_hands
mov ebx, cbCursor3D
mov eax, cbDeck3D[ebx*4]
inc cbCursor3D
mov ebx, cbDealerCount3D
mov cbDealer3D[ebx*4], eax
inc cbDealerCount3D
invoke NativeBJScore3D, OFFSET cbDealer3D, cbDealerCount3D
mov cbDealerScore3D, eax
mov cbTimer3D, 0
invoke PlayCasinoSound3D, OFFSET soundCards, 0, 1
ret
bj_compare_hands:
cmp cbEarlyOutcome3D, -1
je @F
invoke NativeBJSettle3D, cbEarlyOutcome3D
ret
@@:
mov eax, cbDealerScore3D
cmp eax, 21
ja bj_player_win
cmp eax, cbPlayerScore3D
jb bj_player_win
je bj_player_push
invoke NativeBJSettle3D, 1
ret
bj_player_win:
invoke NativeBJSettle3D, 0
ret
bj_player_push:
invoke NativeBJSettle3D, 2
ret
bj_player_input:
invoke Pressed3D, 44h
test eax, eax
jz @F
cmp cbPlayerCount3D, 2
jne bj_input_done
mov eax, cbStake3D
cmp bankroll, eax
jb bj_input_done
sub bankroll, eax
add cbStake3D, eax
mov cbDouble3D, 1
call SaveProgress3D
call NativeBJHit3D
ret
@@:
invoke Pressed3D, 48h
test eax, eax
jz @F
call NativeBJHit3D
ret
@@:
invoke Pressed3D, 53h
test eax, eax
jz bj_input_done
bj_begin_dealer:
invoke FinishBJPlayer3D, -1
ret
bj_ready_input:
invoke Pressed3D, 26h
test eax, eax
jz @F
cmp cbBet3D, 10000
jae @F
add cbBet3D, 100
@@:
invoke Pressed3D, 28h
test eax, eax
jz @F
cmp cbBet3D, 100
jbe @F
sub cbBet3D, 100
@@:
cmp tournamentMode, 1
jne bj_regular_start
cmp cbState3D, CB_RESULT
jne bj_regular_start
invoke Pressed3D, 20h
test eax, eax
jnz bj_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz bj_tourney_report
ret
bj_tourney_report:
cmp cbOutcome3D, 1
je bj_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
bj_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
bj_regular_start:
invoke Pressed3D, 20h
test eax, eax
jz bj_input_done
call StartNativeBlackjack3D
bj_input_done:
ret
HandleNativeBlackjack3D ENDP
include src_graphics\native_blackjack_party.inc

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -66,7 +66,7 @@ displaySettingsPath3D db "runtime\display.cfg",0
displaySettingsData3D dd 44535031h,1,0
displaySettingsIo3D dd 0
savePath3D db "runtime\casino3d-progress.dat",0
saveData3D dd 32443343h, 10000, 0, 0
saveData3D dd 32443343h, 10000, 0, 0, 0, 0, 0, 0
saveIo3D dd 0
previewBackMap3D dd 0,3,5,2
textPause3D db 202,192,199,200,205,206,32,47,32,205,192,209,210,208,206,201,202,200,0

File diff suppressed because it is too large Load diff

View file

@ -410,6 +410,16 @@ FinishScratch3D PROC
mov eax,1000000000
@@:
mov bankroll,eax
mov ecx, scrGross3D
cmp ecx, scrStake3D
ja scratch_charm_win
cmp ecx, 0
jne @F
invoke TriggerCharmLossProtection, scrStake3D
jmp @F
scratch_charm_win:
invoke TriggerCharmWinBonus, scrGross3D
@@:
call ScratchStartPayout3D
call SaveProgress3D
scratch_finish_done: