fix(engine): resolve DDA division overflow crash and Pause mnemonic collision

This commit is contained in:
Игорь Федосеев 2026-09-24 22:26:41 +03:00
parent fe4e38140d
commit 99fc93c700
6 changed files with 30379 additions and 30269 deletions

View file

@ -1,14 +1,56 @@
@echo off @echo off
set MASM_PATH=D:\MASM32\masm32 setlocal
rem Check standard MASM32 paths first
if exist "D:\MASM32\masm32\bin\ml.exe" (
set "ML_EXE=D:\MASM32\masm32\bin\ml.exe"
set "LINK_EXE=D:\MASM32\masm32\bin\link.exe"
set "LIB_PATHS=/LIBPATH:D:\MASM32\masm32\lib"
set "EXTRA_FLAGS=/SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0"
goto do_build
)
if exist "C:\masm32\bin\ml.exe" (
set "ML_EXE=C:\masm32\bin\ml.exe"
set "LINK_EXE=C:\masm32\bin\link.exe"
set "LIB_PATHS=/LIBPATH:C:\masm32\lib"
set "EXTRA_FLAGS=/SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0"
goto do_build
)
rem Fallback to Visual Studio / MSVC BuildTools
set "MSVC_BIN=C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\bin\Hostx64\x86"
set "SDK_LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\x86"
set "UCRT_LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\x86"
set "VC_LIB=C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\lib\x86"
if exist "%MSVC_BIN%\ml.exe" (
set "ML_EXE=%MSVC_BIN%\ml.exe"
set "LINK_EXE=%MSVC_BIN%\link.exe"
set LIB_PATHS=/LIBPATH:"%SDK_LIB%" /LIBPATH:"%UCRT_LIB%" /LIBPATH:"%VC_LIB%"
set "EXTRA_FLAGS=/NOLOGO /SUBSYSTEM:WINDOWS"
goto do_build
)
echo [ERROR] No compatible MASM/MSVC assembler found!
goto err
:do_build
echo Assembling poker.asm... echo Assembling poker.asm...
"%MASM_PATH%\bin\ml.exe" /c /coff /Cp /nologo /I. /I"%MASM_PATH%\include" poker.asm "%ML_EXE%" /c /coff /Cp /nologo /I. poker.asm
if errorlevel 1 goto err if errorlevel 1 goto err
echo Linking poker.obj... echo Linking poker.obj...
"%MASM_PATH%\bin\link.exe" /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:"%MASM_PATH%\lib" /OUT:poker.exe poker.obj kernel32.lib winmm.lib user32.lib ws2_32.lib gdi32.lib "%LINK_EXE%" %EXTRA_FLAGS% %LIB_PATHS% /OUT:poker.exe poker.obj kernel32.lib winmm.lib user32.lib ws2_32.lib gdi32.lib
if errorlevel 1 goto err if errorlevel 1 goto err
copy /y poker.exe build\graphics\poker.exe >nul 2>&1
echo [SUCCESS] poker.exe built successfully! echo [SUCCESS] poker.exe built successfully!
goto end goto end
:err :err
echo [ERROR] Build failed! echo [ERROR] Build failed!
pause pause
exit /b 1
:end :end
endlocal

View file

