merge: integrate Artem's features (billiards, scratch, dice, city wake) with Hell Tower 3D and poker cleanup

This commit is contained in:
Игорь Федосеев 2026-10-16 12:46:13 +03:00
commit 2c1b83865a
16 changed files with 788 additions and 10654 deletions

1
.gitignore vendored
View file

@ -9,6 +9,7 @@ __pycache__/
*.obj
/tools/vendor/
/tools/generated_frames/
/graphify-out/
# Generated build/test output; keep packaging source and shipping exe files.
/build/actions/

Binary file not shown.

View file

@ -169,6 +169,7 @@ include src_graphics\native_clover_data.inc
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
.data
ALIGN 4
@ -206,6 +207,7 @@ playerPlaneX dd (FP_1 * 66 / 100)
playerPlaneY dd 0
engineMode dd 0
startInHellTower dd 0
interactTargetId dd 0
interactPromptPtr dd 0
dancerLuckBuff dd 0
@ -3230,6 +3232,24 @@ dice_roll_lost:
ret
dice_handle_result:
cmp tournamentMode, 1
jne @F
invoke Pressed3D, 20h
test eax, eax
jnz dice_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz dice_tourney_report
ret
dice_tourney_report:
cmp dice3d_win, 0
je dice_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
dice_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
@@:
invoke Pressed3D, 20h
test eax, eax
jz dice_done
@ -3553,6 +3573,24 @@ skulls_pick_3:
ret
skulls_handle_reveal:
cmp tournamentMode, 1
jne @F
invoke Pressed3D, 20h
test eax, eax
jnz skulls_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz skulls_tourney_report
ret
skulls_tourney_report:
cmp skulls3d_win, 0
je skulls_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
skulls_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
@@:
invoke Pressed3D, 20h
test eax, eax
jz skulls_input_done
@ -4168,6 +4206,24 @@ skill_handle_round_wait:
ret
skill_handle_end_wait:
cmp tournamentMode, 1
jne @F
invoke Pressed3D, 20h
test eax, eax
jnz skill_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz skill_tourney_report
ret
skill_tourney_report:
cmp skill3d_state, 4
jne skill_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
skill_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
@@:
invoke Pressed3D, 20h
test eax, eax
jz skill_input_done
@ -4689,7 +4745,7 @@ check_target_umamusume:
check_target_hell:
cmp eax, INTERACT_HELL_TOWER
jne check_target_shop
call BeginUnavailable3D
call InitHellTower3D
ret
check_target_shop:
@ -5048,8 +5104,15 @@ include src_graphics\billiards.inc
include src_graphics\buckshot.inc
include src_graphics\russian_table.inc
include src_graphics\unavailable.inc
include src_graphics\hell_tower.inc
; --- Main Loop of the 3D Casino Engine ---
StartHellTower3D PROC uses ebx esi edi
mov startInHellTower, 1
call StartCasino3D
ret
StartHellTower3D ENDP
StartCasino3D PROC uses ebx esi edi
call Init3DEngine
test eax, eax
@ -5057,6 +5120,10 @@ StartCasino3D PROC uses ebx esi edi
invoke timeGetTime
mov rngSeed3D, eax
mov previousTick3D, eax
cmp startInHellTower, 1
jne engine_loop
mov startInHellTower, 0
call InitHellTower3D
engine_loop:
invoke PeekMessageA, OFFSET msg3D, 0, 0, 0, PM_REMOVE
test eax, eax
@ -5128,6 +5195,11 @@ leave_table:
jmp engine_tick
leave_idle_table:
mov paused3D, 0
cmp tournamentMode, 1
jne @F
call TowerExitToHall
jmp engine_tick
@@:
mov engineMode, MODE_WALK
call ClearKeys3D
invoke PlayCasinoSound3D, 0, 0, 0
@ -5176,6 +5248,12 @@ check_slots_mode:
je check_walk_mode
call RenderScratch3D
jmp present_frame
@@:
cmp engineMode, MODE_HELL_TOWER
jne @F
call HandleHellTowerInput
call RenderHellTower3D
jmp present_frame
@@:
cmp engineMode,MODE_CLOVER
jne @F
@ -5371,6 +5449,7 @@ pause_low_spec_saved:
call SaveProgress3D
jmp engine_shutdown
present_frame:
call RenderTowerInGameBadge
mov eax, engineMode
cmp eax, lastPersistMode3D
je @F

10663
poker.asm

