- 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
375 lines
9.8 KiB
PHP
375 lines
9.8 KiB
PHP
; --- 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
|