@ -146,10 +146,10 @@ sz3DWindowTitle db "Assembler Casino - 2.5D",0
szTexturesRelPath db "assets\textures\casino3d-hd.bin",0 szTexturesRelPath db "assets\textures\casino3d-hd.bin",0
szTexturesFullPath db 260 dup(0) szTexturesFullPath db 260 dup(0)
soundCoin db "assets\audio\Звон падающей монеты.wav",0 soundCoin db "assets\audio\Çâîí ïàäàþùåé ìîíåòû.wav",0
soundCards db "assets\audio\playing_cards_deck_flick_through_001_20485.wav",0 soundCards db "assets\audio\playing_cards_deck_flick_through_001_20485.wav",0
soundRoulette db "assets\audio\roulette-wheel-throw-2.wav",0 soundRoulette db "assets\audio\roulette-wheel-throw-2.wav",0
soundJackpot db "assets\audio\Джекпот.wav",0 soundJackpot db "assets\audio\Äæåêïîò.wav",0
soundClick db "assets\audio\b05e1ac8be34248.wav",0 soundClick db "assets\audio\b05e1ac8be34248.wav",0
playerX dd (16 * FP_1 + FP_HALF) playerX dd (16 * FP_1 + FP_HALF)
@ -179,12 +179,12 @@ promptBackroom db "BACKROOM - UNDER CONSTRUCTION",0
promptDurak db "DURAK - UNDER CONSTRUCTION",0 promptDurak db "DURAK - UNDER CONSTRUCTION",0
promptHell db "TOWER - UNDER CONSTRUCTION",0 promptHell db "TOWER - UNDER CONSTRUCTION",0
msgDancerTipped db "Вы бросили $100 танцовщице! УДАЧА АКТИВИРОВАНА!",0 msgDancerTipped db "Âû áðîñèëè $100 òàíöîâùèöå! ÓÄÀ×À ÀÊÒÈÂÈÐÎÂÀÍÀ!",0
msgNeedMoney db "Недостаточно денег в кошельке!",0 msgNeedMoney db "Íåäîñòàòî÷íî äåíåã â êîøåëüêå!",0
statusHUDFormat db "БАНКРОЛЛ: $",0 statusHUDFormat db "ÁÀÍÊÐÎËË: $",0
targetHUDFormat db " ЦЕЛЬ: $",0 targetHUDFormat db " ÖÅËÜ: $",0
luckHUDFormat db " УДАЧА: +",0 luckHUDFormat db " ÓÄÀ×À: +",0
controlsHUD db "WASD/Стрелки: Ходьба | E: Действие | ESC: Меню",0 controlsHUD db "WASD/Ñòðåëêè: Õîäüáà | E: Äåéñòâèå | ESC: Ìåíþ",0
NUM_SPRITES equ 13 NUM_SPRITES equ 13
ALIGN 4 ALIGN 4
@ -227,12 +227,12 @@ roulOutcomeMsg db 64 dup(0)
shopMsg db 128 dup(0) shopMsg db 128 dup(0)
atmMsg db 128 dup(0) atmMsg db 128 dup(0)
strWin db "ПОБЕДА! +$",0 strWin db "ÏÎÁÅÄÀ! +$",0
strLose db "ПРОИГРЫШ",0 strLose db "ÏÐÎÈÃÐÛØ",0
strJackpot db "ДЖЕКПОТ! +$",0 strJackpot db "ÄÆÅÊÏÎÒ! +$",0
strPush db "НИЧЬЯ (PUSH)",0 strPush db "ÍÈ×Üß (PUSH)",0
strDealerBust db "ДИЛЕР ПЕРЕБРАЛ! ПОБЕДА! +$",0 strDealerBust db "ÄÈËÅÐ ÏÅÐÅÁÐÀË! ÏÎÁÅÄÀ! +$",0
strPlayerBust db "ПЕРЕБОР (>21)! ПРОИГРЫШ",0 strPlayerBust db "ÏÅÐÅÁÎÐ (>21)! ÏÐÎÈÃÐÛØ",0
sym7 db " 777 ",0 sym7 db " 777 ",0
symBar db " BAR ",0 symBar db " BAR ",0
@ -763,11 +763,15 @@ calc_delta_x:
neg eax neg eax
@@: @@:
mov ebx, eax mov ebx, eax
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply. cmp ebx, 4
jbe delta_x_clamp
xor eax, eax xor eax, eax
mov edx, 1 mov edx, 1
idiv ebx div ebx
mov deltaDistX, eax mov deltaDistX, eax
jmp calc_delta_y
delta_x_clamp:
mov deltaDistX, 7FFFFFFFh
calc_delta_y: calc_delta_y:
mov eax, rayDirY mov eax, rayDirY
@ -781,11 +785,15 @@ calc_delta_y_ok:
neg eax neg eax
@@: @@:
mov ebx, eax mov ebx, eax
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply. cmp ebx, 4
jbe delta_y_clamp
xor eax, eax xor eax, eax
mov edx, 1 mov edx, 1
idiv ebx div ebx
mov deltaDistY, eax mov deltaDistY, eax
jmp check_step
delta_y_clamp:
mov deltaDistY, 7FFFFFFFh
check_step: check_step:
cmp rayDirX, 0 cmp rayDirX, 0
@ -988,6 +996,13 @@ select_tex:
mov drawEnd, SCREEN_H - 1 mov drawEnd, SCREEN_H - 1
@@: @@:
mov eax, lineH
cmp eax, 1
jge @F
mov eax, 1
mov lineH, eax
@@:
mov eax, 128 * FP_1 mov eax, 128 * FP_1
cdq cdq
idiv lineH idiv lineH
@ -1151,13 +1166,22 @@ draw_spr_loop:
; Sample animation by elapsed time. Pausing freezes the clock. ; Sample animation by elapsed time. Pausing freezes the clock.
push eax push eax
mov ecx, [casinoSprites + eax].animSpeed mov ecx, [casinoSprites + eax].animSpeed
cmp ecx, 0
jg @F
mov ecx, 1
@@:
imul ecx, 40 imul ecx, 40
mov eax, animationClock3D mov eax, animationClock3D
xor edx, edx xor edx, edx
div ecx div ecx
pop ebx pop ebx
mov ecx, [casinoSprites + ebx].frameCount
cmp ecx, 0
jg @F
mov ecx, 1
@@:
xor edx, edx xor edx, edx
div [casinoSprites + ebx].frameCount div ecx
mov [casinoSprites + ebx].curFrame, edx mov [casinoSprites + ebx].curFrame, edx
mov eax, ebx mov eax, ebx
@ -1181,8 +1205,14 @@ draw_spr_loop:
imul playerPlaneY imul playerPlaneY
shrd eax, edx, 16 shrd eax, edx, 16
sub ebx, eax sub ebx, eax
test ebx, ebx
jz next_spr mov eax, ebx
test eax, eax
jns @F
neg eax
@@:
cmp eax, 4
jbe next_spr
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply. ; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
xor eax, eax xor eax, eax
@ -1238,6 +1268,10 @@ draw_spr_loop:
test eax, eax test eax, eax
jns @F jns @F
neg eax neg eax
@@:
cmp eax, 1
jge @F
jmp next_spr
@@: @@:
cmp eax, SCREEN_H * 2 cmp eax, SCREEN_H * 2
jle @F jle @F

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -763,11 +763,15 @@ calc_delta_x:
neg eax neg eax
@@: @@:
mov ebx, eax mov ebx, eax
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply. cmp ebx, 4
jbe delta_x_clamp
xor eax, eax xor eax, eax
mov edx, 1 mov edx, 1
idiv ebx div ebx
mov deltaDistX, eax mov deltaDistX, eax
jmp calc_delta_y
delta_x_clamp:
mov deltaDistX, 7FFFFFFFh
calc_delta_y: calc_delta_y:
mov eax, rayDirY mov eax, rayDirY
@ -781,11 +785,15 @@ calc_delta_y_ok:
neg eax neg eax
@@: @@:
mov ebx, eax mov ebx, eax
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply. cmp ebx, 4
jbe delta_y_clamp
xor eax, eax xor eax, eax
mov edx, 1 mov edx, 1
idiv ebx div ebx
mov deltaDistY, eax mov deltaDistY, eax
jmp check_step
delta_y_clamp:
mov deltaDistY, 7FFFFFFFh
check_step: check_step:
cmp rayDirX, 0 cmp rayDirX, 0
@ -988,6 +996,13 @@ select_tex:
mov drawEnd, SCREEN_H - 1 mov drawEnd, SCREEN_H - 1
@@: @@:
mov eax, lineH
cmp eax, 1
jge @F
mov eax, 1
mov lineH, eax
@@:
mov eax, 128 * FP_1 mov eax, 128 * FP_1
cdq cdq
idiv lineH idiv lineH
@ -1151,13 +1166,22 @@ draw_spr_loop:
; Sample animation by elapsed time. Pausing freezes the clock. ; Sample animation by elapsed time. Pausing freezes the clock.
push eax push eax
mov ecx, [casinoSprites + eax].animSpeed mov ecx, [casinoSprites + eax].animSpeed
cmp ecx, 0
jg @F
mov ecx, 1
@@:
imul ecx, 40 imul ecx, 40
mov eax, animationClock3D mov eax, animationClock3D
xor edx, edx xor edx, edx
div ecx div ecx
pop ebx pop ebx
mov ecx, [casinoSprites + ebx].frameCount
cmp ecx, 0
jg @F
mov ecx, 1
@@:
xor edx, edx xor edx, edx
div [casinoSprites + ebx].frameCount div ecx
mov [casinoSprites + ebx].curFrame, edx mov [casinoSprites + ebx].curFrame, edx
mov eax, ebx mov eax, ebx
@ -1181,8 +1205,14 @@ draw_spr_loop:
imul playerPlaneY imul playerPlaneY
shrd eax, edx, 16 shrd eax, edx, 16
sub ebx, eax sub ebx, eax
test ebx, ebx
jz next_spr mov eax, ebx
test eax, eax
jns @F
neg eax
@@:
cmp eax, 4
jbe next_spr
; 2^32 needs the full EDX:EAX dividend, not a truncated multiply. ; 2^32 needs the full EDX:EAX dividend, not a truncated multiply.
xor eax, eax xor eax, eax
@ -1238,6 +1268,10 @@ draw_spr_loop:
test eax, eax test eax, eax
jns @F jns @F
neg eax neg eax
@@:
cmp eax, 1
jge @F
jmp next_spr
@@: @@:
cmp eax, SCREEN_H * 2 cmp eax, SCREEN_H * 2
jle @F jle @F