File diff suppressed because it is too large Load diff

BIN
poker.exe

Binary file not shown.

BIN
poker.obj

Binary file not shown.

View file

@ -514,6 +514,24 @@ bs_update_state:
je bs_input_recovery
cmp eax, BS_ERROR
je bs_input_done
cmp tournamentMode, 1
jne bs_regular_restart
invoke Pressed3D, 20h
test eax, eax
jnz bs_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz bs_tourney_report
ret
bs_tourney_report:
cmp bs3d_state, BS_WIN
jne bs_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
bs_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
bs_regular_restart:
invoke Pressed3D, 20h
test eax, eax
jz bs_input_done

364
src_graphics/hell_tower.inc Normal file
View file

@ -0,0 +1,364 @@
; --- 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

View file

@ -0,0 +1,82 @@
; --- hell_tower_data.inc: Data for Hell Tower 3D ---
MODE_HELL_TOWER equ 23
TOWER_STATE_BRIEFING equ 0
TOWER_STATE_IN_GAME equ 1
TOWER_STATE_CLEAR equ 2
TOWER_STATE_DEFEAT equ 3
TOWER_STATE_CHAMPION equ 4
InitHellTower3D PROTO
TowerExitToHall PROTO
TowerReportRoundOutcome PROTO :DWORD
RenderTowerInGameBadge PROTO
.data
towerStage dd 1
towerFloorState dd 0
towerAnimClock dd 0
towerCurrentGame dd 0
towerPrizeAmount dd 66600
towerHudText db 91,32,0
towerFloorModes dd MODE_COIN, MODE_DICE, MODE_SKULLS, MODE_BLACKJACK, MODE_POKER, MODE_RUSSIAN, MODE_ROULETTE, MODE_DURAK, MODE_SKILL, MODE_BUCKSHOT
towerBoss1 db 193,197,209,32,192,199,192,208,210,192,0
towerBoss2 db 196,197,204,206,205,32,202,206,209,210,197,201,0
towerBoss3 db 215,197,208,205,206,202,205,200,198,205,200,202,0
towerBoss4 db 202,208,211,207,220,197,32,207,208,197,200,209,207,206,196,205,197,201,0
towerBoss5 db 196,197,204,206,205,32,193,203,197,212,192,0
towerBoss6 db 206,193,208,197,215,197,205,205,219,201,32,195,208,197,216,205,200,202,0
towerBoss7 db 202,206,203,197,209,206,32,209,211,196,220,193,219,0
towerBoss8 db 202,192,208,210,206,215,205,219,201,32,215,197,208,210,0
towerBoss9 db 207,192,203,192,215,32,202,208,222,202,192,0
towerBoss10 db 194,203,192,196,219,202,192,32,193,192,216,205,200,0
towerBossNames dd OFFSET towerBoss1, OFFSET towerBoss2, OFFSET towerBoss3, OFFSET towerBoss4, OFFSET towerBoss5, OFFSET towerBoss6, OFFSET towerBoss7, OFFSET towerBoss8, OFFSET towerBoss9, OFFSET towerBoss10
towerGame1 db 206,240,229,235,32,232,32,240,229,248,234,224,0
towerGame2 db 202,238,241,242,232,0
towerGame3 db 215,229,240,229,239,224,32,232,32,248,224,240,232,234,0
towerGame4 db 50,49,32,47,32,206,247,234,238,0
towerGame5 db 207,238,234,229,240,0
towerGame6 db 208,243,241,241,234,224,255,32,240,243,235,229,242,234,224,0
towerGame7 db 202,224,231,232,237,238,45,240,243,235,229,242,234,224,0
towerGame8 db 196,243,240,224,234,0
towerGame9 db 202,240,254,234,58,32,83,107,105,108,108,32,67,104,101,99,107,0
towerGame10 db 66,117,99,107,115,104,111,116,32,82,111,117,108,101,116,116,101,0
towerGameNames dd OFFSET towerGame1, OFFSET towerGame2, OFFSET towerGame3, OFFSET towerGame4, OFFSET towerGame5, OFFSET towerGame6, OFFSET towerGame7, OFFSET towerGame8, OFFSET towerGame9, OFFSET towerGame10
towerDesc1 db 211,227,224,228,224,233,32,241,242,238,240,238,237,243,32,236,238,237,229,242,251,46,0
towerDesc2 db 207,229,240,229,225,240,238,241,252,32,228,229,236,238,237,224,32,226,32,241,243,236,236,229,32,234,238,241,242,229,233,46,0
towerDesc3 db 205,224,233,228,232,32,228,243,248,243,32,239,238,228,32,247,229,240,229,239,238,236,46,0
towerDesc4 db 209,238,225,229,240,232,32,50,49,32,238,247,234,238,32,232,32,239,238,225,229,228,232,32,234,240,243,239,252,229,46,0
towerDesc5 db 194,241,234,240,238,233,32,234,224,240,242,251,32,232,32,239,238,225,229,228,232,32,226,32,239,238,234,229,240,46,0
towerDesc6 db 49,32,239,224,242,240,238,237,32,226,32,225,224,240,224,225,224,237,229,58,32,226,251,230,232,226,232,46,0
towerDesc7 db 209,228,229,235,224,233,32,241,242,224,226,234,243,32,237,224,32,240,243,235,229,242,234,229,46,0
towerDesc8 db 206,241,242,224,226,252,32,247,184,240,242,224,32,226,32,228,243,240,224,234,224,245,46,0
towerDesc9 db 207,238,239,224,228,232,32,226,32,231,238,237,243,32,232,32,241,238,240,226,232,241,252,32,241,32,234,240,254,234,224,46,0
towerDesc10 db 196,243,253,235,252,32,237,224,32,228,240,238,225,238,226,232,234,224,245,32,231,224,32,230,232,231,237,252,33,0
towerDescriptions dd OFFSET towerDesc1, OFFSET towerDesc2, OFFSET towerDesc3, OFFSET towerDesc4, OFFSET towerDesc5, OFFSET towerDesc6, OFFSET towerDesc7, OFFSET towerDesc8, OFFSET towerDesc9, OFFSET towerDesc10
towerHeader db 202,192,199,200,205,206,32,51,68,32,45,32,192,196,209,202,192,223,32,193,192,216,205,223,0
towerFloorPrefix db 221,210,192,198,32,0
towerOfTen db 32,47,32,49,48,0
towerEnemyLabel db 194,208,192,195,58,32,0
towerGameLabel db 200,195,208,192,58,32,0
towerRuleText db 49,48,32,225,232,242,226,32,239,238,228,240,255,228,32,225,229,231,32,239,240,224,226,224,32,237,224,32,238,248,232,225,234,243,0
towerLossWarning db 207,238,240,224,230,229,237,232,229,32,45,32,226,238,231,226,240,224,242,32,226,32,245,238,235,235,32,234,224,231,232,237,238,0
towerStartBtn db 91,207,208,206,193,197,203,93,32,194,32,193,206,201,0
towerEscBtn db 91,69,83,67,93,32,209,193,197,198,192,210,220,0
towerClearTitle db 221,210,192,198,32,199,192,215,200,217,197,205,33,32,194,208,192,195,32,207,206,194,197,208,198,197,205,33,0
towerClearDesc db 194,240,224,227,32,239,238,226,229,240,230,229,237,33,32,194,239,229,240,229,228,232,32,237,238,226,251,233,32,253,242,224,230,46,0
towerNextBtn db 91,207,208,206,193,197,203,93,32,196,192,203,220,216,197,0
towerDefeatTitle db 194,219,32,207,192,203,200,32,194,32,192,196,209,202,206,201,32,193,192,216,205,197,46,46,46,0
towerDefeatDesc db 194,224,248,224,32,228,243,248,224,32,237,224,226,229,234,232,32,241,227,238,240,229,235,224,32,226,32,192,228,243,46,0
towerReturnBtn db 91,207,208,206,193,197,203,32,47,32,69,83,67,93,32,194,32,213,206,203,203,32,202,192,199,200,205,206,0
towerChampTitle db 210,208,200,211,204,212,33,32,192,196,209,202,192,223,32,193,192,216,205,223,32,207,206,202,206,208,197,205,192,33,0
towerChampSubtitle db 194,219,32,45,32,215,197,204,207,200,206,205,32,192,196,209,202,206,201,32,193,192,216,205,200,33,0
towerPrizeText db 209,211,207,197,208,207,208,200,199,58,32,43,36,54,54,44,54,48,48,32,194,32,193,192,205,202,208,206,203,203,33,0
towerHudBadge db 193,192,216,205,223,58,32,0
towerHudOfTen db 47,49,48,0

View file

@ -312,6 +312,26 @@ bj_ready_input:
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

View file

@ -56,6 +56,11 @@ FreeNativeCoinArt3D ENDP
CoinEscape3D PROC
mov paused3D,0
cmp tournamentMode, 1
jne @F
call TowerExitToHall
ret
@@:
cmp coin3d_state,COIN_TOSS
jne coin_leave_hall
mov coinExitQueued3D,1
@ -149,6 +154,27 @@ coin_native_settle:
coin_native_result:
cmp coin3d_state,COIN_RESULT
jne coin_native_mouse
cmp tournamentMode, 1
jne coin_regular_result
invoke Pressed3D,20h
test eax,eax
jnz coin_tourney_report
invoke Pressed3D,0Dh
test eax,eax
jnz coin_tourney_report
cmp mouseClick3D,0
je coin_native_done
mov mouseClick3D,0
coin_tourney_report:
call CloseCoinDetail3D
cmp coin3d_win, 0
je @F
invoke TowerReportRoundOutcome, 1
ret
@@:
invoke TowerReportRoundOutcome, 2
ret
coin_regular_result:
invoke Pressed3D,20h
test eax,eax
jnz coin_native_again

View file

@ -870,6 +870,18 @@ dk_ready_input:
test eax, eax
jz dk_input_done
dk_ready_start:
cmp tournamentMode, 1
jne @F
cmp dkState3D, DK_RESULT
jne @F
cmp dkOutcome3D, 0
jne dk_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
dk_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
@@:
call StartNativeDurak3D
dk_input_done:
ret