168
poker.asm
View file

@ -4454,11 +4454,11 @@ read_bet_empty:
ReadBetInput ENDP ReadBetInput ENDP
; --- Pause: ââîä ïîëüçîâàòåëÿ è ðàçáîð ââåäåííûõ äàííûõ --- ; --- Pause: ââîä ïîëüçîâàòåëÿ è ðàçáîð ââåäåííûõ äàííûõ ---
Pause PROC PauseConsole PROC
invoke PrintStr, OFFSET pauseText invoke PrintStr, OFFSET pauseText
call ReadAnyKey call ReadAnyKey
ret ret
Pause ENDP PauseConsole ENDP
; --- PrintBank: âûâîä òåêñòà, öâåòîâ, êàðòèíîê è ýëåìåíòîâ èíòåðôåéñà --- ; --- PrintBank: âûâîä òåêñòà, öâåòîâ, êàðòèíîê è ýëåìåíòîâ èíòåðôåéñà ---
PrintBank PROC PrintBank PROC
@ -4808,7 +4808,7 @@ select_account_again:
cmp accountCount, 0 cmp accountCount, 0
jne accounts_available jne accounts_available
invoke PrintStr, OFFSET accountNoFilesText invoke PrintStr, OFFSET accountNoFilesText
call Pause call PauseConsole
xor eax, eax xor eax, eax
ret ret
accounts_available: accounts_available:
@ -4825,7 +4825,7 @@ accounts_available:
ret ret
select_account_bad: select_account_bad:
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp select_account_again jmp select_account_again
SelectExistingAccount ENDP SelectExistingAccount ENDP
@ -4842,7 +4842,7 @@ account_menu_loop:
cmp al, '2' cmp al, '2'
je account_create je account_create
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp account_menu_loop jmp account_menu_loop
account_login: account_login:
@ -5754,7 +5754,7 @@ GameDailyTasks PROC
invoke PrintDailySlot, 0, 1 invoke PrintDailySlot, 0, 1
invoke PrintDailySlot, 1, 2 invoke PrintDailySlot, 1, 2
invoke PrintDailySlot, 2, 4 invoke PrintDailySlot, 2, 4
call Pause call PauseConsole
ret ret
GameDailyTasks ENDP GameDailyTasks ENDP
@ -5961,7 +5961,7 @@ CheckSecretEnding PROC uses eax
invoke PrintStr, OFFSET secretEndingArt2 invoke PrintStr, OFFSET secretEndingArt2
call ResetColor call ResetColor
invoke PrintStr, OFFSET secretEndingBody invoke PrintStr, OFFSET secretEndingBody
call Pause call PauseConsole
secret_ending_done: secret_ending_done:
ret ret
CheckSecretEnding ENDP CheckSecretEnding ENDP
@ -6036,7 +6036,7 @@ settings_show_menu:
cmp eax, 5 cmp eax, 5
je settings_toggle_dbd je settings_toggle_dbd
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp settings_loop jmp settings_loop
settings_quieter: settings_quieter:
cmp settingsVolume, 0 cmp settingsVolume, 0
@ -6305,7 +6305,7 @@ welcome_check_tampered:
welcome_bank_normal: welcome_bank_normal:
call PrintBank call PrintBank
call ShowStats call ShowStats
call Pause call PauseConsole
ret ret
ShowWelcome ENDP ShowWelcome ENDP
@ -7722,7 +7722,7 @@ CheatPeek21 PROC uses eax ebx
invoke PrintCard, ebx invoke PrintCard, ebx
invoke AddSuspicion, 12 invoke AddSuspicion, 12
call CheckCasinoHeat call CheckCasinoHeat
call Pause call PauseConsole
ret ret
CheatPeek21 ENDP CheatPeek21 ENDP
@ -7738,11 +7738,11 @@ CheatSwap21 PROC uses eax ebx
invoke PrintStr, OFFSET cheatSwapText invoke PrintStr, OFFSET cheatSwapText
invoke AddSuspicion, 18 invoke AddSuspicion, 18
call CheckCasinoHeat call CheckCasinoHeat
call Pause call PauseConsole
ret ret
cheat_swap21_none: cheat_swap21_none:
invoke PrintStr, OFFSET cheatNoTargetText invoke PrintStr, OFFSET cheatNoTargetText
call Pause call PauseConsole
ret ret
CheatSwap21 ENDP CheatSwap21 ENDP
@ -7763,7 +7763,7 @@ cheat_peek_poker_table:
cheat_peek_poker_done: cheat_peek_poker_done:
invoke AddSuspicion, 12 invoke AddSuspicion, 12
call CheckCasinoHeat call CheckCasinoHeat
call Pause call PauseConsole
ret ret
CheatPeekPoker ENDP CheatPeekPoker ENDP
@ -7776,11 +7776,11 @@ CheatSwapPoker PROC uses eax
invoke PrintStr, OFFSET cheatSwapText invoke PrintStr, OFFSET cheatSwapText
invoke AddSuspicion, 18 invoke AddSuspicion, 18
call CheckCasinoHeat call CheckCasinoHeat
call Pause call PauseConsole
ret ret
cheat_swap_poker_none: cheat_swap_poker_none:
invoke PrintStr, OFFSET cheatNoTargetText invoke PrintStr, OFFSET cheatNoTargetText
call Pause call PauseConsole
ret ret
CheatSwapPoker ENDP CheatSwapPoker ENDP
@ -9247,7 +9247,7 @@ skulls_guess_again:
cmp al, '3' cmp al, '3'
je skull_guess_3 je skull_guess_3
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp skulls_guess_again jmp skulls_guess_again
skull_guess_1: skull_guess_1:
@ -9831,7 +9831,7 @@ bs_player_again:
cmp al, '6' cmp al, '6'
je bs_player_cuffs je bs_player_cuffs
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp bs_player_again jmp bs_player_again
bs_player_self: bs_player_self:
mov bsTarget, 0 mov bsTarget, 0
@ -10013,7 +10013,7 @@ dice_choose:
cmp al, '2' cmp al, '2'
je dice_pick_odd je dice_pick_odd
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp dice_choose jmp dice_choose
dice_pick_even: dice_pick_even:
@ -10282,7 +10282,7 @@ OnlineHostConnect PROC
online_host_connect_error: online_host_connect_error:
call PrintOnlineError call PrintOnlineError
call OnlineCleanup call OnlineCleanup
call Pause call PauseConsole
xor eax, eax xor eax, eax
ret ret
OnlineHostConnect ENDP OnlineHostConnect ENDP
@ -10318,13 +10318,13 @@ online_join_connect_bad_ip:
invoke PrintStr, OFFSET onlineBadIpText invoke PrintStr, OFFSET onlineBadIpText
call ResetColor call ResetColor
call OnlineCleanup call OnlineCleanup
call Pause call PauseConsole
xor eax, eax xor eax, eax
ret ret
online_join_connect_error: online_join_connect_error:
call PrintOnlineError call PrintOnlineError
call OnlineCleanup call OnlineCleanup
call Pause call PauseConsole
xor eax, eax xor eax, eax
ret ret
OnlineJoinConnect ENDP OnlineJoinConnect ENDP
@ -10612,19 +10612,19 @@ online_casino_session_done:
test eax, eax test eax, eax
jz online_casino_session_error jz online_casino_session_error
call OnlineCleanup call OnlineCleanup
call Pause call PauseConsole
ret ret
online_casino_protocol_error: online_casino_protocol_error:
invoke SetColor, COLOR_BAD invoke SetColor, COLOR_BAD
invoke PrintStr, OFFSET OnlineProtocolText invoke PrintStr, OFFSET OnlineProtocolText
call ResetColor call ResetColor
call OnlineCleanup call OnlineCleanup
call Pause call PauseConsole
ret ret
online_casino_session_error: online_casino_session_error:
call PrintOnlineError call PrintOnlineError
call OnlineCleanup call OnlineCleanup
call Pause call PauseConsole
online_casino_done: online_casino_done:
ret ret
GameOnlineCasino ENDP GameOnlineCasino ENDP
@ -10696,7 +10696,7 @@ coin_choose:
cmp al, '2' cmp al, '2'
je coin_pick_tails je coin_pick_tails
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp coin_choose jmp coin_choose
coin_pick_heads: coin_pick_heads:
@ -11145,7 +11145,7 @@ casino_roulette_choose:
cmp eax, 13 cmp eax, 13
je casino_roulette_choose_col3 je casino_roulette_choose_col3
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp casino_roulette_choose jmp casino_roulette_choose
casino_roulette_choose_number: casino_roulette_choose_number:
@ -11158,7 +11158,7 @@ casino_roulette_choose_number:
jmp casino_roulette_spin jmp casino_roulette_spin
casino_roulette_bad_number: casino_roulette_bad_number:
invoke PrintStr, OFFSET casinoRouletteBadNumber invoke PrintStr, OFFSET casinoRouletteBadNumber
call Pause call PauseConsole
jmp casino_roulette_choose jmp casino_roulette_choose
casino_roulette_choose_red: casino_roulette_choose_red:
@ -12300,7 +12300,7 @@ player_throw_loop:
invoke PrintStr, OFFSET durakAITakeText invoke PrintStr, OFFSET durakAITakeText
mov durakPlayerTurn, 1 mov durakPlayerTurn, 1
call RefillDurakHands call RefillDurakHands
call Pause call PauseConsole
ret ret
player_throw_after_defense: player_throw_after_defense:
call ShowDurakTable call ShowDurakTable
@ -12371,7 +12371,7 @@ player_defend_loop:
invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, durakChoice invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, durakChoice
call AddDurakAttack call AddDurakAttack
invoke PrintStr, OFFSET durakTransferText invoke PrintStr, OFFSET durakTransferText
call Pause call PauseConsole
call PlayerThrowLoop call PlayerThrowLoop
ret ret
@ -12396,7 +12396,7 @@ player_take_table:
invoke PrintStr, OFFSET durakPlayerTakeText invoke PrintStr, OFFSET durakPlayerTakeText
mov durakPlayerTurn, 0 mov durakPlayerTurn, 0
call RefillDurakHandsAIFirst call RefillDurakHandsAIFirst
call Pause call PauseConsole
ret ret
player_defended_all: player_defended_all:
call FindAIThrowIn call FindAIThrowIn
@ -12410,7 +12410,7 @@ player_defense_done:
call ClearDurakTable call ClearDurakTable
mov durakPlayerTurn, 1 mov durakPlayerTurn, 1
call RefillDurakHandsAIFirst call RefillDurakHandsAIFirst
call Pause call PauseConsole
ret ret
PlayerDefendLoop ENDP PlayerDefendLoop ENDP
@ -12720,7 +12720,7 @@ observer21_ai1_win:
observer21_ai2_win: observer21_ai2_win:
invoke PrintStr, OFFSET observerWin2Text invoke PrintStr, OFFSET observerWin2Text
observer21_done: observer21_done:
call Pause call PauseConsole
ret ret
GameObserver21 ENDP GameObserver21 ENDP
@ -12851,7 +12851,7 @@ observer_poker_ai1_wins:
observer_poker_ai2_wins: observer_poker_ai2_wins:
invoke PrintStr, OFFSET observerWin2Text invoke PrintStr, OFFSET observerWin2Text
observer_poker_done: observer_poker_done:
call Pause call PauseConsole
ret ret
GameObserverPoker ENDP GameObserverPoker ENDP
@ -13036,7 +13036,7 @@ observer_durak_draw:
call ShowDurakObserverTable call ShowDurakObserverTable
invoke PrintStr, OFFSET observerDrawText invoke PrintStr, OFFSET observerDrawText
observer_durak_done: observer_durak_done:
call Pause call PauseConsole
ret ret
GameObserverDurak ENDP GameObserverDurak ENDP
@ -13082,7 +13082,7 @@ observer_rr_ai2_dead:
call PrintBang call PrintBang
invoke PrintStr, OFFSET observerShotAI2Text invoke PrintStr, OFFSET observerShotAI2Text
observer_rr_done: observer_rr_done:
call Pause call PauseConsole
ret ret
GameObserverRoulette ENDP GameObserverRoulette ENDP
@ -13104,7 +13104,7 @@ observer_menu_loop:
cmp eax, 4 cmp eax, 4
je observer_run_durak je observer_run_durak
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp observer_menu_loop jmp observer_menu_loop
observer_run_rr: observer_run_rr:
invoke UnlockAchievement, 10000h, OFFSET achObserverName invoke UnlockAchievement, 10000h, OFFSET achObserverName
@ -13609,7 +13609,7 @@ bestiary_loop:
cmp eax, 24 cmp eax, 24
je bestiary_devil je bestiary_devil
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp bestiary_loop jmp bestiary_loop
bestiary_clover: bestiary_clover:
invoke ShowBestiaryPage, OFFSET bestiaryCloverArt, OFFSET bestiaryCloverInfo, COLOR_MONEY invoke ShowBestiaryPage, OFFSET bestiaryCloverArt, OFFSET bestiaryCloverInfo, COLOR_MONEY
@ -13704,7 +13704,7 @@ shop_loop:
cmp eax, 3 cmp eax, 3
je shop_bestiary_menu je shop_bestiary_menu
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp shop_loop jmp shop_loop
shop_bestiary_menu: shop_bestiary_menu:
@ -13744,7 +13744,7 @@ shop_backs_menu:
cmp eax, 12 cmp eax, 12
je shop_web je shop_web
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_charms_menu: shop_charms_menu:
@ -13804,153 +13804,153 @@ shop_charms_menu:
cmp eax, 24 cmp eax, 24
je buy_charm_devil je buy_charm_devil
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
shop_blue: shop_blue:
invoke ShopBuyBack, 1, 3000, 2 invoke ShopBuyBack, 1, 3000, 2
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_red: shop_red:
invoke ShopBuyBack, 2, 3000, 4 invoke ShopBuyBack, 2, 3000, 4
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_gold: shop_gold:
invoke ShopBuyBack, 3, 10000, 8 invoke ShopBuyBack, 3, 10000, 8
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_skull: shop_skull:
invoke ShopBuyBack, 4, 12000, 10h invoke ShopBuyBack, 4, 12000, 10h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_clover_back: shop_clover_back:
invoke ShopBuyBack, 5, 15000, 20h invoke ShopBuyBack, 5, 15000, 20h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_arcane: shop_arcane:
invoke ShopBuyBack, 6, 17000, 40h invoke ShopBuyBack, 6, 17000, 40h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_noir: shop_noir:
invoke ShopBuyBack, 7, 18000, 80h invoke ShopBuyBack, 7, 18000, 80h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_diamond_back: shop_diamond_back:
invoke ShopBuyBack, 8, 20000, 100h invoke ShopBuyBack, 8, 20000, 100h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_rider: shop_rider:
invoke ShopBuyBack, 9, 22000, 200h invoke ShopBuyBack, 9, 22000, 200h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_bee: shop_bee:
invoke ShopBuyBack, 10, 22000, 400h invoke ShopBuyBack, 10, 22000, 400h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_fan: shop_fan:
invoke ShopBuyBack, 11, 23000, 800h invoke ShopBuyBack, 11, 23000, 800h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
shop_web: shop_web:
invoke ShopBuyBack, 12, 24000, 1000h invoke ShopBuyBack, 12, 24000, 1000h
call Pause call PauseConsole
jmp shop_backs_menu jmp shop_backs_menu
buy_charm_clover: buy_charm_clover:
invoke ShopBuyCharm, 1, 12000 invoke ShopBuyCharm, 1, 12000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_bell: buy_charm_bell:
invoke ShopBuyCharm, 2, 18000 invoke ShopBuyCharm, 2, 18000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_diamond: buy_charm_diamond:
invoke ShopBuyCharm, 3, 25000 invoke ShopBuyCharm, 3, 25000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_skull: buy_charm_skull:
invoke ShopBuyCharm, 4, 32000 invoke ShopBuyCharm, 4, 32000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_web: buy_charm_web:
invoke ShopBuyCharm, 5, 40000 invoke ShopBuyCharm, 5, 40000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_bee_item: buy_charm_bee_item:
invoke ShopBuyCharm, 6, 30000 invoke ShopBuyCharm, 6, 30000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_moon: buy_charm_moon:
invoke ShopBuyCharm, 7, 36000 invoke ShopBuyCharm, 7, 36000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_crown: buy_charm_crown:
invoke ShopBuyCharm, 8, 52000 invoke ShopBuyCharm, 8, 52000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_mirror: buy_charm_mirror:
invoke ShopBuyCharm, 9, 42000 invoke ShopBuyCharm, 9, 42000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_dice: buy_charm_dice:
invoke ShopBuyCharm, 10, 35000 invoke ShopBuyCharm, 10, 35000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_blood: buy_charm_blood:
invoke ShopBuyCharm, 11, 65000 invoke ShopBuyCharm, 11, 65000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_hourglass: buy_charm_hourglass:
invoke ShopBuyCharm, 12, 48000 invoke ShopBuyCharm, 12, 48000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_horseshoe: buy_charm_horseshoe:
invoke ShopBuyCharm, 13, 39000 invoke ShopBuyCharm, 13, 39000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_joker: buy_charm_joker:
invoke ShopBuyCharm, 14, 70000 invoke ShopBuyCharm, 14, 70000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_phoenix: buy_charm_phoenix:
invoke ShopBuyCharm, 15, 56000 invoke ShopBuyCharm, 15, 56000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_compass: buy_charm_compass:
invoke ShopBuyCharm, 16, 44000 invoke ShopBuyCharm, 16, 44000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_tooth: buy_charm_tooth:
invoke ShopBuyCharm, 17, 47000 invoke ShopBuyCharm, 17, 47000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_eye: buy_charm_eye:
invoke ShopBuyCharm, 18, 60000 invoke ShopBuyCharm, 18, 60000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_key: buy_charm_key:
invoke ShopBuyCharm, 19, 41000 invoke ShopBuyCharm, 19, 41000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_candle: buy_charm_candle:
invoke ShopBuyCharm, 20, 76000 invoke ShopBuyCharm, 20, 76000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_chip: buy_charm_chip:
invoke ShopBuyCharm, 21, 50000 invoke ShopBuyCharm, 21, 50000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_snake: buy_charm_snake:
invoke ShopBuyCharm, 22, 62000 invoke ShopBuyCharm, 22, 62000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_ace: buy_charm_ace:
invoke ShopBuyCharm, 23, 53000 invoke ShopBuyCharm, 23, 53000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
buy_charm_devil: buy_charm_devil:
invoke ShopBuyCharm, 24, 100000 invoke ShopBuyCharm, 24, 100000
call Pause call PauseConsole
jmp shop_charms_menu jmp shop_charms_menu
shop_exit: shop_exit:
ret ret
@ -14203,7 +14203,7 @@ stats_by_game_loop:
jmp stats_by_game_loop jmp stats_by_game_loop
stats_by_game_done: stats_by_game_done:
call PrintLeaderboards call PrintLeaderboards
call Pause call PauseConsole
ret ret
GameStatsByGame ENDP GameStatsByGame ENDP
@ -14579,7 +14579,7 @@ GameAchievements PROC
invoke PrintAchievementLine, 8000h, OFFSET achCharmBuyerName invoke PrintAchievementLine, 8000h, OFFSET achCharmBuyerName
invoke PrintAchievementLine, 10000h, OFFSET achObserverName invoke PrintAchievementLine, 10000h, OFFSET achObserverName
invoke PrintAchievementLine, 20000h, OFFSET achSkillCheckName invoke PrintAchievementLine, 20000h, OFFSET achSkillCheckName
call Pause call PauseConsole
ret ret
GameAchievements ENDP GameAchievements ENDP
; --- GameTraining: ñëóæåáíûé áëîê èãðîâîé ëîãèêè --- ; --- GameTraining: ñëóæåáíûé áëîê èãðîâîé ëîãèêè ---
@ -14587,7 +14587,7 @@ GameTraining PROC
call ClearView call ClearView
invoke PrintTitleColor, OFFSET trainingTitle invoke PrintTitleColor, OFFSET trainingTitle
invoke PrintStr, OFFSET trainingText invoke PrintStr, OFFSET trainingText
call Pause call PauseConsole
ret ret
GameTraining ENDP GameTraining ENDP
; --- ShowTournamentStage: òóðíèð-áàøíÿ è ïîáåäíàÿ àíèìàöèÿ ôèíàëà --- ; --- ShowTournamentStage: òóðíèð-áàøíÿ è ïîáåäíàÿ àíèìàöèÿ ôèíàëà ---
@ -14665,7 +14665,7 @@ GameTournament PROC
invoke PrintStr, OFFSET secretHellText invoke PrintStr, OFFSET secretHellText
call ResetColor call ResetColor
invoke PrintStr, OFFSET tournamentIntro invoke PrintStr, OFFSET tournamentIntro
call Pause call PauseConsole
call PlayTowerRandomMusic ; tower start call PlayTowerRandomMusic ; tower start
mov tournamentStage, 1 mov tournamentStage, 1
@ -14757,7 +14757,7 @@ GameTournament PROC
call PayWin call PayWin
call SaveGame call SaveGame
mov tournamentMode, 0 mov tournamentMode, 0
call Pause call PauseConsole
ret ret
tournament_failed: tournament_failed:
@ -14766,7 +14766,7 @@ tournament_failed:
invoke PrintStr, OFFSET tournamentFailText invoke PrintStr, OFFSET tournamentFailText
call ResetColor call ResetColor
mov tournamentMode, 0 mov tournamentMode, 0
call Pause call PauseConsole
ret ret
GameTournament ENDP GameTournament ENDP
@ -14920,7 +14920,7 @@ uma_race_lost:
call PrintLoseEvent call PrintLoseEvent
uma_race_done: uma_race_done:
call Pause call PauseConsole
uma_exit: uma_exit:
ret ret
GameUmamusume ENDP GameUmamusume ENDP
@ -15011,7 +15011,7 @@ menu_loop:
cmp eax, 0 cmp eax, 0
je exit_menu je exit_menu
invoke PrintStr, OFFSET badChoiceText invoke PrintStr, OFFSET badChoiceText
call Pause call PauseConsole
jmp menu_loop jmp menu_loop
run_21: run_21:
mov currentGameId, 1 mov currentGameId, 1