View file

@ -551,6 +551,26 @@ poker_ready_input:
jbe @F
sub pkBlind3D, 50
@@:
cmp tournamentMode, 1
jne poker_regular_start
cmp pkState3D, PK_RESULT
jne poker_regular_start
invoke Pressed3D, 20h
test eax, eax
jnz poker_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz poker_tourney_report
ret
poker_tourney_report:
cmp pkOutcome3D, 1
je poker_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
poker_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
poker_regular_start:
invoke Pressed3D, 20h
test eax, eax
jz poker_input_done

View file

@ -304,6 +304,27 @@ wheel_mouse_clear:
call InitNativeWheel3D
ret
wheel_spin_input:
cmp roulState, 2
jne wheel_regular_spin
cmp tournamentMode, 1
jne wheel_regular_spin
invoke Pressed3D, 20h
test eax, eax
jnz wheel_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz wheel_tourney_report
ret
wheel_tourney_report:
mov ecx, wheelReturn3D
cmp ecx, wheelStake3D
ja wheel_tourney_win
invoke TowerReportRoundOutcome, 2
ret
wheel_tourney_win:
invoke TowerReportRoundOutcome, 1
ret
wheel_regular_spin:
invoke Pressed3D, 20h
test eax, eax
jz wheel_handle_done

View file

@ -312,6 +312,24 @@ rr_input_fire:
mov rr3d_timer, 0
ret
rr_input_next:
cmp tournamentMode, 1
jne @F
invoke Pressed3D, 20h
test eax, eax
jnz rr_tourney_report
invoke Pressed3D, 0Dh
test eax, eax
jnz rr_tourney_report
ret
rr_tourney_report:
cmp rr3d_state, RR_WIN
jne rr_tourney_loss
invoke TowerReportRoundOutcome, 1
ret
rr_tourney_loss:
invoke TowerReportRoundOutcome, 2
ret
@@:
invoke Pressed3D, 20h
test eax, eax
jz rr_input_done

View file

@ -0,0 +1,116 @@
def make_db(s):
b = s.encode('cp1251')
return ','.join(str(x) for x in b) + ',0'
bosses = [
'БЕС АЗАРТА',
'ДЕМОН КОСТЕЙ',
'ЧЕРНОКНИЖНИК',
'КРУПЬЕ ПРЕИСПОДНЕЙ',
'ДЕМОН БЛЕФА',
'ОБРЕЧЕННЫЙ ГРЕШНИК',
'КОЛЕСО СУДЬБЫ',
'КАРТОЧНЫЙ ЧЕРТ',
'ПАЛАЧ КРЮКА',
'ВЛАДЫКА БАШНИ'
]
games = [
'Орел и решка',
'Кости',
'Черепа и шарик',
'21 / Очко',
'Покер',
'Русская рулетка',
'Казино-рулетка',
'Дурак',
'Крюк: Skill Check',
'Buckshot Roulette'
]
descs = [
'Угадай сторону монеты.',
'Перебрось демона в сумме костей.',
'Найди душу под черепом.',
'Собери 21 очко и победи крупье.',
'Вскрой карты и победи в покер.',
'1 патрон в барабане: выживи.',
'Сделай ставку на рулетке.',
'Оставь чёрта в дураках.',
'Попади в зону и сорвись с крюка.',
'Дуэль на дробовиках за жизнь!'
]
lines = []
lines.append('; --- hell_tower_data.inc: Data for Hell Tower 3D ---')
lines.append('MODE_HELL_TOWER equ 22')
lines.append('TOWER_STATE_BRIEFING equ 0')
lines.append('TOWER_STATE_IN_GAME equ 1')
lines.append('TOWER_STATE_CLEAR equ 2')
lines.append('TOWER_STATE_DEFEAT equ 3')
lines.append('TOWER_STATE_CHAMPION equ 4')
lines.append('')
lines.append('InitHellTower3D PROTO')
lines.append('TowerExitToHall PROTO')
lines.append('TowerReportRoundOutcome PROTO :DWORD')
lines.append('RenderTowerInGameBadge PROTO')
lines.append('')
lines.append('.data')
lines.append('towerStage dd 1')
lines.append('towerFloorState dd 0')
lines.append('towerAnimClock dd 0')
lines.append('towerCurrentGame dd 0')
lines.append('towerPrizeAmount dd 66600')
lines.append('towerHudText db 91,32,0')
lines.append('')
lines.append('towerFloorModes dd MODE_COIN, MODE_DICE, MODE_SKULLS, MODE_BLACKJACK, MODE_POKER, MODE_RUSSIAN, MODE_ROULETTE, MODE_DURAK, MODE_SKILL, MODE_BUCKSHOT')
lines.append('')
for i, b in enumerate(bosses):
lines.append(f'towerBoss{i+1} db {make_db(b)}')
lines.append('')
lines.append('towerBossNames dd ' + ', '.join(f'OFFSET towerBoss{i+1}' for i in range(10)))
lines.append('')
for i, g in enumerate(games):
lines.append(f'towerGame{i+1} db {make_db(g)}')
lines.append('')
lines.append('towerGameNames dd ' + ', '.join(f'OFFSET towerGame{i+1}' for i in range(10)))
lines.append('')
for i, d in enumerate(descs):
lines.append(f'towerDesc{i+1} db {make_db(d)}')
lines.append('')
lines.append('towerDescriptions dd ' + ', '.join(f'OFFSET towerDesc{i+1}' for i in range(10)))
lines.append('')
ui_texts = {
'towerHeader': 'КАЗИНО 3D - АДСКАЯ БАШНЯ',
'towerFloorPrefix': 'ЭТАЖ ',
'towerOfTen': ' / 10',
'towerEnemyLabel': 'ВРАГ: ',
'towerGameLabel': 'ИГРА: ',
'towerRuleText': '10 битв подряд без права на ошибку',
'towerLossWarning': 'Поражение - возврат в холл казино',
'towerStartBtn': '[ПРОБЕЛ] В БОЙ',
'towerEscBtn': '[ESC] СБЕЖАТЬ',
'towerClearTitle': 'ЭТАЖ ЗАЧИЩЕН! ВРАГ ПОВЕРЖЕН!',
'towerClearDesc': 'Враг повержен! Впереди новый этаж.',
'towerNextBtn': '[ПРОБЕЛ] ДАЛЬШЕ',
'towerDefeatTitle': 'ВЫ ПАЛИ В АДСКОЙ БАШНЕ...',
'towerDefeatDesc': 'Ваша душа навеки сгорела в Аду.',
'towerReturnBtn': '[ПРОБЕЛ / ESC] В ХОЛЛ КАЗИНО',
'towerChampTitle': 'ТРИУМФ! АДСКАЯ БАШНЯ ПОКОРЕНА!',
'towerChampSubtitle': 'ВЫ - ЧЕМПИОН АДСКОЙ БАШНИ!',
'towerPrizeText': 'СУПЕРПРИЗ: +$66,600 В БАНКРОЛЛ!',
'towerHudBadge': 'БАШНЯ: ',
'towerHudOfTen': '/10',
}
for k, v in ui_texts.items():
lines.append(f'{k} db {make_db(v)}')
with open('src_graphics/hell_tower_data.inc', 'wb') as f:
f.write(('\n'.join(lines) + '\n').encode('ascii'))
print('hell_tower_data.inc regenerated with compact strings.')