.386 .model flat, stdcall option casemap:none includelib kernel32.lib includelib winmm.lib includelib user32.lib includelib ws2_32.lib includelib gdi32.lib STD_INPUT_HANDLE equ -10 STD_OUTPUT_HANDLE equ -11 VK_RETURN equ 0Dh VK_SPACE equ 20h VK_M equ 4Dh FLIP_DELAY equ 650 FLIP_FINAL_DELAY equ 850 GENERIC_READ equ 80000000h GENERIC_WRITE equ 40000000h OPEN_EXISTING equ 3 CREATE_ALWAYS equ 2 FILE_ATTRIBUTE_NORMAL equ 80h INVALID_HANDLE_VALUE equ -1 SAVE_MAGIC equ 31435653h SAVE_SIGN_SIZE equ 276 SAVE_FILE_SIZE equ 280 SAVE_SALT equ 0A57C0DEh ENABLE_VIRTUAL_TERMINAL_PROCESSING equ 0004h COLOR_DEFAULT equ 07h COLOR_TITLE equ 0Bh COLOR_MONEY equ 0Ah COLOR_WARN equ 0Eh COLOR_BAD equ 0Ch COLOR_CARD equ 0Fh COLOR_RED_CARD equ 0Ch COLOR_BACK_CARD equ 08h COLOR_TABLE equ 02h COLOR_WOOD equ 06h AF_INET equ 2 SOCK_STREAM equ 1 IPPROTO_TCP equ 6 INADDR_ANY equ 0 SOCKET_ERROR equ -1 ONLINE_PORT_NET equ 8769h ONLINE_MAGIC equ 4E4C4E31h ONLINE_GAME_DICE equ 1 ONLINE_GAME_RR equ 2 ExitProcess PROTO :DWORD GetStdHandle PROTO :DWORD WriteFile PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD WriteConsoleA PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD WriteConsoleW PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD ReadFile PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD SetConsoleOutputCP PROTO :DWORD SetConsoleCP PROTO :DWORD MultiByteToWideChar PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD WideCharToMultiByte PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD GetTickCount PROTO GetLocalTime PROTO :DWORD GetAsyncKeyState PROTO :DWORD GetEnvironmentVariableA PROTO :DWORD, :DWORD, :DWORD CreateDirectoryA PROTO :DWORD, :DWORD Sleep PROTO :DWORD WinExec PROTO :DWORD, :DWORD SetConsoleCursorPosition PROTO :DWORD, :DWORD SetConsoleScreenBufferSize PROTO :DWORD, :DWORD SetConsoleWindowInfo PROTO :DWORD, :DWORD, :DWORD SetConsoleTextAttribute PROTO :DWORD, :DWORD GetConsoleScreenBufferInfo PROTO :DWORD, :DWORD GetConsoleMode PROTO :DWORD, :DWORD SetConsoleMode PROTO :DWORD, :DWORD FillConsoleOutputCharacterA PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD AllocConsole PROTO FreeConsole PROTO GetConsoleWindow PROTO SetConsoleTitleA PROTO :DWORD GetWindowRect PROTO :DWORD, :DWORD SetWindowPos PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD SetFocus PROTO :DWORD mciSendStringA PROTO :DWORD, :DWORD, :DWORD, :DWORD waveOutSetVolume PROTO :DWORD, :DWORD AnimFrameDelay PROTO :DWORD CreateFileA PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD CloseHandle PROTO :DWORD FindFirstFileA PROTO :DWORD, :DWORD FindNextFileA PROTO :DWORD, :DWORD FindClose PROTO :DWORD WSAStartup PROTO :DWORD, :DWORD WSACleanup PROTO socket PROTO :DWORD, :DWORD, :DWORD bind PROTO :DWORD, :DWORD, :DWORD listen PROTO :DWORD, :DWORD accept PROTO :DWORD, :DWORD, :DWORD connect PROTO :DWORD, :DWORD, :DWORD send PROTO :DWORD, :DWORD, :DWORD, :DWORD recv PROTO :DWORD, :DWORD, :DWORD, :DWORD closesocket PROTO :DWORD inet_addr PROTO :DWORD WSAGetLastError PROTO MoveCursor PROTO :DWORD, :DWORD PrintSlotSymbol PROTO :DWORD RandomRange PROTO :DWORD PrintUInt PROTO :DWORD UnlockAchievement PROTO :DWORD, :DWORD ShowBestiaryPage PROTO :DWORD, :DWORD, :DWORD .data ; === Глобальные дескрипторы, буферы консоли, RNG и временная память === hOut dd 0 hIn dd 0 charsWritten dd 0 charsRead dd 0 consoleMode dd 0 printLen dd 0 wideLen dd 0 seed dd 0 inputBuffer db 32 dup(0) cheatBuffer db 32 dup(0) wideBuffer dw 4096 dup(0) utf8Buffer db 8192 dup(0) frameBuffer db 32768 dup(0) deckUsed db 52 dup(0) onlineWsaData db 400 dup(0) onlineAddr db 16 dup(0) onlineIp db 32 dup(0) onlineListenSock dd -1 onlinePeerSock dd -1 onlineWsaReady dd 0 onlinePacket dd 0, 0 onlineLocalRoll dd 0 onlineRemoteRoll dd 0 onlineGameMode dd 0 onlineHostIp dd 0 onlineAction dd 1 consoleRectTiny dw 0, 0, 119, 34 consoleRect160 dw 0, 0, 159, 44 consoleRect140 dw 0, 0, 139, 39 consoleRect120 dw 0, 0, 119, 34 ; === Общие счетчики очков и состояние старых карточных режимов === playerTotal dd 0 dealerTotal dd 0 playerAces dd 0 dealerAces dd 0 playerCards dd 0 ; === Состояние CloverPit / слот-машин: сетка, выплаты, комбинации === slotA dd 0 slotB dd 0 slotC dd 0 slotD dd 0 slotE dd 0 slotMatch dd 0 slotWinMask dd 0 slotCurrentCell dd 0 slotBestMultiplier dd 0 slotComboNamePtr dd 0 slotBlockMask dd 0 slotComboCount dd 0 slotJackpotHit dd 0 slotComboNames dd 32 dup(0) slotComboMults dd 32 dup(0) slotGrid dd 15 dup(0) slotVisible dd 0 ; === Общая карточная модель: руки игрока, AI и карты на столе === playerHand21 dd 10 dup(0) aiHand21 dd 10 dup(0) communityHand dd 5 dup(0) pokerPlayerEvalHand dd 7 dup(0) pokerAIEvalHand dd 7 dup(0) playerCnt21 dd 0 aiCnt21 dd 0 communityCnt dd 0 revealAI21 dd 0 dangerLvl21 dd 0 cardsLeft21 dd 0 rowIndex dd 0 pokerPlayerScore dd 0 pokerAIScore dd 0 pokerEvalCount dd 0 ; === Экономика аккаунта: банк, цель, ставка и чит-флаги === bankroll dd 10000 targetBank dd 50000 currentBet dd 0 cheatLuckyWin dd 0 cheatGodMode dd 0 cheatSlotJackpot dd 0 settingsVolume dd 10 settingsLowSpec dd 0 settingsIntroEnabled dd 1 settingsDbdWindowEnabled dd 0 animFrameCounter dd 0 animWidth dd 0 animHeight dd 0 secretEndingSeen dd 0 vipTaxAmount dd 0 ; === Крупье-комментатор: чтение фраз из dealer_phrases.txt === dealerFileHandle dd 0 dealerLineLen dd 0 dealerPhraseCount dd 0 dealerPhrasePick dd 0 dealerScanMode dd 0 dealerWantedTag db 0 ; === Магазин: купленные рубашки, выбранная рубашка и талисманы === shopBackOwned dd 1 shopBackStyle dd 0 shopCharmLevel dd 0 shopCharmUses dd 0 achievements dd 0 pokerRaiseAmount dd 0 pokerAIRaiseAmount dd 0 ; === Файлы, аккаунты, сохранения, достижения и таблицы лидеров === saveHandle dd 0 achievementHandle dd 0 findHandle dd 0 danceHandle dd 0 danceBytes dd 0 frameBytes dd 0 introLoopSeen dd 0 introSkipLoop dd 0 accountCount dd 0 selectedAccount dd 0 accountNameLen dd 0 saveBuffer dd 80 dup(0) gamesPlayed dd 0 gamesWon dd 0 gamesLost dd 0 gamesDrawn dd 0 bestWin dd 0 bestLoss dd 0 currentGameId dd 0 gameStatsPlayed dd 11 dup(0) gameStatsWon dd 11 dup(0) gameStatsLost dd 11 dup(0) gameStatsDraw dd 11 dup(0) leaderBestBank dd 0 leaderBestWins dd 0 leaderBestLosses dd 0 leaderValidCount dd 0 leaderScanIndex dd 0 leaderAccountPtr dd 0 leaderBestGameWins dd 11 dup(0) leaderBestGameLosses dd 11 dup(0) leaderBestBankName db 64 dup(0) leaderBestWinsName db 64 dup(0) leaderBestLossName db 64 dup(0) leaderBestGameWinNames db 11 dup(64 dup(0)) leaderBestGameLossNames db 11 dup(64 dup(0)) ; === Настройки сложности, временные переменные покера и мини-игр === aiDifficulty dd 2 bankRecovered dd 0 saveTampered dd 0 pokerReplaceIndex dd 0 pokerReplaced dd 0 pokerStraight dd 0 pokerFlush dd 0 pokerHigh dd 0 pokerFour dd 0 pokerTrip dd 0 pokerPairHigh dd 0 pokerPairLow dd 0 ; === Черепа и шарик: позиция шарика, выбор и число перемешиваний === skullBallPos dd 0 skullGuess dd 0 skullStep dd 0 skullMax dd 0 ; === Русская рулетка: барабан, патроны, ход и множитель === rrBulletMask dd 0 rrBullets dd 0 rrChamber dd 0 rrTurn dd 0 rrPayout dd 0 ; === Buckshot Roulette: патроны, здоровье, предметы и состояние хода === bsShells dd 8 dup(0) bsShellIndex dd 0 bsShellCount dd 0 bsLiveCount dd 0 bsBlankCount dd 0 bsPlayerHP dd 0 bsAIHP dd 0 bsTurn dd 0 bsDamage dd 1 bsKnownShell dd 0FFFFFFFFh bsSkipPlayer dd 0 bsSkipAI dd 0 bsPlayerGlass dd 0 bsPlayerSaw dd 0 bsPlayerBeer dd 0 bsPlayerCuffs dd 0 bsAIGlass dd 0 bsAISaw dd 0 bsAIBeer dd 0 bsAICuffs dd 0 bsTarget dd 0 bsShell dd 0 bsAction dd 0 ; === Мини-игры орел/решка, кости и казино-рулетка === coinPick dd 0 coinResult dd 0 diceA dd 0 diceB dd 0 diceSum dd 0 diceChoice dd 0 casinoRouletteBetType dd 0 casinoRouletteBetNumber dd 0 casinoRouletteResult dd 0 casinoRouletteResultIndex dd 0 casinoRouletteSpinIndex dd 0 casinoRouletteSpinSteps dd 0 casinoRouletteSpinCounter dd 0 casinoRouletteVisibleCount dd 0 ; === Дурак: руки, колода, козырь, стол атаки и защиты === durakPlayerHand dd 40 dup(0) durakAIHand dd 40 dup(0) durakPlayerCnt dd 0 durakAICnt dd 0 durakDeckLeft dd 0 durakTrumpCard dd 0 durakTrumpSuit dd 0 durakAttackCard dd 0FFFFFFFFh durakDefenseCard dd 0FFFFFFFFh durakPlayerTurn dd 1 durakChoice dd 0 durakTableCnt dd 0 durakAttackCards dd 6 dup(0) durakDefenseCards dd 6 dup(0FFFFFFFFh) durakTempHand dd 6 dup(0) durakSafeTurns dd 0 durakLoopGuard dd 0 ; === Skill Check, стресс, подозрение казино и турнир-башня === skillNeedle dd 0 skillDir dd 1 skillSuccessStart dd 0 skillSuccessEnd dd 0 skillPerfectPos dd 0 skillGaugeIndex dd 0 skillFrameCount dd 0 skillHits dd 0 skillMisses dd 0 skillResult dd 0 skillPerfects dd 0 skillDelay dd 45 casinoSuspicion dd 0 stressLevel dd 0 lastGameResult dd 0 tournamentStage dd 0 tournamentMode dd 0 dailyDateKey dd 0 dailyRewardMask dd 0 dailyProgressPacked dd 0 dailyTaskPacked dd 0 systemTime dw 8 dup(0) pulseCycles dd 0 ; === Временные счетчики рангов и мастей для оценки покера === rankCounts db 13 dup(0) suitCounts db 4 dup(0) ; === Текст интерфейса: меню, системные сообщения, банк и ставки === nl db 13,10,0 dotSpaceText db ". ",0 clearLines db 13,10,13,10,13,10,13,10,13,10,13,10,0 titleText db "==============================",13,10 db " ASSEMBLER CASINO",13,10 db "==============================",13,10,0 menuText db "1. Магазин",13,10 db "2. 21 / Очко",13,10 db "3. Poker",13,10 db "4. CloverPit",13,10 db "5. Черепа и шарик",13,10 db "6. Русская рулетка",13,10 db "7. Орел и решка",13,10 db "8. Кости",13,10 db "9. Казино-рулетка",13,10 db "10. Slot machine",13,10 db "11. Дурак",13,10 db "12. Крюк: Skill Check",13,10 db "13. Buckshot Roulette",13,10 db "14. Наблюдатель AI vs AI",13,10 db "15. Обучение",13,10 db "16. Достижения",13,10 db "17. Статистика по играм",13,10 db "18. Ежедневные задания",13,10 db "19. Настройки",13,10 db "20. Online Casino (Radmin)",13,10 db "21. Umamusume Скачки",13,10 db "25. 3D-КАЗИНО (DOOM / Wolf3D Raycaster 2.5D) [NEW]",13,10 db "0. Exit",13,10,0 choiceText db "Выбор: ",0 badChoiceText db "Нет такого пункта.",13,10,0 accountMenuText db "1. Войти в аккаунт",13,10 db "2. Создать аккаунт",13,10,0 accountPromptText db "Введите имя аккаунта латиницей: ",0 accountBadText db "Имя должно содержать хотя бы одну букву или цифру.",13,10,0 accountLoginText db "Аккаунт загружен: ",0 accountCreateText db "Аккаунт создан: ",0 accountListTitle db "Выберите аккаунт:",13,10,0 accountNoFilesText db "Сохраненных аккаунтов пока нет.",13,10,0 accountSelectText db "Номер аккаунта: ",0 pauseText db 13,10,"Нажмите любую клавишу...",0 bankText db "Ваш банк: $",0 betText db "Введите ставку: $",0 betChosenText db "Вы поставили $",0 badBetText db "Ставка должна быть числом больше 0.",13,10,0 tooBigBetText db "У вас нет столько денег.",13,10,0 suspicionText db "Подозрение казино: ",0 suspicionCalmText db "тихо",13,10,0 suspicionWatchText db "за тобой смотрят",13,10,0 suspicionHuntText db "охрана рядом",13,10,0 suspicionUpText db "Подозрение выросло.",13,10,0 suspicionFineText db "Охрана заметила мутную игру. Штраф: $",0 stressText db "Стресс ставки: ",0 stressLowText db "спокойно",13,10,0 stressMidText db "пульс растет",13,10,0 stressHighText db "руки дрожат",13,10,0 stressMaxText db "паника",13,10,0 cheatMoveText db "Шулерство: 3 - подсмотреть, 4 - подменить карту.",13,10,0 cheatPeekText db "Ты незаметно подсмотрел карту:",13,10,0 cheatSwapText db "Ты подменил карту под рукавом.",13,10,0 cheatNoTargetText db "Сейчас нечего подменять.",13,10,0 tournamentTitle db 13,10,"--- Секретный режим: Адская башня ---",13,10,0 tournamentIntro db "Адская башня казино: 10 этапов подряд. Проиграл - начинаешь заново.",13,10 db "Вход скрыт. Код 666 принят. Музыку можно менять клавишей M перед этапом.",13,10,0 tournamentStageText db 13,10,"Этап башни: ",0 tournamentMusicHint db "M - случайно сменить музыку башни, любая другая клавиша - начать этап",13,10,0 secretHellText db 13,10,"Секретный код принят. Казино опускает тебя в Адскую башню...",13,10,0 hellStageCurseText db "Проклятие этапа: ",0 hellCurse1 db "крупье больше не моргает.",13,10,0 hellCurse2 db "музыка играет, даже если ты проигрываешь.",13,10,0 hellCurse3 db "каждая ставка пахнет серой.",13,10,0 hellCurse4 db "охранник уже знает твое имя.",13,10,0 tournamentFailText db 13,10,"Адская башня закрыла двери. Турнир начинается заново.",13,10,0 tournamentWinText db 13,10,"ТЫ ВЫЖИЛ В АДСКОЙ БАШНЕ! Секретный бонус: $66600",13,10,0 tournamentFire1 db 13,10," . * .",13,10," ASSEMBLER CASINO",13,10," . | .",13,10," ___ /---\ ___",13,10," /___\ | T | /___\",13,10,0 tournamentFire2 db 13,10," * \ | / \ | / *",13,10," -- TOWER CLEARED --",13,10," * / | \ / | \ *",13,10," ___ /---\ ___",13,10," /___\ | 10| /___\",13,10,0 tournamentFire3 db 13,10," * . * . * . * . * . * . *",13,10," $$$ FIREWORKS $$$",13,10," . * . * . * . * . * . * .",13,10," \ \ | / /",13,10," \__\_|_/__/",13,10,0 tournamentFire4 db 13,10," ============ JACKPOT SKY ============",13,10," * * * * *",13,10," * CASINO CHAMPION *",13,10," * * * * *",13,10," =====================================",13,10,0 dailyTitle db 13,10,"--- Ежедневные задания ---",13,10,0 dailyIntro db "Каждый календарный день казино выбирает 3 задания из 40.",13,10,0 dailyDateText db "Дата задания: ",0 dailyPoolText db "Пул заданий: 40. Сегодня выбрано: 3",13,10,0 dailySlashText db " / ",0 dailyRewardText db " Награда: $",0 dailyClaimText db "Ежедневная награда получена: +$",0 dailyDoneText db " [получено]",13,10,0 dailyOpenText db " [в процессе]",13,10,0 settingsTitle db 13,10,"--- Настройки казино ---",13,10,0 settingsMenuText db "1. Тише",13,10 db "2. Громче",13,10 db "3. Профиль анимаций",13,10 db "4. Переключить интро",13,10 db "5. Переключить DBD-окно",13,10 db "0. Назад",13,10 db "Выбор: ",0 settingsVolumeText db "Громкость: ",0 settingsVolumeHint db "0 - без звука, 10 - максимум",13,10,0 settingsModeText db "Профиль анимаций: ",0 settingsNormalText db "обычный",13,10,0 settingsLowText db "слабый ПК",13,10,0 settingsIntroText db "Интро: ",0 settingsDbdText db "DBD-окно: ",0 settingsOnText db "вкл",13,10,0 settingsOffText db "выкл",13,10,0 settingsCinematicText db "Cinematic - максимум",13,10,0 settingsAdaptiveText db "Adaptive - мягче",13,10,0 settingsStableText db "Stable - меньше ряби",13,10,0 settingsAnimHintText db "Cinematic: все кадры; Adaptive: меньше ряби; Stable: для слабых ПК.",13,10,0 vipStatusText db "VIP-статус: ",0 vipBronzeText db "Bronze",13,10,0 vipSilverText db "Silver",13,10,0 vipGoldText db "Gold",13,10,0 vipDiamondText db "Diamond",13,10,0 vipTaxText db "Комиссия казино: $",0 secretEndingTitle db 13,10,"========================================",13,10," КАЗИНО ПРИЗНАЛО ТЕБЯ СВОИМ",13,10,"========================================",13,10,0 secretEndingBody db "Ты собрал все достижения, скупил рубашки и вынес банк так, что крупье больше не спорит.",13,10,"Двери служебного лифта открываются. На табличке одна фраза: HOUSE PLAYER.",13,10,"Секретная концовка открыта.",13,10,0 secretEndingArt1 db " .---. .---. .---.",13,10," / $ / / VIP / / $ /",13,10," \\____/ \\____/ \\____/",13,10,0 secretEndingArt2 db " ======= ASSEMBLER CASINO PRIVATE FLOOR =======",13,10," cards slots roulette secrets",13,10," =================================================",13,10,0 dailyReadyText db " [готово к получению]",13,10,0 dailyTaskName01 db "Сыграть 3 игры",0 dailyTaskName02 db "Сыграть 5 игр",0 dailyTaskName03 db "Сыграть 7 игр",0 dailyTaskName04 db "Победить 1 раз",0 dailyTaskName05 db "Победить 2 раза",0 dailyTaskName06 db "Победить 3 раза",0 dailyTaskName07 db "Проиграть 1 раз",0 dailyTaskName08 db "Проиграть 2 раза",0 dailyTaskName09 db "Сделать ничью 1 раз",0 dailyTaskName10 db "Поставить от $5000",0 dailyTaskName11 db "Поставить от $5000 три раза",0 dailyTaskName12 db "Поставить от $10000",0 dailyTaskName13 db "Сыграть в 21",0 dailyTaskName14 db "Победить в 21",0 dailyTaskName15 db "Сыграть в Poker",0 dailyTaskName16 db "Победить в Poker",0 dailyTaskName17 db "Сыграть в CloverPit",0 dailyTaskName18 db "Победить в CloverPit",0 dailyTaskName19 db "Сыграть в русскую рулетку",0 dailyTaskName20 db "Победить в русскую рулетку",0 dailyTaskName21 db "Сыграть в черепа",0 dailyTaskName22 db "Победить в черепа",0 dailyTaskName23 db "Сыграть в орла и решку",0 dailyTaskName24 db "Победить в орла и решку",0 dailyTaskName25 db "Сыграть в кости",0 dailyTaskName26 db "Победить в кости",0 dailyTaskName27 db "Сыграть в казино-рулетку",0 dailyTaskName28 db "Победить в казино-рулетку",0 dailyTaskName29 db "Сыграть в Slot machine",0 dailyTaskName30 db "Победить в Slot machine",0 dailyTaskName31 db "Сыграть в дурака",0 dailyTaskName32 db "Победить в дурака",0 dailyTaskName33 db "Сыграть в Skill Check",0 dailyTaskName34 db "Победить в Skill Check",0 dailyTaskName35 db "Сыграть 2 карточные игры",0 dailyTaskName36 db "Победить в карточной игре",0 dailyTaskName37 db "Сыграть 3 игры удачи",0 dailyTaskName38 db "Победить 2 раза в играх удачи",0 dailyTaskName39 db "Сыграть 2 опасные игры",0 dailyTaskName40 db "Победить в опасной игре",0 dailyTaskNameTable dd OFFSET dailyTaskName01, OFFSET dailyTaskName02, OFFSET dailyTaskName03, OFFSET dailyTaskName04 dd OFFSET dailyTaskName05, OFFSET dailyTaskName06, OFFSET dailyTaskName07, OFFSET dailyTaskName08 dd OFFSET dailyTaskName09, OFFSET dailyTaskName10, OFFSET dailyTaskName11, OFFSET dailyTaskName12 dd OFFSET dailyTaskName13, OFFSET dailyTaskName14, OFFSET dailyTaskName15, OFFSET dailyTaskName16 dd OFFSET dailyTaskName17, OFFSET dailyTaskName18, OFFSET dailyTaskName19, OFFSET dailyTaskName20 dd OFFSET dailyTaskName21, OFFSET dailyTaskName22, OFFSET dailyTaskName23, OFFSET dailyTaskName24 dd OFFSET dailyTaskName25, OFFSET dailyTaskName26, OFFSET dailyTaskName27, OFFSET dailyTaskName28 dd OFFSET dailyTaskName29, OFFSET dailyTaskName30, OFFSET dailyTaskName31, OFFSET dailyTaskName32 dd OFFSET dailyTaskName33, OFFSET dailyTaskName34, OFFSET dailyTaskName35, OFFSET dailyTaskName36 dd OFFSET dailyTaskName37, OFFSET dailyTaskName38, OFFSET dailyTaskName39, OFFSET dailyTaskName40 cheatAppliedText db "CHEAT ACTIVATED: ",0 cheatBadText db "Unknown cheat code.",13,10,0 cheatMoneyText db "+$50000",13,10,0 cheatSevenText db "+$7777",13,10,0 cheatWinText db "next loss becomes win",13,10,0 cheatGodText db "losses become wins",13,10,0 cheatFairText db "fair play restored",13,10,0 cheatGoalText db "bank moved to current goal",13,10,0 cheatResetText db "bank reset to $10000",13,10,0 cheatEasyText db "AI difficulty EASY",13,10,0 cheatNormalText db "AI difficulty NORMAL",13,10,0 cheatHardText db "AI difficulty HARD",13,10,0 cheatJackpotText db "next slot spin is forced jackpot",13,10,0 cheatRichText db "+$250000",13,10,0 cheatDoubleText db "bank doubled",13,10,0 cheatPoorText db "bank set to $1",13,10,0 cheatShopText db "+$30000 for shop",13,10,0 cheatBacksText db "all card backs unlocked",13,10,0 cheatCharmText db "luck talisman maxed",13,10,0 cheatNoCharmText db "luck talisman removed",13,10,0 cheatAchText db "all achievements unlocked",13,10,0 cheatSavedText db "CHEAT: loss changed into win.",13,10,0 cheatCodeMoney db "MONEYRAIN",0 cheatCodeSeven db "SEVENS",0 cheatCodeWin db "WINNEXT",0 cheatCodeGod db "GODMODE",0 cheatCodeFair db "FAIRPLAY",0 cheatCodeGoal db "GOAL",0 cheatCodeReset db "RESETBANK",0 cheatCodeEasy db "EASYAI",0 cheatCodeNormal db "NORMALAI",0 cheatCodeHard db "HARDAI",0 cheatCodeJackpot db "JACKPOT",0 cheatCodeRich db "HIGHROLLER",0 cheatCodeDouble db "DOUBLECASH",0 cheatCodePoor db "ONEBUCK",0 cheatCodeShop db "SHOPPING",0 cheatCodeBacks db "ALLBACKS",0 cheatCodeCharm db "MAXCHARM",0 cheatCodeNoCharm db "NOCHARM",0 cheatCodeAch db "ACHIEVER",0 moneyWinText db "Выигрыш: +$",0 moneyLoseText db "Проигрыш: -$",0 moneyDrawText db "Ставка возвращается.",13,10,0 casinoKickText db 13,10,"У вас не осталось денег. Вас выводят из казино.",13,10,0 casinoExitText db "Нажмите любую клавишу, чтобы выйти...",0 welcomeText db 13,10,"Добро пожаловать в ASSEMBLER CASINO!",13,10,"Удача любит смелых, но казино любит математику.",13,10,0 difficultyText db 13,10,"Сложность AI: 1 - Easy, 2 - Normal, 3 - Hard: ",0 difficultyNowText db "Сложность AI: ",0 easyName db "Easy",13,10,0 normalName db "Normal",13,10,0 hardName db "Hard",13,10,0 statsGamesText db "Игр сыграно: ",0 statsWinsText db "Побед: ",0 statsLossText db "Поражений: ",0 statsDrawText db "Ничьих: ",0 statsBestWinText db "Макс. выигрыш: $",0 statsBestLossText db "Макс. проигрыш: $",0 statsByGameTitle db 13,10,"--- Статистика и лидеры казино ---",13,10,0 statsLinePlayed db " игр: ",0 statsLineWins db " побед: ",0 statsLineLoss db " поражений: ",0 statsLineDraw db " ничьих: ",0 leaderCurrentTitle db "Текущий аккаунт:",13,10,0 leaderTitle db 13,10,"Лидеры среди всех аккаунтов:",13,10,0 leaderNoDataText db "Нет сохранений аккаунтов.",13,10,0 leaderBankText db "Самый большой банк: ",0 leaderWinsText db "Больше всего побед: ",0 leaderLossText db "Больше всего поражений: ",0 leaderGameTitle db 13,10,"Лидеры по играм:",13,10,0 leaderGameWinText db " победы: ",0 leaderGameLossText db " поражения: ",0 leaderDashText db "-",0 leaderOpenText db " (",0 leaderCloseText db ")",0 leaderMoneyPrefix db "$",0 statsGame21 db "21 / Очко",0 statsGamePoker db "Poker",0 statsGameClover db "CloverPit",0 statsGameRR db "Русская рулетка",0 statsGameSkulls db "Черепа",0 statsGameCoin db "Орел/решка",0 statsGameDice db "Кости",0 statsGameCasinoRoulette db "Казино-рулетка",0 statsGameClassicSlot db "Slot machine",0 statsGameDurak db "Дурак",0 statsGameSkillCheck db "Крюк: Skill Check",0 statsGameNames dd OFFSET statsGame21, OFFSET statsGamePoker, OFFSET statsGameClover, OFFSET statsGameRR, OFFSET statsGameSkulls dd OFFSET statsGameCoin, OFFSET statsGameDice, OFFSET statsGameCasinoRoulette, OFFSET statsGameClassicSlot, OFFSET statsGameDurak dd OFFSET statsGameSkillCheck bankRecoveredText db "После прошлого визита казино выдало новый стартовый банк: $10000",13,10,0 saveTamperedText db "Сохранение повреждено или изменено. Казино выдало чистый стартовый банк.",13,10,0 goalText db "Цель игры: довести банк до $",0 victoryText db 13,10,"+====================================+",13,10 db "| ДЖЕКПОТ ЖИЗНИ |",13,10 db "+====================================+",13,10,13,10,0 victoryReachedText db "Ты поднял банк до $",0 victoryTailText db "Охрана уже нервничает.",13,10 db "Казино признает поражение.",13,10,13,10 db "Забирай выигрыш и уходи красиво.",13,10,0 victoryExitText db "Нажмите любую клавишу, чтобы продолжить игру...",0 nextGoalText db "Следующая цель: $",0 croupierPrefix db 13,10,"Крупье: ",0 croupierWin1 db "Красиво. Фишки идут к вам.",13,10,0 croupierWin2 db "Стол сегодня явно на вашей стороне.",13,10,0 croupierWin3 db "Хороший удар по банку казино.",13,10,0 croupierLose1 db "Казино забирает ставку.",13,10,0 croupierLose2 db "Не лучший расклад, но вечер еще живой.",13,10,0 croupierLose3 db "Фишки уходят со стола.",13,10,0 croupierDraw1 db "Ставка остается при вас.",13,10,0 croupierDraw2 db "Никто не сдвинул банк. Играем дальше.",13,10,0 croupierDraw3 db "Ровно. Без победителя.",13,10,0 croupierWinList dd OFFSET croupierWin1, OFFSET croupierWin2, OFFSET croupierWin3 croupierLoseList dd OFFSET croupierLose1, OFFSET croupierLose2, OFFSET croupierLose3 croupierDrawList dd OFFSET croupierDraw1, OFFSET croupierDraw2, OFFSET croupierDraw3 dealerFileName db "assets\data\dealer_phrases.txt",0 pulseTitleText db 13,10,"Пульс ставки:",13,10,0 pulseFrame1 db " _/\_ спокойно",13,10,0 pulseFrame2 db " _/\/\_ напряжение",13,10,0 pulseFrame3 db " _/\/\/\_ риск",13,10,0 pulseFrame4 db " _/\/\/\/\_ сердце колотится",13,10,0 pulseFrame5 db " _/\/\_/\_ вдох...",13,10,0 observerTitle db 13,10,"--- Наблюдатель AI vs AI ---",13,10,0 observerIntro db "AI-1 и AI-2 играют 5 быстрых раундов в 21 без ставок.",13,10,0 observerRoundText db 13,10,"Раунд ",0 observerAI1Text db "AI-1 очки: ",0 observerAI2Text db "AI-2 очки: ",0 observerWin1Text db "AI-1 забирает раунд.",13,10,0 observerWin2Text db "AI-2 забирает раунд.",13,10,0 observerDrawText db "Ничья между железками.",13,10,0 observerDoneText db 13,10,"Наблюдение окончено.",13,10,0 observerMenuText db "1. Русская рулетка",13,10 db "2. 21 / Очко",13,10 db "3. Poker",13,10 db "4. Дурак",13,10 db "0. Назад",13,10 db "Выбор: ",0 observer21Title db 13,10,"--- AI vs AI: 21 / Очко ---",13,10,0 observerPokerTitle db 13,10,"--- AI vs AI: Poker ---",13,10,0 observerDurakTitle db 13,10,"--- AI vs AI: Дурак ---",13,10,0 observerRRTitle db 13,10,"--- AI vs AI: Русская рулетка ---",13,10,0 observerAI1CardsText db 13,10,"Карты AI-1:",13,10,0 observerAI2CardsText db 13,10,"Карты AI-2:",13,10,0 observerAI1RaiseText db "AI-1 повышает ставку.",13,10,0 observerAI2RaiseText db "AI-2 повышает ставку.",13,10,0 observerCallText db "Соперник отвечает.",13,10,0 observerFold1Text db "AI-1 делает фолд.",13,10,0 observerFold2Text db "AI-2 делает фолд.",13,10,0 observerShotAI1Text db "Выстрел достался AI-1. Победил AI-2.",13,10,0 observerShotAI2Text db "Выстрел достался AI-2. Победил AI-1.",13,10,0 shopMainMenuText db "1. Рубашки карт",13,10 db "2. Талисманы",13,10 db "3. Бестиарий талисманов",13,10 db "0. Назад",13,10 db "Выбор: ",0 shopBackTitle db 13,10,"--- Магазин: рубашки карт ---",13,10,0 shopCharmTitle db 13,10,"--- Магазин: талисманы ---",13,10,0 shopBackMenuText db "1. Синяя рубашка карт - $3000",13,10 db "2. Красная рубашка карт - $3000",13,10 db "3. Золотая рубашка карт - $10000",13,10 db "4. Рубашка Череп - $12000",13,10 db "5. Rubashka CloverPit - $15000",13,10 db "6. Rubashka Arcane kart - $17000",13,10 db "7. Rubashka Noir kart - $18000",13,10 db "8. Rubashka Diamond kart - $20000",13,10 db "9. Rubashka Rider kart - $22000",13,10 db "10. Rubashka Bee kart - $22000",13,10 db "11. Rubashka Fan kart - $23000",13,10 db "12. Rubashka Web kart - $24000",13,10 db "0. Назад",13,10 db "Выбор: ",0 shopCharmMenuText db "1. Талисман Клевер: 7%, 3 заряда - $12000",13,10 db "2. Талисман Колокол: 14%, 3 заряда, +4 подозрения - $18000",13,10 db "3. Талисман Алмаз: 21%, 3 заряда, +8 подозрения - $25000",13,10 db "4. Талисман Череп: 28%, 2 заряда, штраф половина ставки - $32000",13,10 db "5. Талисман Паутина: 35%, 1 заряд, +20 подозрения - $40000",13,10 db "6. Талисман Пчела: 12%, 5 зарядов - $30000",13,10 db "7. Талисман Луна: 18%, 4 заряда, +8 подозрения - $36000",13,10 db "8. Талисман Корона: 24%, 2 заряда, +12 подозрения - $52000",13,10 db "9. Талисман Зеркало: 16%, 4 заряда, +6 подозрения - $42000",13,10 db "10. Талисман Кость: 10%, 6 зарядов - $35000",13,10 db "11. Кровавая монета: 40%, 1 заряд, штраф 25% ставки и +25 подозрения - $65000",13,10 db "12. Песочные часы: 22%, 2 заряда, +15 подозрения - $48000",13,10 db "13. Подкова: 9%, 8 зарядов - $39000",13,10 db "14. Маска джокера: 33%, 1 заряд, +30 подозрения - $70000",13,10 db "15. Перо феникса: 26%, 2 заряда, +10 подозрения - $56000",13,10 db "16. Сломанный компас: 19%, 3 заряда, +12 подозрения - $44000",13,10 db "17. Золотой зуб: 15%, 5 зарядов, штраф 20% ставки - $47000",13,10 db "18. Хрустальный глаз: 31%, 1 заряд, +18 подозрения - $60000",13,10 db "19. Ржавый ключ: 13%, 6 зарядов - $41000",13,10 db "20. Черная свеча: 38%, 1 заряд, штраф 33% ставки и +35 подозрения - $76000",13,10 db "21. Счастливая фишка: 20%, 4 заряда - $50000",13,10 db "22. Змеиное кольцо: 29%, 2 заряда, +16 подозрения - $62000",13,10 db "23. Осколок туза: 17%, 5 зарядов, +7 подозрения - $53000",13,10 db "24. Договор с дьяволом: 50%, 1 заряд, штраф 50% ставки и +45 подозрения - $100000",13,10 db "0. Назад",13,10 db "Выбор: ",0 shopTitle db 13,10,"--- Магазин казино ---",13,10,0 shopMenuText db "1. Синяя рубашка карт - $3000",13,10 db "2. Красная рубашка карт - $3000",13,10 db "3. Золотая рубашка карт - $10000",13,10 db "4. Рубашка Череп - $12000",13,10 db "5. Рубашка CloverPit - $15000",13,10 db "6. Талисман Клевер: 7%, 3 заряда - $12000",13,10 db "7. Талисман Колокол: 14%, 3 заряда - $18000",13,10 db "8. Талисман Алмаз: 21%, 3 заряда - $25000",13,10 db "9. Rubashka Arcane kart - $17000",13,10 db "10. Rubashka Noir kart - $18000",13,10 db "11. Rubashka Diamond kart - $20000",13,10 db "12. Rubashka Rider kart - $22000",13,10 db "13. Rubashka Bee kart - $22000",13,10 db "14. Rubashka Fan kart - $23000",13,10 db "15. Rubashka Web kart - $24000",13,10 db "0. Назад",13,10 db "Выбор: ",0 shopBackText db "Текущая рубашка: ",0 shopBackGray db "Серая",13,10,0 shopBackBlue db "Синяя волна",13,10,0 shopBackRed db "Красный крест",13,10,0 shopBackGold db "Золотой блеск",13,10,0 shopBackSkull db "Череп",13,10,0 shopBackClover db "CloverPit",13,10,0 shopBackArcane db "Arcane",13,10,0 shopBackNoir db "Noir",13,10,0 shopBackDiamond db "Diamond",13,10,0 shopBackRider db "Rider",13,10,0 shopBackBee db "Bee",13,10,0 shopBackFan db "Fan",13,10,0 shopBackWeb db "Web",13,10,0 shopCharmText db "Талисман: ",0 shopCharmNone db "нет",13,10,0 shopCharmClover db "Клевер",0 shopCharmBell db "Колокол",0 shopCharmDiamond db "Алмаз",0 shopCharmSkull db "Череп",0 shopCharmWeb db "Паутина",0 shopCharmBee db "Пчела",0 shopCharmMoon db "Луна",0 shopCharmCrown db "Корона",0 shopCharmMirror db "Зеркало",0 shopCharmDice db "Кость",0 shopCharmBlood db "Кровавая монета",0 shopCharmHourglass db "Песочные часы",0 shopCharmHorseshoe db "Подкова",0 shopCharmJoker db "Маска джокера",0 shopCharmPhoenix db "Перо феникса",0 shopCharmCompass db "Сломанный компас",0 shopCharmTooth db "Золотой зуб",0 shopCharmEye db "Хрустальный глаз",0 shopCharmKey db "Ржавый ключ",0 shopCharmCandle db "Черная свеча",0 shopCharmChip db "Счастливая фишка",0 shopCharmSnake db "Змеиное кольцо",0 shopCharmAce db "Осколок туза",0 shopCharmDevil db "Договор с дьяволом",0 bestiaryTitle db 13,10,"--- Бестиарий талисманов ---",13,10,0 bestiaryMenuText db "--- Обычные ---",13,10 db "1. Клевер",13,10 db "2. Колокол",13,10 db "6. Пчела",13,10 db "10. Кость",13,10 db "13. Подкова",13,10 db "19. Ржавый ключ",13,10 db "--- Редкие ---",13,10 db "3. Алмаз",13,10 db "7. Луна",13,10 db "9. Зеркало",13,10 db "12. Песочные часы",13,10 db "15. Перо феникса",13,10 db "16. Сломанный компас",13,10 db "17. Золотой зуб",13,10 db "21. Счастливая фишка",13,10 db "23. Осколок туза",13,10 db "--- Проклятые ---",13,10 db "4. Череп",13,10 db "5. Паутина",13,10 db "11. Кровавая монета",13,10 db "14. Маска джокера",13,10 db "20. Черная свеча",13,10 db "22. Змеиное кольцо",13,10 db "--- Легендарные ---",13,10 db "8. Корона",13,10 db "18. Хрустальный глаз",13,10 db "24. Договор с дьяволом",13,10 db "0. Назад",13,10 db "Выбор: ",0 bestiaryGoodText db "Плюс: ",0 bestiaryBadText db "Минус: ",0 bestiaryBackText db 13,10,"0 - назад к списку бестиария: ",0 bestiaryCloverArt db 13,10," .-. .-.",13,10," .' V '. CLOVER",13,10," \ \|/ /",13,10," `-+-'",13,10,0 bestiaryBellArt db 13,10," .---.",13,10," / ___ \ BELL",13,10," / / \ ",13,10," \_\___/_/",13,10," (_) ",13,10,0 bestiaryDiamondArt db 13,10," /",13,10," /##\ DIAMOND",13,10," /####",13,10," \####/",13,10," \##/",13,10," \/",13,10,0 bestiarySkullArt db 13,10," .-''''-.",13,10," / O O \ SKULL",13,10," | __ |",13,10," | .____. |",13,10," \__||||__/",13,10,0 bestiaryWebArt db 13,10," \ | /",13,10," ---\ | /--- WEB",13,10," ---- @ ----",13,10," ---/ | \---",13,10," / | ",13,10,0 bestiaryBeeArt db 13,10," __",13,10," __/o \__ BEE",13,10," / \__/ ",13,10," \__/==\__/",13,10," \__/",13,10,0 bestiaryMoonArt db 13,10," .--.",13,10," .' _/ MOON",13,10," / .'",13,10," \ '.",13,10," '.__",13,10,0 bestiaryCloverInfo db "Клевер: 7%, 3 заряда.",13,10,"Плюс: может полностью спасти проигранную ставку.",13,10,"Минус: слабый шанс, без дополнительных бонусов.",13,10,0 bestiaryBellInfo db "Колокол: 14%, 3 заряда.",13,10,"Плюс: чаще спасает проигрыш.",13,10,"Минус: звон привлекает казино: +4 подозрения при срабатывании.",13,10,0 bestiaryDiamondInfo db "Алмаз: 21%, 3 заряда.",13,10,"Плюс: сильный шанс спасения.",13,10,"Минус: блеск палится охране: +8 подозрения.",13,10,0 bestiarySkullInfo db "Череп: 28%, 2 заряда.",13,10,"Плюс: высокий шанс не потерять всю ставку.",13,10,"Минус: забирает половину ставки даже при спасении.",13,10,0 bestiaryWebInfo db "Паутина: 35%, 1 заряд.",13,10,"Плюс: почти аварийная кнопка против проигрыша.",13,10,"Минус: +20 подозрения, заряд один.",13,10,0 bestiaryBeeInfo db "Пчела: 12%, 5 зарядов.",13,10,"Плюс: много попыток, хороший талисман на длинную игру.",13,10,"Минус: шанс ниже, чем у дорогих талисманов.",13,10,0 bestiaryMoonInfo db "Луна: 18%, 4 заряда.",13,10,"Плюс: баланс шанса и зарядов.",13,10,"Минус: лунный свет выдает шулера: +8 подозрения.",13,10,0 bestiaryCrownArt db 13,10," _^_",13,10," .'___'. CROWN",13,10," /_/|_|\_",13,10," /___",13,10,0 bestiaryMirrorArt db 13,10," .----.",13,10," / .--. \ MIRROR",13,10," | | <> | |",13,10," \ '--' /",13,10," '----'",13,10,0 bestiaryDiceArt db 13,10," +-----+",13,10," | o o | DICE",13,10," | o |",13,10," | o o |",13,10," +-----+",13,10,0 bestiaryBloodArt db 13,10," .---.",13,10," / $ $ \ BLOOD COIN",13,10," | *** |",13,10," \_===_/",13,10," drip",13,10,0 bestiaryHourglassArt db 13,10," \-----/",13,10," \.../ HOURGLASS",13,10," \./",13,10," /\",13,10," /___",13,10,0 bestiaryCrownInfo db "Корона: 24%, 2 заряда.",13,10,"Плюс: солидный шанс спасения.",13,10,"Минус: корона слишком заметна: +12 подозрения.",13,10,0 bestiaryMirrorInfo db "Зеркало: 16%, 4 заряда.",13,10,"Плюс: несколько стабильных попыток обмануть проигрыш.",13,10,"Минус: отражение палит руки: +6 подозрения.",13,10,0 bestiaryDiceInfo db "Кость: 10%, 6 зарядов.",13,10,"Плюс: много зарядов, можно жить долго.",13,10,"Минус: шанс маленький, это талисман терпения.",13,10,0 bestiaryBloodInfo db "Кровавая монета: 40%, 1 заряд.",13,10,"Плюс: самый резкий шанс спасения.",13,10,"Минус: забирает 25% ставки и дает +25 подозрения.",13,10,0 bestiaryHourglassInfo db "Песочные часы: 22%, 2 заряда.",13,10,"Плюс: надежнее среднего.",13,10,"Минус: время не любит свидетелей: +15 подозрения.",13,10,0 bestiaryHorseshoeArt db 13,10," __ __",13,10," / \_/ \ HORSESHOE",13,10," | o o |",13,10," \__ __/",13,10," |_|",13,10,0 bestiaryJokerArt db 13,10," .-^^-.",13,10," / o o \ JOKER",13,10," | .--. |",13,10," \_\__/ _/",13,10," /==\",13,10,0 bestiaryPhoenixArt db 13,10," /\",13,10," ___/ \___ PHOENIX",13,10," / / /\ \ ",13,10," /_||_\",13,10," \/",13,10,0 bestiaryCompassArt db 13,10," .---.",13,10," / N \ COMPASS",13,10," | W-+-E |",13,10," \ S /",13,10," '--?'",13,10,0 bestiaryToothArt db 13,10," .--.",13,10," /$ $\ GOLD TOOTH",13,10," | __ |",13,10," \____/",13,10," drip",13,10,0 bestiaryEyeArt db 13,10," .-------.",13,10," / .---. \ EYE",13,10," | ( 0 ) |",13,10," \ '---' /",13,10," '-------'",13,10,0 bestiaryKeyArt db 13,10," __",13,10," ___/ \___ KEY",13,10," (___ ___)",13,10," |__|==",13,10," ==",13,10,0 bestiaryCandleArt db 13,10," )",13,10," ( ) CANDLE",13,10," .-#-.",13,10," |###|",13,10," |___|",13,10,0 bestiaryChipArt db 13,10," .-----.",13,10," / $ $ $ \ CHIP",13,10," | $ 777 $ |",13,10," \ $ $ $ /",13,10," '-----'",13,10,0 bestiarySnakeArt db 13,10," __",13,10," __/ \__ SNAKE RING",13,10," / _ _ ",13,10," \_/ \/ \_/",13,10," hiss",13,10,0 bestiaryAceArt db 13,10," .---.",13,10," / A \ ACE SHARD",13,10," | ^ |",13,10," \ /_\ /",13,10," '---'",13,10,0 bestiaryDevilArt db 13,10," /\ /\",13,10," / \_/ \ DEVIL",13,10," | $ $ |",13,10," | ___ |",13,10," \_/###\_/",13,10,0 bestiaryHorseshoeInfo db "Подкова: 9%, 8 зарядов.",13,10,"Плюс: много попыток, хорошо для длинных сессий.",13,10,"Минус: шанс маленький, спасает редко.",13,10,0 bestiaryJokerInfo db "Маска джокера: 33%, 1 заряд.",13,10,"Плюс: сильный шанс резко отменить проигрыш.",13,10,"Минус: слишком театрально: +30 подозрения.",13,10,0 bestiaryPhoenixInfo db "Перо феникса: 26%, 2 заряда.",13,10,"Плюс: хороший шанс, будто ставка воскресает из пепла.",13,10,"Минус: +10 подозрения при срабатывании.",13,10,0 bestiaryCompassInfo db "Сломанный компас: 19%, 3 заряда.",13,10,"Плюс: средний талисман без денежного штрафа.",13,10,"Минус: ведет криво: +12 подозрения.",13,10,0 bestiaryToothInfo db "Золотой зуб: 15%, 5 зарядов.",13,10,"Плюс: много зарядов при нормальном шансе.",13,10,"Минус: берет плату 20% ставки при спасении.",13,10,0 bestiaryEyeInfo db "Хрустальный глаз: 31%, 1 заряд.",13,10,"Плюс: почти видит проигрыш заранее.",13,10,"Минус: +18 подозрения, заряд один.",13,10,0 bestiaryKeyInfo db "Ржавый ключ: 13%, 6 зарядов.",13,10,"Плюс: дешевле мощных талисманов и долго живет.",13,10,"Минус: шанс слабый, ключ часто не подходит.",13,10,0 bestiaryCandleInfo db "Черная свеча: 38%, 1 заряд.",13,10,"Плюс: очень сильный шанс спасения.",13,10,"Минус: штраф 33% ставки и +35 подозрения.",13,10,0 bestiaryChipInfo db "Счастливая фишка: 20%, 4 заряда.",13,10,"Плюс: ровный универсальный талисман.",13,10,"Минус: без яркого бонуса, просто надежность.",13,10,0 bestiarySnakeInfo db "Змеиное кольцо: 29%, 2 заряда.",13,10,"Плюс: высокий шанс на два спасения.",13,10,"Минус: шипит на охрану: +16 подозрения.",13,10,0 bestiaryAceInfo db "Осколок туза: 17%, 5 зарядов.",13,10,"Плюс: много зарядов и чуть больше удачи, чем у ключа.",13,10,"Минус: +7 подозрения.",13,10,0 bestiaryDevilInfo db "Договор с дьяволом: 50%, 1 заряд.",13,10,"Плюс: самый мощный шанс спасти проигрыш.",13,10,"Минус: штраф 50% ставки и +45 подозрения.",13,10,0 charmPenaltyText db "Цена талисмана: $",0 shopCharmUsesText db ", зарядов: ",0 shopBoughtText db "Покупка выполнена.",13,10,0 shopSelectedText db "Рубашка выбрана.",13,10,0 shopCharmBurnText db "Талисман сгорел.",13,10,0 shopCharmSaveText db 13,10,"Талисман вспыхнул и спас ставку!",13,10,0 achMenuTitle db 13,10,"--- Достижения ---",13,10,0 achPopupTop db 13,10,"+--------------------------------------+",13,10,0 achPopupTitle db "| ДОСТИЖЕНИЕ ОТКРЫТО |",13,10,0 achPopupLeft db "| ",0 achPopupBottom db "+--------------------------------------+",13,10,0 achDoneText db "[x] ",0 achTodoText db "[ ] ",0 achFirstWinName db "Первый выигрыш",13,10,0 achFirstLossName db "Первый проигрыш",13,10,0 achJackpotName db "Джекпот пойман",13,10,0 achHighRollerName db "Большая ставка",13,10,0 achShopperName db "Покупатель казино",13,10,0 achCharmName db "Талисман сработал",13,10,0 achGoalName db "Цель достигнута",13,10,0 achCloverPitName db "CloverPit разогрелся",13,10,0 achClassicSlotName db "Старый автомат платит",13,10,0 achPokerRaiseName db "Ставка повышена",13,10,0 achPokerBluffName db "Блеф сработал",13,10,0 achRouletteWinName db "Колесо судьбы",13,10,0 achRussianWinName db "Сухой щелчок",13,10,0 achDurakWinName db "Не дурак",13,10,0 achBackCollectorName db "Коллекционер рубашек",13,10,0 achCharmBuyerName db "Талисман в кармане",13,10,0 achObserverName db "Ложа наблюдателя",13,10,0 achSkillCheckName db "С крюка сорвался",13,10,0 achievementFileName db "runtime\achievement.txt",0 achievementCmd db "cmd /c start ""Achievement"" tools\achievement_popup.bat",0 skillTitle db 13,10,"--- Крюк: Skill Check ---",13,10,0 skillIntro db "Попадай по зеленой зоне. PERFECT дает двойной прогресс.",13,10 db "3 промаха - тьма забирает ставку. 5 прогресса - ты срываешься с крюка.",13,10 db "Нажимай SPACE или ENTER.",13,10,0 skillHookArt db 13,10 db " || .:!!!!!!!!!!:.",13,10 db " || .:!##############!:.",13,10 db " _____||_____ !#### ENTITY #####!",13,10 db " /____ ____/ ':!#############!:'",13,10 db " | | ''!!####!!''",13,10 db " | | _J",13,10 db " | | __/ |",13,10 db " _____| |_____ .-' .-^-. .---- RED LOCKER ----.",13,10 db " | WOODEN WALL | / /.-.\\\\ | [] [] [] [] [] |",13,10 db " | || || || || || | |( )| | | [] [] [] [] [] |",13,10 db " | || || || || || | /|\\___/|\\| | [] [] [] [] [] |",13,10 db " | || || || || || |__/ | / \\ | \\__ |__________________|",13,10 db " | || || || || || /_/ \\_\\ J J J",13,10 db " |________________| _/ \\_ chains and hooks",13,10 db " >>> SPACE / ENTER - ловить skill check <<<",13,10,0 skillStateText db "Состояние: ",0 skillStateGood db "держишься",13,10,0 skillStateWarn db "цепь скрипит",13,10,0 skillStateBad db "тьма рядом",13,10,0 skillProgressText db "Прогресс побега: ",0 skillMissText db "Промахи: ",0 skillGaugeHint db 13,10,"Большой skill check:",13,10,0 skillGaugeLeft db "[",0 skillGaugeRight db "]",13,10,0 skillGaugeEmpty db "-",0 skillGaugeSuccess db "#",0 skillGaugePerfect db "@",0 skillGaugeNeedle db "|",0 skillSuccessText db 13,10,"Успех. Ты удержался на крюке.",13,10,0 skillPerfectText db 13,10,"PERFECT! Рывок почти сорвал крюк.",13,10,0 skillFailText db 13,10,"Промах. Крюк дернул сильнее.",13,10,0 skillEscapeText db 13,10,"Ты сорвался с крюка и вырвался из тумана!",13,10,0 skillDarkText db 13,10,"Тьма забрала тебя. Ставка сгорела.",13,10,0 coinTitle db 13,10,"--- Орел и решка ---",13,10,0 coinIntroText db "Угадай сторону монеты. Победа дает выигрыш размером со ставку.",13,10,0 coinChoiceText db "1 - Орел, 2 - Решка: ",0 coinSpinText db "Монета летит...",13,10,0 ; === ASCII-кадры анимации монеты === coinFrame1 db 13,10 db " ( O )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame2 db 13,10 db " ( / )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame3 db 13,10 db " ( | )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame4 db 13,10 db " ( \ )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame5 db 13,10 db " ( - )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame6 db 13,10 db " ( / )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame7 db 13,10 db " ( | )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame8 db 13,10 db " ( \ )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame9 db 13,10 db " ( O )",13,10 db 13,10 db " ___________________",13,10,0 coinFrame10 db 13,10 db " ( / )",13,10 db " ",13,10 db " ___________________",13,10,0 coinFrame11 db 13,10 db " ( | )",13,10 db " ",13,10 db " ___________________",13,10,0 coinFrame12 db 13,10 db " ( \ )",13,10 db " ",13,10 db " ___________________",13,10,0 coinFrame13 db 13,10 db " ( - )",13,10 db " ",13,10 db " ___________________",13,10,0 coinFrame14 db 13,10 db " ( O )",13,10 db " ",13,10 db " ___________________",13,10,0 coinPickText db "Ты выбрал: ",0 coinResultText db "Выпало: ",0 coinHeadsText db "Орел",13,10,0 coinTailsText db "Решка",13,10,0 diceTitle db 13,10,"--- Кости ---",13,10,0 diceIntroText db "Угадай четность суммы двух костей. Победа дает выигрыш размером со ставку.",13,10,0 diceChoiceText db "1 - чет, 2 - нечет: ",0 diceRollText db "Кости летят по столу...",13,10,0 diceFirstText db "Первая кость: ",0 diceSecondText db "Вторая кость: ",0 diceSumText db "Сумма: ",0 diceEvenText db "Чет",13,10,0 diceOddText db "Нечет",13,10,0 ; === Казино-рулетка: тексты, колесо, цвета и карманы === casinoRouletteTitle db 13,10,"--- Казино-рулетка ---",13,10,0 casinoRouletteIntro db "Европейское колесо: 0 зеленый, половина чисел красные, половина черные.",13,10 db "Ставка на число платит x35, остальные ставки платят x1.",13,10,0 casinoRouletteBetMenu db "1 - число 0-36",13,10 db "2 - красное",13,10 db "3 - черное",13,10 db "4 - чет",13,10 db "5 - нечет",13,10 db "Выбор ставки: ",0 casinoRouletteNumberAsk db "Введите число 0-36: ",0 casinoRouletteBadNumber db "В рулетке есть только числа от 0 до 36.",13,10,0 casinoRouletteSpinText db "Шарик скачет по карманам колеса... Итоговый карман прямо под стрелкой сверху.",13,10,0 casinoRouletteResultText db 13,10,"Шарик остановился на: ",0 casinoRouletteWinText db "Ставка сыграла.",13,10,0 casinoRouletteLoseText db "Ставка не сыграла.",13,10,0 casinoRouletteWheelTop db " =============================================================",13,10 db " o",13,10 db " v",13,10,0 casinoRouletteWheelBottom db " =============================================================",13,10,0 casinoRoulettePad db " ",0 rouletteBigSidePad db " ",0 rouletteBigSideGap1 db " .-------------------------------------------------. ",0 rouletteBigSideGap2 db " / .-------------------------------------. \ ",0 rouletteBigSideGap3 db " | / . . . . . . . . . . . . . . \ | ",0 rouletteBigSideGap4 db " | | \\ | // ( O ) \\ | | ",0 rouletteBigSideGap5 db " | | // | \\ --+-- // | | ",0 rouletteBigSideGap6 db " | \ . . . . . . . . . . . . \ | | ",0 roulettePocketLeft db "[",0 roulettePocketRight db "] ",0 rouletteNumSpace db " ",0 rouletteRedName db "красное",13,10,0 rouletteBlackName db "черное",13,10,0 rouletteGreenName db "зеленый ноль",13,10,0 rouletteWheel dd 0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23,10 dd 5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26 rouletteColors db 0,1,2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,1 db 1,2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,1 bankLevelText db "Уровень банка: ",0 bankLevelNewbie db "Новичок",13,10,0 bankLevelPlayer db "Игрок",13,10,0 bankLevelHigh db "Хайроллер",13,10,0 bankLevelLegend db "Легенда казино",13,10,0 ; === Тексты карточных игр: 21, покер, дурак и подсказки === hitText db "Взять карту? (y/n): ",0 againText db "Сыграть еще? (y/n): ",0 yourCardText db 13,10,"Твоя карта:",13,10,0 dealerCardText db 13,10,"Карта дилера:",13,10,0 aiThinkText db 13,10,"AI думает...",13,10,0 aiMoveText db 13,10,"AI берет карту!",13,10,0 aiCardsText db 13,10,"Карты AI:",13,10,0 playerCardsText db 13,10,"Твои карты:",13,10,0 yourScoreText db "Твои очки: ",0 dealerScoreText db "Очки дилера: ",0 aiScoreText db "Очки AI: ",0 bustText db "Перебор. Ты проиграл.",13,10,0 dealerBustText db "У дилера перебор. Ты выиграл!",13,10,0 winText db "Ты выиграл!",13,10,0 loseText db "Ты проиграл.",13,10,0 drawText db "Ничья.",13,10,0 blackjackText db "Blackjack!",13,10,0 twentyOneTitle db 13,10,"--- 21 / Очко ---",13,10,0 blackjackTitle db 13,10,"--- Blackjack ---",13,10,0 pokerTitle db 13,10,"--- Poker ---",13,10,0 slotTitle db 13,10,"--- CloverPit ---",13,10,0 classicSlotTitle db 13,10,"--- Slot machine ---",13,10,0 durakTitle db 13,10,"--- Дурак ---",13,10,0 durakInfoText db "Козырь: ",0 durakDeckText db "Карт в колоде: ",0 durakAICardsText db "Карт у AI: ",0 durakYourHandText db 13,10,"Твои карты:",13,10,0 durakTableText db 13,10,"На столе: ",0 durakAttackAsk db "Выбери карту для атаки: ",0 durakDefendAsk db "Чем бить? 0 - взять: ",0 durakBadMoveText db "Так нельзя. Выбери другую карту.",13,10,0 durakAITakeText db "AI не смог отбиться и взял карту.",13,10,0 durakAIDefendText db "AI отбился картой: ",0 durakAIAttackText db "AI атакует: ",0 durakPlayerTakeText db "Ты взял карту.",13,10,0 durakPlayerDefendText db "Ты отбился.",13,10,0 durakWinText db "Ты вышел из игры без карт. Победа!",13,10,0 durakLoseText db "AI избавился от карт раньше тебя. Ты проиграл.",13,10,0 trainingTitle db 13,10,"--- Обучение ---",13,10,0 trainingText db "Главное: сначала выбери ставку. Если банк упадет до 0, казино выведет тебя.",13,10 db "Магазин: рубашки меняют вид закрытых карт, талисманы могут спасти проигранную ставку.",13,10 db "21 / Очко: бери карты до 21. Перебор - поражение. AI добирает после вскрытия.",13,10 db "Poker: у тебя 2 карты, на столе 3+1+1. Можно играть, фолдить и повышать ставку.",13,10 db "CloverPit: поле 5x3. Платят разные линии и фигуры из одинаковых символов.",13,10 db "Черепа: запомни, где шарик, потом следи за перемешиванием черепов.",13,10 db "Русская рулетка: Easy/Normal/Hard задают 1/2/3 опасные камеры барабана.",13,10 db "Орел и решка: выбери сторону монеты и дождись падения.",13,10 db "Кости: угадай четность суммы двух кубиков.",13,10 db "Казино-рулетка: можно ставить на число, цвет, чет/нечет, дюжины, половины и колонки.",13,10 db "Slot machine: старая 3x3 слот-машина с выпадением барабанов и средней линией.",13,10 db "Дурак: атакуй, подкидывай совпадающие ранги, отбивайся или переводи ход.",13,10 db "Крюк: Skill Check: SPACE/ENTER по зеленой зоне. PERFECT дает двойной прогресс.",13,10 db "Buckshot Roulette: считай живые/холостые, используй предметы и выбирай цель выстрела.",13,10 db "Наблюдатель: AI vs AI играет без твоих ставок, просто для просмотра.",13,10 db "Достижения и статистика сохраняются в аккаунт.",13,10,0 durakDeckVisualText db "Колода: [рубашка], из-под нее торчит козырь ",0 durakAIFaceText db 13,10,"Карты AI:",13,10,0 durakThrowAsk db "Подкинуть карту? 0 - бито: ",0 durakTransferText db "Перевод! Ход переходит обратно.",13,10,0 durakTablePairsText db 13,10,"Карты на столе:",13,10,0 durakSlashText db " / ",0 durakUnbeatenText db " _ ",0 durakStuckText db "Партия зашла в тупик. Считаем ничью.",13,10,0 skullsTitle db 13,10,"--- Черепа и шарик ---",13,10,0 skullsIntroText db "Следи за шариком. Выплата за победу: x2.",13,10,0 skullsShowText db "Смотри внимательно: шарик сейчас здесь.",13,10,0 skullsHideText db "Черепа закрывают шарик...",13,10,0 skullsShuffleText db "Черепа скользят по столу...",13,10,0 skullsGuessText db "Где шарик? 1 / 2 / 3: ",0 skullsWinText db "Верно! Шарик найден.",13,10,0 skullsLoseText db "Мимо. Шарик был под другим черепом.",13,10,0 skullsBallText db "Шарик был под черепом ",0 skullsSwap12Text db " \\______/",13,10," / \",13,10,0 skullsSwap23Text db " \\______/",13,10," / \",13,10,0 skullsSwap13Text db " \\____________________/",13,10," / \",13,10,0 rouletteTitle db 13,10,"--- Русская рулетка ---",13,10,0 rrIntroText db "Барабан на 6 камер. Easy: 1 опасная, Normal: 2, Hard: 3.",13,10,"AI играет с тобой по очереди. Кто попал на опасную камеру - проиграл.",13,10,0 rrDangerText db "Опасных камер в барабане: ",0 rrSpinText db "Барабан вращается... ",0 rrSpin1 db "|",13,10,0 rrSpin2 db "/",13,10,0 rrSpin3 db "-",13,10,0 rrSpin4 db "\\",13,10,0 rrStartsPlayerText db "Револьвер остановился на тебе. Ты стреляешь первым.",13,10,0 rrStartsAIText db "Револьвер остановился на AI. Он стреляет первым.",13,10,0 rrPlayerTurnText db "Твой ход. Нажми любую клавишу, чтобы нажать на спуск...",0 rrAITurnText db "Ход AI. Он поднимает револьвер...",13,10,0 rrClickText db "Щелчок. Пусто.",13,10,0 rrBangText db "БАХ!",13,10,0 rrPlayerLoseText db "Тебе не повезло. Ставка уходит казино.",13,10,0 rrAIShotText db "AI выбыл. Ты пережил эту партию.",13,10,0 rrPayoutText db "Выплата рулетки зависит от сложности.",13,10,0 buckshotTitle db 13,10,"--- Buckshot Roulette ---",13,10,0 buckshotIntro db "Дробовик заряжен живыми и холостыми патронами в неизвестном порядке.",13,10 db "Стреляй в себя или AI. Холостой в себя оставляет ход тебе.",13,10 db "Лупа раскрывает текущий патрон, пила дает 2 урона, пиво выбрасывает патрон, наручники пропускают ход AI.",13,10,0 bsShotgunArt db 13,10 db " ,_______________________________________________",13,10 db " |_________________,----------._ [____] ""-,__",13,10 db " (_(||||||||||||)___________/ ""--.__",13,10 db " `----------' [ ))""-, \",13,10 db " "" `--.__ |",13,10 db " `----'",13,10 db " DOUBLE BARREL CASINO",13,10,0 bsShotgunLoad1 db 13,10 db " ,_______________________________________________",13,10 db " |_________________,----------._ [____] ""-,__",13,10 db " (_(||||||||||||)___________/ ""--.__",13,10 db " `----------' [ ))""-, \",13,10 db " "" `--.__ |",13,10 db " `----'",13,10 db " Крупье берет дробовик со стола...",13,10,0 bsShotgunLoad2 db 13,10 db " ,_______________________________________________",13,10 db " |_________________,----------._ [____] ""-,__",13,10 db " (_(||||||||||||)______/__/ ""--.__",13,10 db " `----------' / LIVE] ",13,10 db " __/ BLANK] .__ |",13,10 db " `----'",13,10 db " Ствол приоткрыт. Патроны у казенной части.",13,10,0 bsShotgunLoad3 db 13,10 db " ,_______________________________________________",13,10 db " |_________________,----------._ [____] ""-,__",13,10 db " (_(||||||||||||)___________/ ""--.__",13,10 db " `----------' [ ))""-, \",13,10 db " "" `--.__ |",13,10 db " `----'",13,10 db " ЩЕЛК. Дробовик закрыт.",13,10,0 bsShotgunFire db 13,10 db " *** BOOM ***",13,10 db " ,_______________________________________________ ***",13,10 db " |_________________,----------._ [____] ""-,__ *****",13,10 db " (_(||||||||||||)___________/ ""--.__ ***",13,10 db " `----------' [ ))""-, \ *",13,10 db " "" `--.__ |",13,10 db " `----'",13,10,0 bsShotgunDry db 13,10 db " ,_______________________________________________",13,10 db " |_________________,----------._ [____] ""-,__ click",13,10 db " (_(||||||||||||)___________/ ""--.__",13,10 db " `----------' [ ))""-, \",13,10 db " "" `--.__ |",13,10 db " `----'",13,10,0 bsHPText db "HP: ты ",0 bsAIHPText db " / AI ",0 bsShellInfoText db "Патроны в раунде: ",0 bsLiveText db " живых, ",0 bsBlankText db " холостых",13,10,0 bsLeftText db "Осталось в дробовике: ",0 bsKnownUnknownText db "Текущий патрон: неизвестно",13,10,0 bsKnownLiveText db "Текущий патрон: ЖИВОЙ",13,10,0 bsKnownBlankText db "Текущий патрон: холостой",13,10,0 bsItemsText db "Предметы: лупа ",0 bsSawText db ", пила ",0 bsBeerText db ", пиво ",0 bsCuffsText db ", наручники ",0 bsMenuText db 13,10,"1. Стрелять в себя",13,10 db "2. Стрелять в AI",13,10 db "3. Лупа",13,10 db "4. Пила",13,10 db "5. Пиво",13,10 db "6. Наручники",13,10 db "Выбор: ",0 bsLoadText db 13,10,"Крупье заряжает дробовик...",13,10,0 bsLiveLoadedText db "Живой патрон",13,10,0 bsBlankLoadedText db "Холостой патрон",13,10,0 bsPlayerTurnText db 13,10,"Твой ход.",13,10,0 bsAITurnText db 13,10,"Ход AI...",13,10,0 bsShootPlayerText db "Выстрел в тебя.",13,10,0 bsShootAIText db "Выстрел в AI.",13,10,0 bsDryText db "Щелчок. Холостой.",13,10,0 bsHitText db "БАХ! Урон: ",0 bsGlassUseText db "Лупа показывает патрон.",13,10,0 bsSawUseText db "Пила надрезает ствол. Следующий живой выстрел сильнее.",13,10,0 bsBeerUseText db "Пиво. Патрон вылетает из дробовика: ",0 bsCuffsUseText db "Наручники защелкнулись. AI пропустит ход.",13,10,0 bsNoItemText db "Этого предмета нет.",13,10,0 bsAISawText db "AI использует пилу.",13,10,0 bsAIGlassText db "AI смотрит патрон через лупу.",13,10,0 bsAIBeerText db "AI выбрасывает патрон пивом.",13,10,0 bsAICuffsText db "AI надевает на тебя наручники.",13,10,0 bsSkipPlayerText db "Ты в наручниках и пропускаешь ход.",13,10,0 bsSkipAIText db "AI в наручниках и пропускает ход.",13,10,0 bsWinText db "AI падает. Ты забираешь банк стола.",13,10,0 bsLoseText db "Ты падаешь. Крупье забирает ставку.",13,10,0 rrGunUp db 117,117,36,96,36,36,36,117,117,36,36,36,13,10 db 80,42,36,96,36,36,36,36,36,36,36,36,13,10 db 63,42,36,32,36,36,36,36,36,36,36,36,13,10 db 36,58,36,32,36,36,36,36,36,36,36,36,13,10 db 34,58,36,32,36,36,36,36,36,36,36,36,13,10 db 32,78,36,32,36,36,36,36,36,36,36,36,13,10 db 32,32,36,32,36,36,36,36,36,36,36,36,13,10 db 32,32,36,32,36,36,36,36,36,36,36,36,13,10 db 32,32,36,32,36,36,36,36,36,36,36,36,13,10 db 32,32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,36,36,82,82,36,36,36,36,36,36,13,10 db 32,32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,36,32,36,36,36,36,36,64,36,36,13,10 db 32,32,36,32,36,36,36,36,36,36,36,36,13,10 db 32,32,36,32,36,36,36,36,36,36,36,36,36,117,117,76,13,10 db 32,32,36,32,36,36,36,36,36,36,36,36,36,117,117,42,42,42,117,46,46,13,10 db 32,32,36,32,36,36,36,36,36,36,36,36,36,32,96,42,42,42,117,36,42,116,13,10 db 32,32,36,120,120,117,117,36,117,36,36,36,36,117,117,117,107,46,36,36,36,63,13,10 db 32,32,36,120,36,117,117,56,117,96,96,96,36,117,117,117,54,46,34,36,63,63,13,10 db 32,32,36,36,36,63,36,36,36,96,96,96,36,36,36,36,36,96,34,34,63,63,13,10 db 32,32,36,36,36,63,36,36,36,32,32,32,36,36,36,36,75,32,32,32,36,36,32,46,46,13,10 db 32,32,36,36,36,72,36,36,36,32,32,32,36,36,36,36,75,46,32,32,36,36,36,36,36,78,115,46,13,10 db 32,32,36,36,36,36,36,36,36,32,32,32,36,36,36,36,88,46,32,32,82,34,36,36,36,37,37,46,78,13,10 db 32,32,36,36,36,37,117,117,36,32,32,32,117,117,117,36,58,58,32,32,82,117,117,117,32,32,34,63,63,58,13,10 db 32,32,36,36,36,37,117,117,33,32,32,32,36,117,36,36,36,58,32,32,124,124,117,117,117,117,42,63,36,36,13,10 db 32,32,36,63,63,78,32,32,32,32,32,32,36,39,36,36,36,32,32,32,36,36,42,117,117,117,33,39,58,36,13,10 db 32,32,36,63,63,46,46,46,46,46,46,46,46,36,36,36,36,32,32,32,36,42,42,96,32,32,100,100,34,34,13,10 db 36,46,36,82,100,46,46,46,46,36,46,46,34,63,55,36,117,111,32,32,53,117,117,46,46,43,42,42,42,13,10 db 39,42,64,82,46,96,96,34,34,42,42,64,34,34,96,117,117,111,117,120,120,117,96,96,85,43,33,96,13,10 db 42,42,64,42,42,120,117,117,42,42,42,34,32,32,32,42,82,82,117,120,36,34,96,96,37,37,13,10 db 32,32,32,42,42,120,78,42,42,37,37,32,32,32,32,46,46,117,46,100,36,46,46,117,37,36,36,111,46,13,10 db 32,32,32,32,32,34,78,78,96,37,46,46,32,32,36,46,46,34,46,100,117,36,36,36,36,36,36,36,36,36,117,117 db 46,46,13,10 db 32,32,32,32,32,56,56,64,46,109,34,58,58,58,82,42,34,34,120,36,36,36,36,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,99,13,10 db 32,32,32,32,32,36,36,101,34,34,34,58,78,64,32,32,32,32,36,36,78,96,34,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,36,64,32,32,32,34,78,37,117,117,46,32,32,63,63,117,117,117,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,96,96,96,34,42,117,36,36,36,36,36,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,34,36,36,36,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,94,94,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,42,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,42,42,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,96 db 34,43,36,36,36,42,36,36,36,36,36,36,62,13,10 db 0 rrGunUpLeft db 32,32,32,32,32,32,32,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,13,10 db 32,32,32,32,32,32,36,36,36,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,62,13,10 db 32,32,32,32,32,117,32,36,36,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,62,13,10 db 32,32,32,32,36,36,36,36,36,36,36,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,62,62,13,10 db 32,32,32,36,32,36,36,36,32,36,36,32,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,46,32,78,58,32,32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,32,36,62,13,10 db 32,32,36,32,36,36,32,36,36,36,32,36,36,32,32,32,32,32,32,32,32,32,32,32,32,46,116,32,32,32,32,32 db 32,32,115,46,63,32,36,32,32,32,32,32,32,32,32,32,32,36,32,36,36,36,32,36,36,32,36,62,13,10 db 32,36,96,36,36,36,36,36,36,36,36,36,36,36,36,32,32,32,32,32,32,32,32,32,46,36,36,63,63,32,32,46 db 36,78,37,34,63,36,36,34,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,62,13,10 db 117,32,36,32,32,36,36,36,32,36,36,32,36,36,36,32,32,32,32,32,32,32,32,42,117,32,36,63,32,63,32,36 db 32,36,32,32,42,39,34,32,32,32,32,32,32,32,46,36,36,32,36,36,32,36,36,36,32,36,36,32,36,13,10 db 80,42,36,36,32,36,36,36,36,36,36,36,36,36,36,36,36,32,32,32,117,76,42,42,46,36,36,34,63,36,36,36 db 36,117,117,117,33,100,42,42,32,32,32,32,117,46,36,36,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,63,58,32,36,32,32,36,36,36,32,36,36,32,36,36,32,36,32,117,32,117,42,32,107,46,34,32,32,36,32,34 db 117,32,117,117,32,32,42,96,32,32,32,117,32,36,36,32,36,36,32,36,36,36,32,36,36,32,36,13,10 db 32,32,36,58,32,36,32,36,32,36,36,32,36,36,36,32,36,36,32,36,117,32,96,117,54,32,96,32,32,32,82,117 db 32,117,117,32,32,43,33,32,32,46,32,36,36,32,36,36,36,32,36,36,32,36,36,36,32,36,13,10 db 32,32,34,32,78,36,36,32,36,36,36,36,36,36,36,64,36,36,36,36,36,32,117,117,36,36,75,46,32,32,32,124 db 124,36,42,96,46,85,37,32,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,42,36,13,10 db 32,32,32,32,32,32,32,36,36,36,32,82,36,32,36,36,32,36,36,36,32,36,117,32,36,36,75,32,46,32,32,32 db 36,32,42,117,96,32,37,36,32,36,36,36,32,36,36,32,36,36,32,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,36,36,36,82,36,36,36,36,36,36,36,36,36,36,96,36,36,36,36,36,88,58,58,32,32 db 32,36,117,117,96,96,37,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,32,36,36,32,36,96,32,96,36,36,32,36,36,32,36,32,32 db 32,32,120,32,34,46,36,32,36,36,32,36,36,32,36,36,36,32,36,36,32,43,13,10 db 32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,36,36,36,117,96,96,96,32,32,36,36,117,36,36,36,36,111 db 32,117,120,36,46,36,36,36,36,36,36,36,36,36,36,36,36,36,36,96,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,36,32,32,36,36,32,117,56,36,32,32,32,32,32,117,117,32,36,36,32,117 db 111,32,117,100,117,32,36,34,32,36,36,36,32,36,36,32,36,36,32,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,36,32,36,32,117,117,32,36,36,32,32,32,32,32,36,39,32,36,36,117 db 32,82,46,32,100,36,96,32,117,36,32,36,36,32,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,36,36,120,120,36,63,36,36,36,36,36,32,32,32,36,46,36,55,96,42 db 82,46,34,46,36,36,117,117,36,36,36,36,36,36,36,42,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,120,32,36,63,36,32,36,36,32,32,32,46,32,34,34,32,32 db 46,32,46,34,36,32,63,36,32,36,36,36,32,42,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,117,117,33,32,46,46,46,64,34,32,32 db 36,46,34,32,32,63,36,36,36,36,94,94,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,37,32,117,32,46,32,36,42,32,34,32,32 db 32,82,32,32,32,117,36,32,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,32,37,32,32,46,46,42,32,42,32,32,32 db 58,32,32,46,42,32,32,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,63,46,46,46,34,42,42,37,46,46,58 db 78,64,117,96,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,63,32,63,46,96,32,117,42,32,37,34,58 db 32,37,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,63,100,46,120,117,42,78,96,109,34,34 db 78,32,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,82,32,42,120,78,32,64,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,32,64,42,42,32,34,56,32,101,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,39,42,64,32,42,32,56,36,36,64,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,32,32,32,32,32,32,36,13,10 db 0 rrGunLeft db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,99,62,62,62,62,62,62,62,62,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 46,36,36,36,36,36,36,36,36,36,43,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 46,36,36,36,36,36,36,36,36,36,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 117,36,36,36,36,36,36,36,36,36,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 117,36,36,36,36,36,36,36,36,36,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,58,36,36,34,32,32,32,32 db 36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,78,63,36,58,34,42,32,32,46 db 36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,46,63,63,39,100,42,96,32,111 db 36,36,36,36,36,36,36,36,36,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,37,34,42,33,100,42,33,32,36 db 36,36,36,36,36,36,36,36,36,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,78,37,32,117,117,32,43,43,37,36 db 36,36,36,36,36,36,36,36,36,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,36,36,32,117,117,32,46,85,37,37 db 36,36,36,36,36,36,36,36,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,36,36,117,117,117,96,46,96,96,117 db 36,36,36,36,36,36,36,36,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,117,117,42,42,117,96,96,46 db 36,36,34,117,36,36,36,94,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,63,63,63,36,36,34,117,124,36,42,117,117,34,46 db 36,36,96,117,36,36,36,94,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,42,36,63,63,36,36,82,82,124,36,36,53,120,36,36 db 117,36,78,117,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,36,36,36,34,32,32,32,32,32,32,32,32,120,120,100 db 100,36,36,63,36,36,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,117,36,34,34,32,32,32,32,32,32,32,32,117,117,46 db 46,120,36,63,36,36,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,42,46,46,96,32,46,46,58,58,32,32,111,111,82,117 db 34,34,32,32,117,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,42,107,54,36,75,75,88,58,36,36,36,117,117,82,46 db 46,34,32,32,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,76,42,42,117,117,36,36,36,36,36,36,36,36,36,117,42,46 db 46,42,32,46,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,117,96,117,117,36,36,36,36,117,36,36,36,55,96,32,32 db 36,82,32,117,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,117,32,117,117,36,36,36,36,117,117,39,36,63,34,32,32 db 32,58,64,117,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,117,36,36,46,34,34,32,32 db 32,58,78,37,96,13,10 db 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,96,96,32,32,32,32,32,32,46,46,64,34,32 db 46,58,58,78,13,10 db 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,96,96,32,32,32,32,32,32,46,46,42,42,37 db 46,34,34,34,13,10 db 36,36,36,36,36,36,36,36,36,36,36,36,36,64,36,36,36,36,36,96,96,32,32,32,32,32,32,46,36,42,42,37 db 37,109,34,13,10 db 117,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,117,117,36,36,36,36,36,33,32,46,46,34,42,42 db 96,46,34,13,10 db 117,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,56,36,36,36,36,117,117,32,46,46,34,117,42 db 78,64,101,13,10 db 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,117,117,36,36,36,36,117,117,32,46,46,96,117,78 db 78,56,36,64,13,10 db 36,36,36,36,36,36,36,36,36,36,36,82,36,36,36,36,36,36,117,117,63,63,72,36,37,37,78,46,46,96,120,120 db 34,56,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,36,82,36,36,36,36,36,36,120,36,36,36,36,36,36,36,63,63,100,46,42,42 db 13,10 db 96,96,32,32,32,32,32,32,32,36,36,36,36,32,32,32,32,32,120,120,36,36,36,36,36,36,63,63,82,82,42,42 db 13,10 db 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,64,64,13 db 10 db 117,42,42,58,58,78,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,42,42,13 db 10 db 117,80,63,36,34,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,39,42,13 db 10 db 0 rrGunDownLeft db 32,32,32,32,32,32,62,36,13,10 db 32,32,32,32,32,62,36,32,36,13,10 db 32,32,32,62,62,36,36,36,36,36,13,10 db 32,32,32,62,36,32,36,36,36,32,36,13,10 db 32,32,62,36,32,36,36,32,36,36,32,36,13,10 db 32,62,36,36,36,36,36,36,36,36,36,42,36,13,10 db 99,36,32,36,36,32,36,36,36,32,36,36,32,36,13,10 db 32,36,36,36,36,36,36,36,36,36,36,36,36,36,43,13,10 db 32,32,36,36,32,36,36,32,36,36,32,36,36,36,32,34,13,10 db 32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,96,96,13,10 db 32,32,32,32,36,32,36,36,36,32,36,36,32,36,36,36,13,10 db 32,32,32,32,32,36,36,32,36,36,32,36,36,36,32,36,36,13,10 db 32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,42,13,10 db 32,32,32,32,32,32,32,36,36,32,36,36,32,36,36,36,32,36,42,13,10 db 32,32,32,32,32,32,32,46,36,36,36,36,36,36,36,36,36,36,36,96,13,10 db 32,32,32,32,32,32,32,32,46,36,32,36,36,36,32,36,36,32,36,42,13,10 db 32,32,32,32,32,32,32,32,117,32,36,36,32,36,36,36,32,36,36,32,34,13,10 db 32,32,32,32,32,32,32,32,32,117,36,36,36,36,36,36,36,36,36,36,94,13,10 db 32,32,32,32,32,32,32,32,32,32,32,36,36,36,32,36,36,32,36,36,94,13,10 db 32,32,32,32,32,32,32,32,32,32,46,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,36,32,36,36,36,32,117,36,32,36,34,13,10 db 32,32,32,32,32,32,34,32,42,96,32,32,36,36,32,36,34,32,117,36,36,32,34,13,10 db 32,32,32,32,32,36,36,34,42,42,33,37,37,37,36,36,36,96,117,63,36,36,13,10 db 32,32,32,32,58,32,36,39,100,32,43,85,32,96,46,36,32,36,36,32,63,117,13,10 db 32,32,32,32,78,63,63,42,33,32,32,46,96,96,34,46,117,100,36,36,32,32,42,34,13,10 db 32,32,32,32,32,46,34,32,117,117,32,96,117,117,32,36,100,32,46,34,32,32,46,96,13,10 db 32,32,32,32,46,115,37,32,117,117,117,42,42,117,120,120,117,46,34,46,34,32,32,117,96,96,13,10 db 32,32,32,32,32,32,78,36,117,32,117,36,32,36,32,117,32,82,46,32,46,82,32,64,37,13,10 db 32,32,32,32,32,32,36,32,36,117,32,124,36,32,32,32,111,32,82,46,36,32,58,78,32,78,13,10 db 32,32,32,32,32,32,46,36,36,34,117,124,32,32,32,111,117,117,42,32,32,32,32,58,58,34,13,10 db 32,32,32,32,32,32,32,32,36,32,82,32,32,32,32,36,32,36,96,32,32,32,32,46,34,34,13,10 db 32,32,32,32,32,32,32,63,36,36,32,32,32,58,36,36,36,36,55,34,34,34,32,46,37,109,34,101,64,13,10 db 32,32,32,32,32,32,63,32,63,32,32,32,46,58,32,36,36,32,36,34,64,32,42,37,32,96,64,32,36,36,13,10 db 32,32,32,32,32,32,63,63,34,32,32,46,32,88,36,36,32,39,46,32,46,42,32,42,42,78,32,56,36,13,10 db 32,32,32,32,32,116,36,36,36,34,96,75,75,36,36,117,117,36,36,46,46,36,42,42,117,42,78,34,56,13,10 db 32,32,32,32,32,46,36,32,36,46,32,36,36,36,32,36,117,32,32,32,46,32,46,34,32,117,120,13,10 db 32,32,32,32,32,32,46,117,46,107,54,36,36,36,36,36,32,32,32,32,32,46,46,46,96,120,42,42,42,13,10 db 32,32,32,32,32,32,32,42,42,32,117,117,32,36,36,32,32,32,32,32,33,32,32,46,46,46,32,42,13,10 db 32,32,32,32,32,32,32,32,42,42,96,117,117,36,96,32,32,32,36,36,117,117,32,46,63,100,82,64,64,13,10 db 32,32,32,32,32,32,32,32,76,117,32,32,36,96,32,96,32,32,36,36,117,32,37,63,32,63,36,32,42,42,13,10 db 32,32,32,32,32,32,32,32,117,32,117,36,32,36,96,96,32,36,36,32,36,37,32,36,63,36,32,46,39,13,10 db 32,32,32,32,32,32,32,32,32,117,36,36,36,36,36,96,36,36,36,36,36,36,36,36,36,36,32,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,36,36,36,32,117,56,32,36,63,36,32,36,36,13,10 db 32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,117,117,63,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,36,32,36,36,32,36,36,36,32,117,36,32,36,36,13,10 db 32,32,32,32,32,32,32,32,36,36,32,64,36,36,32,36,36,32,120,120,36,13,10 db 32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,120,36,36,13,10 db 32,32,32,32,32,32,36,36,36,32,36,36,32,36,36,36,32,32,36,13,10 db 32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,32,36,36,13,10 db 32,32,32,36,32,36,36,32,36,36,32,36,82,36,32,32,36,13,10 db 32,32,32,36,36,32,36,36,36,32,36,36,32,82,36,36,13,10 db 32,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,36,36,36,32,36,36,32,36,36,32,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,36,32,36,36,13,10 db 32,36,32,36,36,32,36,36,36,32,32,36,13,10 db 32,32,117,36,36,36,36,36,36,32,36,36,13,10 db 32,32,32,36,32,36,36,32,32,36,32,78,13,10 db 32,32,32,32,36,32,36,32,36,32,58,13,10 db 32,32,32,32,32,36,96,36,36,58,36,34,13,10 db 32,32,32,32,32,32,36,32,42,63,13,10 db 32,32,32,32,32,32,32,117,80,13,10 db 0 rrGunDown db 62,36,36,36,36,36,36,42,36,36,36,43,34,96,96,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,42,42,96,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,42,34,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,94,94,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,34,34,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,117,42,34,96,96 db 96,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,117,117,117,63,63,32,32,46,117,117 db 37,78,34,32,32,32,64,36,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,34,96,78,36,36,32,32,32,32,64 db 78,58,34,34,34,101,36,36,13,10 db 99,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,120,34,34,42,82,58 db 58,58,34,109,46,64,56,56,13,10 db 32,32,32,32,32,32,32,32,32,32,32,46,46,117,117,36,36,36,36,36,36,36,36,36,117,100,46,34,46,46,36,32 db 32,46,46,37,96,78,78,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,111,36,36,37,117,46,46,36,100,46,117,46,46,32,32 db 32,32,37,37,42,42,78,120,42,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,96,96,34,36,120,117,82,82,42,32,32 db 32,34,42,42,42,117,117,120,42,42,64,42,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,33,43,85,96,96,117,120,120,117,111,117,117,96,34 db 34,64,42,42,34,34,96,96,46,82,64,42,39,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,42,42,43,46,46,117,117,53,32,32,111,117,36,55,63 db 34,46,46,36,46,46,46,46,100,82,36,46,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,34,100,100,32,32,96,42,42,36,32,32,32,36,36,36,36 db 46,46,46,46,46,46,46,46,63,63,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,58,39,33,117,117,117,42,36,36,32,32,32,36,36,36,39 db 36,32,32,32,32,32,32,78,63,63,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,63,42,117,117,117,117,124,124,32,32,58,36,36,36,117 db 36,32,32,32,33,117,117,37,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,58,63,63,34,32,32,117,117,117,82,32,32,58,58,36,117,117 db 117,32,32,32,36,117,117,37,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,78,46,37,37,36,36,36,34,82,32,32,46,88,36,36,36 db 36,32,32,32,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,115,78,36,36,36,36,36,32,32,46,75,36,36,36 db 36,32,32,32,36,36,36,72,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,46,32,36,36,32,32,32,75,36,36,36 db 36,32,32,32,36,36,36,63,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,63,63,34,34,96,36,36,36,36 db 36,96,96,96,36,36,36,63,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,63,63,36,34,46,54,117,117,117 db 36,96,96,96,117,56,117,117,36,120,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,63,36,36,36,46,107,117,117,117 db 36,36,36,36,117,36,117,117,120,120,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,42,36,117,42,42,42,96,32 db 36,36,36,36,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,46,46,117,42,42,42,117,117 db 36,36,36,36,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,76,117,117 db 36,36,36,36,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,64,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,82,82,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,78,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,58,34,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,58,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,32,36,42,63,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,36,36,36,36,36,96,36,42,80,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,36,36,36,117,117,36,36,36,96,36,117,117,13,10 db 0 rrGunDownRight db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 36,32,32,32,32,32,32,42,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64 db 36,36,56,32,42,32,64,42,39,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101 db 32,56,34,32,42,42,64,32,46,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34 db 64,32,78,120,42,32,82,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,32,78,34,34,109 db 96,78,42,117,120,46,100,63,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,37,32,58,34,37 db 32,42,117,32,96,46,63,32,63,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,96,117,64,78,58,46,46 db 37,42,42,34,46,46,46,63,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,32,32,42,46,32,32,58,32,32,32 db 42,32,42,46,46,32,32,37,32,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,32,36,117,32,32,32,82,32,32,32,34 db 32,42,36,32,46,32,117,32,37,36,32,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,94,94,36,36,36,36,63,32,32,34,46,36,32,32,34 db 64,46,46,46,32,33,117,117,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,42,32,36,36,36,32,36,63,32,36,34,46,32,46,32,32,34 db 34,32,46,32,32,32,36,36,32,36,63,36,32,120,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,42,42,36,36,36,36,36,36,36,117,117,36,36,46,34,46,82,42,96,55 db 36,46,36,32,32,32,36,36,36,36,36,63,36,120,120,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,32,36,36,32,36,117,32,96,36,100,32,46,82,32,117,36,36 db 32,39,36,32,32,32,32,32,36,36,32,117,117,32,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,96,32,36,36,32,36,36,32,36,36,36,32,34,36,32,117,100,117,32,111,117,32,36 db 36,32,117,117,32,32,32,32,32,36,56,117,32,36,36,32,32,36,13,10 db 32,32,32,32,32,32,32,32,34,96,36,36,36,36,36,36,36,36,36,36,36,36,36,36,46,36,120,117,32,111,36,36 db 36,36,117,36,36,32,32,96,96,96,117,36,36,36,36,36,36,32,36,36,13,10 db 32,32,32,32,32,32,32,43,32,36,36,32,36,36,36,32,36,36,32,36,36,32,36,46,34,32,120,32,32,32,32,36 db 32,36,36,32,36,36,96,32,96,36,32,36,36,32,36,36,36,32,36,36,13,10 db 32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,37,96,96,117,117,36,32,32,32,58 db 58,88,36,36,36,36,36,96,36,36,36,36,36,36,36,36,36,36,82,36,36,36,13,10 db 32,32,32,32,32,36,32,36,36,36,32,36,36,32,36,36,32,36,36,36,32,36,37,32,96,117,42,32,36,32,32,32 db 46,32,75,36,36,32,117,36,32,36,36,36,32,36,36,32,36,82,32,36,36,36,13,10 db 32,32,32,32,36,42,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,32,37,85,46,96,42,36,124,124,32,32 db 32,46,75,36,36,117,117,32,36,36,36,36,36,64,36,36,36,36,36,36,36,32,36,36,78,32,34,13,10 db 32,32,32,36,32,36,36,36,32,36,36,32,36,36,36,32,36,36,32,46,32,32,33,43,32,32,117,117,32,117,82,32 db 32,32,96,32,54,117,96,32,117,36,32,36,36,32,36,36,36,32,36,36,32,36,32,36,32,58,36,13,10 db 32,32,36,32,36,36,32,36,36,36,32,36,36,32,36,36,32,117,32,32,32,96,42,32,32,117,117,32,117,34,32,36 db 32,32,34,46,107,32,42,117,32,117,32,36,32,36,36,32,36,36,32,36,36,36,32,32,36,32,58,63,13,10 db 32,36,36,36,36,36,36,36,36,36,36,36,36,36,36,46,117,32,32,32,32,42,42,100,33,117,117,117,36,36,36,36 db 63,34,36,36,46,42,42,76,117,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,32,36,36,42,80,13,10 db 36,32,36,36,32,36,36,36,32,36,36,32,36,36,46,32,32,32,32,32,32,32,34,39,42,32,32,36,32,36,32,63 db 32,63,36,32,117,42,32,32,32,32,32,32,32,32,36,36,36,32,36,36,32,36,36,36,32,32,36,32,117,13,10 db 62,36,36,36,36,36,36,36,36,36,36,36,36,32,32,32,32,32,32,32,32,34,36,36,63,34,37,78,36,46,32,32 db 63,63,36,36,46,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,96,36,13,10 db 32,62,36,32,36,36,32,36,36,36,32,36,32,32,32,32,32,32,32,32,32,32,36,32,63,46,115,32,32,32,32,32 db 32,32,116,46,32,32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,32,36,36,32,36,13,10 db 32,32,62,36,32,36,36,36,32,36,36,32,32,32,32,32,32,32,32,32,32,32,32,58,78,32,46,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,32,36,36,32,36,36,36,32,36,13,10 db 32,32,62,62,36,36,36,36,36,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,62,36,32,36,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,32,117,13,10 db 32,32,32,32,32,62,36,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,13,10 db 32,32,32,32,32,32,99,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,13,10 db 0 rrGunRight db 32,32,32,32,32,32,32,32,32,32,32,32,42,39,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,32,34,36,63,80,117,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,42,42,46,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 db 32,32,32,32,32,78,58,58,42,42,117,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,64,64,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,42,42,82,82,63,63,36,36,36,36,36,36,120,120,32,32,32,32,32,36,36 db 36,36,32,32,32,32,32,32,32,96,96,13,10 db 32,32,32,32,32,32,32,32,32,32,32,42,42,46,100,63,63,36,36,36,36,36,36,36,120,36,36,36,36,36,36,82 db 36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,36,36,56,34,120,120,96,46,46,78,37,37,36,72,63,63,117,117,36,36,36,36,36,36,82 db 36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,64,36,56,78,78,117,96,46,46,32,117,117,36,36,36,36,117,117,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,101,64,78,42,117,34,46,46,32,117,117,36,36,36,36,56,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,117,13,10 db 32,32,32,32,32,32,32,32,34,46,96,42,42,34,46,46,32,33,36,36,36,36,36,117,117,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,117,13,10 db 32,32,32,32,32,32,32,32,34,109,37,37,42,42,36,46,32,32,32,32,32,32,96,96,36,36,36,36,36,64,36,36 db 36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,34,34,34,46,37,42,42,46,46,32,32,32,32,32,32,96,96,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,78,58,58,46,32,34,64,46,46,32,32,32,32,32,32,96,96,36,36,36,36,36,36,36,36 db 36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,96,37,78,58,32,32,32,34,34,46,36,36,117,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,96,117,64,58,32,32,32,34,63,36,39,117,117,36,36,36,36,117,117,32,117,117,13,10 db 32,32,32,32,32,32,96,117,32,82,36,32,32,96,55,36,36,36,117,36,36,36,36,117,117,96,117,117,13,10 db 32,32,32,32,32,32,34,46,32,42,46,46,42,117,36,36,36,36,36,36,36,36,36,117,117,42,42,76,13,10 db 32,32,32,32,32,32,42,32,32,34,46,46,82,117,117,36,36,36,58,88,75,75,36,54,107,42,42,13,10 db 32,32,32,32,32,32,117,32,32,34,34,117,82,111,111,32,32,58,58,46,46,32,96,46,46,42,42,13,10 db 32,32,32,32,34,36,36,63,36,120,46,46,117,117,32,32,32,32,32,32,32,32,34,34,36,117,117,13,10 db 32,32,32,32,34,36,36,63,36,36,100,100,120,120,32,32,32,32,32,32,32,32,34,36,36,36,46,13,10 db 32,32,32,32,36,36,36,117,78,36,117,36,36,120,53,36,36,124,82,82,36,36,63,63,36,42,46,13,10 db 32,32,32,94,36,36,36,117,96,36,36,46,34,117,117,42,36,124,117,34,36,36,63,63,63,116,13,10 db 32,32,32,94,36,36,36,117,34,36,36,46,96,96,117,42,42,117,117,36,36,13,10 db 32,32,34,36,36,36,36,36,36,36,36,117,96,96,46,96,117,117,117,36,36,46,13,10 db 32,32,42,36,36,36,36,36,36,36,36,37,37,85,46,32,117,117,32,36,36,46,13,10 db 32,96,36,36,36,36,36,36,36,36,36,36,37,43,43,32,117,117,32,37,78,13,10 db 32,42,36,36,36,36,36,36,36,36,36,36,32,33,42,100,33,42,34,37,115,13,10 db 32,42,36,36,36,36,36,36,36,36,36,111,32,96,42,100,39,63,63,46,46,13,10 db 32,36,36,36,36,36,36,36,36,36,36,46,32,32,42,34,58,36,63,78,13,10 db 32,36,36,36,36,36,36,36,36,36,36,32,32,32,32,34,36,36,58,13,10 db 96,36,36,36,36,36,36,36,36,36,117,13,10 db 96,36,36,36,36,36,36,36,36,36,117,13,10 db 34,36,36,36,36,36,36,36,36,36,46,13,10 db 43,36,36,36,36,36,36,36,36,36,46,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 42,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 36,36,36,36,36,36,36,36,36,36,13,10 db 62,62,62,62,62,62,62,62,62,99,13,10 db 0 rrGunUpRight db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,80,117,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,63,42,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,36,58,36,36,96,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,58,32,36,32,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,78,32,36,32,32,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,36,36,36,117,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,32,32,36,36,36,32,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,32,36,36,32,36,36,32,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,82,32,36,36,32,36,36,36,32,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,36,32,32,36,82,36,32,36,36,32,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,36,32,32,36,36,36,32,36,36,32,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,36,36,120,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,36,120,120,32,36,36,32,36,36,64,32,36,36,13,10 db 32,32,32,32,32,32,32,32,36,36,32,36,117,32,36,36,36,32,36,36,32,36,13,10 db 32,32,32,32,32,32,36,36,36,36,36,63,117,117,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,36,36,32,36,63,36,32,56,117,32,36,36,36,13,10 db 32,36,32,32,36,36,36,36,36,36,36,36,36,36,96,36,36,36,36,36,117,13,10 db 32,39,46,32,36,63,36,32,37,36,32,36,36,32,96,96,36,32,36,117,32,117,13,10 db 42,42,32,36,63,32,63,37,32,117,36,36,32,32,96,32,96,36,32,32,117,76,13,10 db 32,64,64,82,100,63,46,32,117,117,36,36,32,32,32,96,36,117,117,96,42,42,13,10 db 32,32,42,32,46,46,46,32,32,33,32,32,32,32,32,36,36,32,117,117,32,42,42,13,10 db 32,42,42,42,120,96,46,46,46,32,32,32,32,32,36,36,36,36,36,54,107,46,117,46,13,10 db 32,32,32,120,117,32,34,46,32,46,32,32,32,117,36,32,36,36,36,32,46,36,32,36,46,13,10 db 32,56,34,78,42,117,42,42,36,46,46,36,36,117,117,36,36,75,75,96,34,36,36,36,116,13,10 db 32,36,56,32,78,42,42,32,42,46,32,46,39,32,36,36,88,32,46,32,32,34,63,63,13,10 db 36,36,32,64,96,32,37,42,32,64,34,36,32,36,36,32,58,46,32,32,32,63,32,63,13,10 db 32,64,101,34,109,37,46,32,34,34,34,55,36,36,36,36,58,32,32,32,36,36,63,13,10 db 32,32,32,32,34,34,46,32,32,32,32,96,36,32,36,32,32,32,32,82,32,36,13,10 db 32,32,32,32,34,58,58,32,32,32,32,42,117,117,111,32,32,32,124,117,34,36,36,46,13,10 db 32,32,32,32,78,32,78,58,32,36,46,82,32,111,32,32,32,36,124,32,117,36,32,36,13,10 db 32,32,32,32,32,37,64,32,82,46,32,46,82,32,117,32,36,32,36,117,32,117,36,78,13,10 db 32,32,32,32,96,96,117,32,32,34,46,34,46,117,120,120,117,42,42,117,117,117,32,37,115,46,13,10 db 32,32,32,32,32,32,96,46,32,32,34,46,32,100,36,32,117,117,96,32,117,117,32,34,46,13,10 db 32,32,32,32,32,32,34,42,32,32,36,36,100,117,46,34,96,96,46,32,32,33,42,63,63,78,13,10 db 32,32,32,32,32,32,32,32,117,63,32,36,36,32,36,46,96,32,85,43,32,100,39,36,32,58,13,10 db 32,32,32,32,32,32,32,32,36,36,63,117,96,36,36,36,37,37,37,33,42,42,34,36,36,13,10 db 32,32,32,32,32,32,32,34,32,36,36,117,32,34,36,32,36,36,32,32,96,42,32,34,13,10 db 32,32,32,32,32,32,32,32,34,36,32,36,117,32,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,46,13,10 db 32,32,32,32,32,32,32,32,32,94,36,36,32,36,36,32,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,94,36,36,36,36,36,36,36,36,36,36,117,13,10 db 32,32,32,32,32,32,32,32,32,34,32,36,36,32,36,36,36,32,36,36,32,117,13,10 db 32,32,32,32,32,32,32,32,32,32,42,36,32,36,36,32,36,36,36,32,36,46,13,10 db 32,32,32,32,32,32,32,32,32,32,96,36,36,36,36,36,36,36,36,36,36,36,46,13,10 db 32,32,32,32,32,32,32,32,32,32,32,42,36,32,36,36,36,32,36,36,32,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,42,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,32,36,36,36,32,36,36,32,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,32,36,36,32,36,36,36,32,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,96,96,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,32,36,36,36,32,36,36,32,36,36,32,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,43,36,36,36,36,36,36,36,36,36,36,36,36,36,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,32,36,36,32,36,36,36,32,36,36,32,36,99,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,42,36,36,36,36,36,36,36,36,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,32,36,36,32,36,36,32,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,32,36,36,36,32,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,62,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,32,36,62,13,10 db 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,62,13,10 db 0 pokerReplaceText db "Поменять карту ",0 pokerReplaceTail db "? (y/n): ",0 pokerAIExchangeText db 13,10,"AI думает над обменом...",13,10,0 pokerRevealText db 13,10,"AI вскрывает покерную руку...",13,10,0 pokerYourComboText db "Твоя комбинация: ",0 pokerAIComboText db "Комбинация AI: ",0 pokerTableText db 13,10,"Карты на столе:",13,10,0 pokerHintText db "Подсказка: сейчас у тебя ",0 pokerDecisionText db "1 - играть, 2 - повысить ставку, 0 - фолд: ",0 pokerPotText db "Банк раунда: $",0 pokerBetText db "Твоя текущая ставка: $",0 pokerChipTitle db "Фишки:",13,10,0 pokerChipHigh db " [###]",13,10,0 pokerChipMid db " [===]",13,10,0 pokerChipLow db " [___]",13,10,0 pokerRaiseAskText db "На сколько повысить ставку: $",0 pokerRaisedText db "Ты повысил ставку. Новая ставка: $",0 pokerBadRaiseText db "Повышение должно быть больше 0 и не больше твоего банка.",13,10,0 pokerAICallRaiseText db 13,10,"AI отвечает на ставку.",13,10,0 pokerAIFoldRaiseText db 13,10,"AI не принимает повышение и делает фолд. Ты выиграл!",13,10,0 pokerHardIntroText db "Hard Poker: один раз можно заменить одну карманную карту.",13,10,0 pokerHardExchangeText db "Заменить карту? 1 - первую, 2 - вторую, 0 - не менять: ",0 pokerHardAIExchangeText db 13,10,"AI пересматривает карманные карты...",13,10,0 pokerAIRaiseText db 13,10,"AI повышает ставку на $",0 pokerCallRaiseText db "Ответить? 1 - колл, 0 - фолд: ",0 pokerPlayerCallText db "Ты ответил на повышение. Новая ставка: $",0 pokerFoldToRaiseText db 13,10,"Ты сбросил карты после повышения AI.",13,10,"Ты проиграл.",13,10,0 pokerFoldText db 13,10,"Ты сделал фолд.",13,10,"Ты проиграл.",13,10,0 pokerAIFoldText db 13,10,"AI сделал фолд. Ты выиграл!",13,10,0 pokerNextCardText db 13,10,"Открывается следующая карта...",13,10,0 pokerHighName db "Старшая карта",13,10,0 pokerPairName db "Пара",13,10,0 pokerTwoPairName db "Две пары",13,10,0 pokerTripsName db "Тройка",13,10,0 pokerStraightName db "Стрит",13,10,0 pokerFlushName db "Флеш",13,10,0 pokerFullHouseName db "Фулл хаус",13,10,0 pokerFourName db "Каре",13,10,0 pokerStraightFlushName db "Стрит-флеш",13,10,0 ; === Тексты и символы слот-машин === slotPullText db "Крутим барабаны...",13,10,0 slotLeft db "[ ",0 slotMid db " ] [ ",0 slotRight db " ]",13,10,0 slotJackpot db "Джекпот!",13,10,0 slotPair db "Комбинация сыграла!",13,10,0 slotPayoutText db "Выплата x",0 slotPayTableText db "Символы: LEM/CHR x2, CLV/BEL x3, DIA/BOX x5, 777 x7.",13,10 db "Комбинации: Гор.M/Верт.M/Диаг.M x1, Гор.L x2, Гор.XL x3",13,10 db "Вверх/Вниз x4, Небо/Земля x7, Глаз x8, Джекпот x10.",13,10,0 slotEmpty db "Не повезло.",13,10,0 slotComboText db "Комбинация: ",0 slotMultiplierText db "Множитель: x",0 slotTotalMultiplierText db "Итоговый множитель: x",0 slotComboHorM db "Гор. M",0 slotComboVertM db "Верт. M",0 slotComboDiagM db "Диаг. M",0 slotComboHorL db "Гор. L",0 slotComboHorXL db "Гор. XL",0 slotComboUp db "Вверх",0 slotComboDown db "Вниз",0 slotComboSky db "Небо",0 slotComboEarth db "Земля",0 slotComboEye db "Глаз",0 slotComboJackpot db "Джекпот",0 ; === Графика карт: рамки, строки, рубашки и переворот === cardTop db 0E2h, 094h, 08Ch, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 090h, 13,10,0 cardBottom db 0E2h, 094h, 094h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 098h, 13,10,0 cardEmpty db 0E2h, 094h, 082h, " ", 0E2h, 094h, 082h, 13,10,0 cardSuitLeft db 0E2h, 094h, 082h, " ", 0 cardSuitRight db " ", 0E2h, 094h, 082h, 13,10,0 cardRankOneL db 0E2h, 094h, 082h, " ", 0 cardRankOneR db " ", 0E2h, 094h, 082h, 13,10,0 cardRankTenL db 0E2h, 094h, 082h, " ", 0 cardRankTenR db " ", 0E2h, 094h, 082h, 13,10,0 cardCenterL db 0E2h, 094h, 082h, " ", 0 cardCenterR db " ", 0E2h, 094h, 082h, 13,10,0 cardTopSeg db 0E2h, 094h, 08Ch, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 090h, 0 cardBottomSeg db 0E2h, 094h, 094h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 080h, 0E2h, 094h, 098h, 0 cardEmptySeg db 0E2h, 094h, 082h, " ", 0E2h, 094h, 082h, 0 cardBackSeg db 0E2h, 094h, 082h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 096h, 091h, 0E2h, 094h, 082h, 0 cardBackBlueSeg db 0E2h, 094h, 082h, "~~*~~*~~*", 0E2h, 094h, 082h, 0 cardBackRedSeg db 0E2h, 094h, 082h, "XX+XX+XX+", 0E2h, 094h, 082h, 0 cardBackGoldSeg db 0E2h, 094h, 082h, "$*$*$*$*$", 0E2h, 094h, 082h, 0 cardBackSkullSeg db 0E2h, 094h, 082h, "|o",0E2h,098h,0A0h," v ",0E2h,098h,0A0h,"o|", 0E2h, 094h, 082h, 0 cardBackCloverSeg db 0E2h, 094h, 082h, "$+ ",0E2h,099h,0A3h,"$",0E2h,099h,0A3h," +$", 0E2h, 094h, 082h, 0 backGray1 db 0E2h,094h,082h,"+-+-+-+-+",0E2h,094h,082h,0 backGray2 db 0E2h,094h,082h,"|#|#|#|#|",0E2h,094h,082h,0 backGray3 db 0E2h,094h,082h,"+-+-+-+-+",0E2h,094h,082h,0 backGray4 db 0E2h,094h,082h,"|#|#|#|#|",0E2h,094h,082h,0 backGray5 db 0E2h,094h,082h,"+-+-+-+-+",0E2h,094h,082h,0 backBlue1 db 0E2h,094h,082h,"\\==*==//",0E2h,094h,082h,0 backBlue2 db 0E2h,094h,082h,"/ ___ /",0E2h,094h,082h,0 backBlue3 db 0E2h,094h,082h,"| (@@@) |",0E2h,094h,082h,0 backBlue4 db 0E2h,094h,082h,"/ ~~~ /",0E2h,094h,082h,0 backBlue5 db 0E2h,094h,082h,"//==*==//",0E2h,094h,082h,0 backRed1 db 0E2h,094h,082h,"ooooooooo",0E2h,094h,082h,0 backRed2 db 0E2h,094h,082h,"oXXXxXXXo",0E2h,094h,082h,0 backRed3 db 0E2h,094h,082h,"oXX---XXo",0E2h,094h,082h,0 backRed4 db 0E2h,094h,082h,"oXXXxXXXo",0E2h,094h,082h,0 backRed5 db 0E2h,094h,082h,"ooooooooo",0E2h,094h,082h,0 backGold1 db 0E2h,094h,082h,"{$*$$$*$}",0E2h,094h,082h,0 backGold2 db 0E2h,094h,082h,"*/^ $ ^/*",0E2h,094h,082h,0 backGold3 db 0E2h,094h,082h,"$ <@@@> $",0E2h,094h,082h,0 backGold4 db 0E2h,094h,082h,"*v/ $ /v*",0E2h,094h,082h,0 backGold5 db 0E2h,094h,082h,"{$*$$$*$}",0E2h,094h,082h,0 backSkull1 db 0E2h,094h,082h,"._.---._.",0E2h,094h,082h,0 backSkull2 db 0E2h,094h,082h,"/,(o o),\",0E2h,094h,082h,0 backSkull3 db 0E2h,094h,082h,"| ^ |",0E2h,094h,082h,0 backSkull4 db 0E2h,094h,082h,"\ '-=-' /",0E2h,094h,082h,0 backSkull5 db 0E2h,094h,082h,"~|==|==|~",0E2h,094h,082h,0 backClover1 db 0E2h,094h,082h,"+o+$$$+o+",0E2h,094h,082h,0 backClover2 db 0E2h,094h,082h,"o ",0E2h,098h,098h," + ",0E2h,098h,098h," o",0E2h,094h,082h,0 backClover3 db 0E2h,094h,082h,"$+ ",0E2h,099h,0A3h,"$",0E2h,099h,0A3h," +$",0E2h,094h,082h,0 backClover4 db 0E2h,094h,082h,"o ",0E2h,098h,098h," | ",0E2h,098h,098h," o",0E2h,094h,082h,0 backClover5 db 0E2h,094h,082h,"+o+$$$+o+",0E2h,094h,082h,0 backArcane1 db 0E2h,094h,082h,".~*~*~*~.",0E2h,094h,082h,0 backArcane2 db 0E2h,094h,082h,"/__~_~__\",0E2h,094h,082h,0 backArcane3 db 0E2h,094h,082h,"|_/\/\_ |",0E2h,094h,082h,0 backArcane4 db 0E2h,094h,082h,"| \_/\_/|",0E2h,094h,082h,0 backArcane5 db 0E2h,094h,082h,"'--===--'",0E2h,094h,082h,0 backNoir1 db 0E2h,094h,082h,"((\\_//))",0E2h,094h,082h,0 backNoir2 db 0E2h,094h,082h,"// | \\",0E2h,094h,082h,0 backNoir3 db 0E2h,094h,082h,"--(#*#)--",0E2h,094h,082h,0 backNoir4 db 0E2h,094h,082h,"\\__|__//",0E2h,094h,082h,0 backNoir5 db 0E2h,094h,082h,"((//~\\))",0E2h,094h,082h,0 backDiamond1 db 0E2h,094h,082h,"<><###><>",0E2h,094h,082h,0 backDiamond2 db 0E2h,094h,082h,"/\ /\",0E2h,094h,082h,0 backDiamond3 db 0E2h,094h,082h,"*$*",0E2h,094h,082h,0 backDiamond4 db 0E2h,094h,082h,"\/ \/",0E2h,094h,082h,0 backDiamond5 db 0E2h,094h,082h,"<><###><>",0E2h,094h,082h,0 backRider1 db 0E2h,094h,082h,".oO===Oo.",0E2h,094h,082h,0 backRider2 db 0E2h,094h,082h,"(/ .-. /)",0E2h,094h,082h,0 backRider3 db 0E2h,094h,082h,"o-( @ )-o",0E2h,094h,082h,0 backRider4 db 0E2h,094h,082h,"(/ '-' /)",0E2h,094h,082h,0 backRider5 db 0E2h,094h,082h,"'oO===Oo'",0E2h,094h,082h,0 backBee1 db 0E2h,094h,082h,"<>.<>.<>.",0E2h,094h,082h,0 backBee2 db 0E2h,094h,082h,".<>.<><>.",0E2h,094h,082h,0 backBee3 db 0E2h,094h,082h,"<> BEE <>",0E2h,094h,082h,0 backBee4 db 0E2h,094h,082h,".<>.<><>.",0E2h,094h,082h,0 backBee5 db 0E2h,094h,082h,"<>.<>.<>.",0E2h,094h,082h,0 backFan1 db 0E2h,094h,082h,"\\|/\\|//",0E2h,094h,082h,0 backFan2 db 0E2h,094h,082h," -\\|//- ",0E2h,094h,082h,0 backFan3 db 0E2h,094h,082h,"<(( o ))>",0E2h,094h,082h,0 backFan4 db 0E2h,094h,082h," -//|\\- ",0E2h,094h,082h,0 backFan5 db 0E2h,094h,082h,"//|/|/|\\",0E2h,094h,082h,0 backWeb1 db 0E2h,094h,082h,"\\..|..//",0E2h,094h,082h,0 backWeb2 db 0E2h,094h,082h,".\\.|.//.",0E2h,094h,082h,0 backWeb3 db 0E2h,094h,082h,"--(o-o)--",0E2h,094h,082h,0 backWeb4 db 0E2h,094h,082h,".//|.|\\.",0E2h,094h,082h,0 backWeb5 db 0E2h,094h,082h,"//''-''\\",0E2h,094h,082h,0 cardFlipLeft db 0E2h, 094h, 082h, " \ ", 0E2h, 094h, 082h, 0 cardFlipMid db 0E2h, 094h, 082h, " | ", 0E2h, 094h, 082h, 0 cardFlipRight db 0E2h, 094h, 082h, " / ", 0E2h, 094h, 082h, 0 cardSuitRightSeg db " ", 0E2h, 094h, 082h, 0 cardRankOneRSeg db " ", 0E2h, 094h, 082h, 0 cardRankTenRSeg db " ", 0E2h, 094h, 082h, 0 cardCenterRSeg db " ", 0E2h, 094h, 082h, 0 cardGap db " ",0 revealText db 13,10,"AI вскрывает карты...",13,10,0 rank2 db "2",0 rank3 db "3",0 rank4 db "4",0 rank5 db "5",0 rank6 db "6",0 rank7 db "7",0 rank8 db "8",0 rank9 db "9",0 rank10 db "10",0 rankJ db "J",0 rankQ db "Q",0 rankK db "K",0 rankA db "A",0 suitSpades db 0E2h, 099h, 0A0h, 0 suitHearts db 0E2h, 099h, 0A5h, 0 suitClubs db 0E2h, 099h, 0A3h, 0 suitDiamonds db 0E2h, 099h, 0A6h, 0 ranks dd OFFSET rank2, OFFSET rank3, OFFSET rank4, OFFSET rank5 dd OFFSET rank6, OFFSET rank7, OFFSET rank8, OFFSET rank9 dd OFFSET rank10, OFFSET rankJ, OFFSET rankQ, OFFSET rankK, OFFSET rankA suits dd OFFSET suitSpades, OFFSET suitHearts, OFFSET suitClubs, OFFSET suitDiamonds pokerNames dd OFFSET pokerHighName, OFFSET pokerPairName, OFFSET pokerTwoPairName dd OFFSET pokerTripsName, OFFSET pokerStraightName, OFFSET pokerFlushName dd OFFSET pokerFullHouseName, OFFSET pokerFourName, OFFSET pokerStraightFlushName slot0 db "CLV",0 slot1 db "LEM",0 slot2 db "CHR",0 slot3 db "BEL",0 slot4 db "DIA",0 slot5 db "BOX",0 slot6 db "777",0 slotSymbols dd OFFSET slot0, OFFSET slot1, OFFSET slot2 dd OFFSET slot3, OFFSET slot4, OFFSET slot5, OFFSET slot6 slotSymbolValues dd 3, 2, 2, 3, 5, 5, 7 classicSlot0 db "7",0 classicSlot1 db "BAR",0 classicSlot2 db "$",0 classicSlot3 db "*",0 classicSlot4 db "#",0 classicSlot5 db "A",0 classicSlotSymbols dd OFFSET classicSlot0, OFFSET classicSlot1, OFFSET classicSlot2 dd OFFSET classicSlot3, OFFSET classicSlot4, OFFSET classicSlot5 classicSlotPayTableText db "Классический слот 3x3. Выигрышная линия - средняя.",13,10 db "777 x10, $$$ x7, BAR x5, AAA x4, *** / ### x3, пара x2.",13,10,0 classicSlotJackpot db "Джекпот! Три одинаковых.",13,10,0 classicSlotPair db "Пара на линии!",13,10,0 classicSlotEmpty db "Не повезло.",13,10,0 classicSlotBorder db '+-----+-----+-----+',13,10,0 classicSlotPayline db '----- WIN LINE -----',13,10,0 ; === MCI-команды звуковых файлов === cardSoundClose db 'close cardsound',0 cardSoundOpen db 'open "assets\audio\playing_cards_deck_flick_through_001_20485.wav" type waveaudio alias cardsound',0 cardSoundPlay db 'play cardsound from 0',0 cardSoundStop db 'stop cardsound',0 slotSoundClose db 'close slotsound',0 slotSoundOpen db 'open "assets\audio\hKhoJArfEGAxxMewx0UQiddakTdBjFc.wav" type waveaudio alias slotsound',0 slotSoundPlay db 'play slotsound from 0',0 slotSoundStop db 'stop slotsound',0 slotIntroClose db 'close slotintro',0 slotIntroOpen db 'open "assets\audio\Летс гоу гэмблинг.wav" type waveaudio alias slotintro',0 slotIntroPlay db 'play slotintro from 0',0 slotIntroStop db 'stop slotintro',0 jackpotClose db 'close jackpotsound',0 jackpotOpen db 'open "assets\audio\Джэк пот.wav" type waveaudio alias jackpotsound',0 jackpotPlay db 'play jackpotsound from 0',0 jackpotStop db 'stop jackpotsound',0 hakariSoundClose db 'close hakarisound',0 hakariSoundOpen db 'open "assets\audio\hakari_dance.wav" type waveaudio alias hakarisound',0 hakariSoundPlay db 'play hakarisound from 0',0 hakariSoundStop db 'stop hakarisound',0 coinSoundClose db 'close coinsound',0 coinSoundOpen db 'open "assets\audio\Звук монеты брошенной в воздух и упавшей на поверхность.wav" type waveaudio alias coinsound',0 coinSoundPlay db 'play coinsound from 0',0 coinSoundStop db 'stop coinsound',0 bankruptClose db 'close bankruptsound',0 bankruptOpen db 'open "assets\audio\Проигрыш.wav" type waveaudio alias bankruptsound',0 bankruptPlay db 'play bankruptsound from 0',0 bankruptStop db 'stop bankruptsound',0 victoryClose db 'close victorysound',0 victoryOpen db 'open "assets\audio\victory-tf2.wav" type waveaudio alias victorysound',0 victoryPlay db 'play victorysound from 0',0 victoryStop db 'stop victorysound',0 rrSpinClose db 'close rrspinsound',0 rrSpinOpen db 'open "assets\audio\toy-gun-revolver-close-chamber-spin_f1ruc5nd.wav" type waveaudio alias rrspinsound',0 rrSpinPlay db 'play rrspinsound from 0',0 rrSpinStop db 'stop rrspinsound',0 rrDryClose db 'close rrdrysound',0 rrDryOpen db 'open "assets\audio\revolverdryfirec.wav" type waveaudio alias rrdrysound',0 rrDryPlay db 'play rrdrysound from 0',0 rrDryStop db 'stop rrdrysound',0 rrShotClose db 'close rrshotsound',0 rrShotOpen db 'open "assets\audio\b05e1ac8be34248.wav" type waveaudio alias rrshotsound',0 rrShotPlay db 'play rrshotsound from 0',0 rrShotStop db 'stop rrshotsound',0 casinoRouletteSoundClose db 'close casinoroulettesound',0 casinoRouletteSoundOpen db 'open "assets\audio\roulette-wheel-throw-2.wav" type waveaudio alias casinoroulettesound',0 casinoRouletteSoundPlay db 'play casinoroulettesound from 0',0 casinoRouletteSoundStop db 'stop casinoroulettesound',0 stoneSoundClose db 'close stonesound',0 stoneSoundOpen db 'open "assets\audio\moving-stone.wav" type waveaudio alias stonesound',0 stoneSoundPlay db 'play stonesound from 0',0 stoneSoundStop db 'stop stonesound',0 towerMusicClose db 'close towermusic',0 towerMusicStop db 'stop towermusic',0 towerMusicPlay db 'play towermusic repeat',0 towerMusicOpen1 db 'open "assets\music\tower\KEYGEN_CHURCH_-_Hareklavit_75543927.mp3" type mpegvideo alias towermusic',0 towerMusicOpen2 db 'open "assets\music\tower\KEYGEN_CHURCH_-_Ladikerfos_75543991.mp3" type mpegvideo alias towermusic',0 towerMusicOpen3 db 'open "assets\music\tower\Keygen_Church_-_Tenebre_Rosso_Sangue_ULTRAKILL_Original_Game_Soundtrack_79610890.mp3" type mpegvideo alias towermusic',0 towerMusicOpen4 db 'open "assets\music\tower\KEYGEN_CHURCH_-_Tilaskarot_75546826.mp3" type mpegvideo alias towermusic',0 slotBorder db '+-----+-----+-----+-----+-----+',13,10,0 slotWall db '|',0 slotWinLeft db '>',0 slotWinRight db '<',0 slotCellBlank db ' ',0 slotPadTwo db ' ',0 slotPadOne db ' ',0 skullSeg1 db 020h, 020h, 020h, 020h, 0E2h, 096h, 084h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 084h, 020h, 020h, 020h, 020h, 020h, 020h, 0 skullSeg2 db 020h, 020h, 0E2h, 096h, 084h, 0E2h, 096h, 088h, 0E2h, 096h, 080h, 020h, 0E2h, 096h, 084h, 0E2h, 096h, 084h, 020h, 0E2h, 096h, 080h, 0E2h, 096h, 088h, 0E2h, 096h, 084h, 020h, 020h, 020h, 020h, 0 skullSeg3 db 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 020h, 0 skullSeg4 db 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 0E2h, 096h, 080h, 020h, 020h, 0E2h, 096h, 080h, 020h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 020h, 0 skullSeg5 db 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 0E2h, 096h, 084h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 084h, 020h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 020h, 0 skullSeg6 db 020h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 0E2h, 096h, 080h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 080h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 020h, 020h, 0 skullSeg7 db 020h, 020h, 020h, 0E2h, 096h, 080h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 0E2h, 096h, 080h, 020h, 020h, 020h, 020h, 020h, 0 skullSeg8 db 020h, 020h, 020h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 0E2h, 096h, 088h, 0E2h, 096h, 088h, 020h, 020h, 020h, 020h, 020h, 020h, 0 skullNums db " [1] [2] [3]",13,10,0 skullBlankBall db 13,10,13,10,13,10,0 skullBall1 db " .***.",13,10," (* O *)",13,10," `***'",13,10,0 skullBall2 db " .***.",13,10," (* O *)",13,10," `***'",13,10,0 skullBall3 db " .***.",13,10," (* O *)",13,10," `***'",13,10,0 saveFileName db 64 dup(0) saveFullPath db 260 dup(0) saveDirPath db 260 dup(0) accountPatternFull db 260 dup(0) leaderSavePath db 260 dup(0) appDataReady dd 0 saveExt db '.dat',0 accountPattern db "*.dat",0 appDataEnvName db "APPDATA",0 appDataSubDir db "\AssemblerCasino",0 pathSlashText db "\",0 runtimeDir db "runtime",0 danceFileName db "assets\animations\hakari_dance.ans",0 casinoIntroFile db "assets\animations\casino_intro.ans",0 dbdHookFileName db "assets\animations\dbd_hook.ans",0 dbdHookCmd db "cmd /c start ""DBD Hook"" tools\preview_dbd_hook.bat",0 dbdHookStopFile db "runtime\dbd_hook.stop",0 animProfileFile db "runtime\anim_profile.txt",0 animProfileDigits db "012",0 ansiExitIntro db 1Bh,"[0m",1Bh,"[?25h",1Bh,"[2J",1Bh,"[H",0 accountList db 20 dup(64 dup(0)) findData db 320 dup(0) ; --- Umamusume Pretty Derby Data --- umaTitleText db 13,10,"=== UMAMUSUME PRETTY DERBY (СКАЧКИ) ===",13,10,0 umaMenuText db "Выберите вашу девчонку-лошадку:",13,10 db "1. Special Week (Специал Уик) - Коэф. x4 (Сбалансированная)",13,10 db "2. Silence Suzuka (Сайленс Судзука) - Коэф. x3 (Резвый старт)",13,10 db "3. Tokai Teio (Токай Тэйон) - Коэф. x5 (Финишный спурт)",13,10 db "4. Gold Ship (Голд Шип) - Коэф. x8 (Непредсказуемая!)",13,10 db "5. Mejiro McQueen (Мэдзиро Маккуин) - Коэф. x6 (Стайер)",13,10,0 umaChoiceText db "Ваш выбор (1-5): ",0 umaTrackHeader db 13,10,"--- ТРАССА ТРИУМФА ---",13,10,0 umaFinishText db " |FINISH|",13,10,0 umaHorse1Name db "1. Special Week : ",0 umaHorse2Name db "2. Silence Suzuka : ",0 umaHorse3Name db "3. Tokai Teio : ",0 umaHorse4Name db "4. Gold Ship : ",0 umaHorse5Name db "5. Mejiro McQueen : ",0 umaWinAnnouncement db 13,10,"Победитель скачек: ",0 umaYouWinText db " ПОБЕДА! Ваш выбор пришел первым! Вы выиграли $",0 umaYouLoseText db " Увы, ваш выбор не занял 1-е место. Удача улыбнется в следующий раз!",13,10,0 umaStepChar db "=",0 umaHeadChar db ">",0 umaHorseNames dd OFFSET umaHorse1Name, OFFSET umaHorse2Name, OFFSET umaHorse3Name, OFFSET umaHorse4Name, OFFSET umaHorse5Name umaMultipliers dd 4, 3, 5, 8, 6 umaPos dd 5 dup(0) umaChoice dd 0 umaWinner dd 0 .code ; --- PrintStr: вывод текста, цветов, картинок и элементов интерфейса --- PrintStr PROC uses eax ecx esi, pText:DWORD mov esi, pText xor ecx, ecx count_loop: cmp byte ptr [esi + ecx], 0 je count_done inc ecx jmp count_loop count_done: cmp ecx, 0 je print_done mov printLen, ecx invoke MultiByteToWideChar, 1251, 0, pText, printLen, ADDR wideBuffer, 4096 cmp eax, 0 je print_raw_fallback mov wideLen, eax invoke WriteConsoleW, hOut, ADDR wideBuffer, wideLen, ADDR charsWritten, 0 cmp eax, 0 jne print_done invoke WideCharToMultiByte, 65001, 0, ADDR wideBuffer, wideLen, ADDR utf8Buffer, 8192, 0, 0 cmp eax, 0 je print_raw_fallback invoke WriteFile, hOut, ADDR utf8Buffer, eax, ADDR charsWritten, 0 jmp print_done print_raw_fallback: invoke WriteFile, hOut, pText, printLen, ADDR charsWritten, 0 print_done: ret PrintStr ENDP ; --- PrintUtf8: вывод текста, цветов, картинок и элементов интерфейса --- PrintUtf8 PROC uses eax ecx esi, pText:DWORD mov esi, pText xor ecx, ecx utf8_count_loop: cmp byte ptr [esi + ecx], 0 je utf8_count_done inc ecx jmp utf8_count_loop utf8_count_done: cmp ecx, 0 je utf8_print_done mov printLen, ecx invoke MultiByteToWideChar, 65001, 0, pText, printLen, ADDR wideBuffer, 4096 cmp eax, 0 je utf8_raw_fallback mov wideLen, eax invoke WriteConsoleW, hOut, ADDR wideBuffer, wideLen, ADDR charsWritten, 0 cmp eax, 0 jne utf8_print_done invoke WriteFile, hOut, pText, printLen, ADDR charsWritten, 0 jmp utf8_print_done utf8_raw_fallback: invoke WriteFile, hOut, pText, printLen, ADDR charsWritten, 0 utf8_print_done: ret PrintUtf8 ENDP ; --- SetColor: вывод текста, цветов, картинок и элементов интерфейса --- SetColor PROC attr:DWORD invoke SetConsoleTextAttribute, hOut, attr ret SetColor ENDP ; --- ResetColor: вывод текста, цветов, картинок и элементов интерфейса --- ResetColor PROC invoke SetConsoleTextAttribute, hOut, COLOR_DEFAULT ret ResetColor ENDP ; --- EnableAnsi: вывод текста, цветов, картинок и элементов интерфейса --- EnableAnsi PROC uses eax invoke GetConsoleMode, hOut, ADDR consoleMode cmp eax, 0 je enable_ansi_done or consoleMode, ENABLE_VIRTUAL_TERMINAL_PROCESSING invoke SetConsoleMode, hOut, consoleMode enable_ansi_done: ret EnableAnsi ENDP ; --- SetSuitColor: карты, руки, очки и базовая карточная логика --- SetSuitColor PROC suitIndex:DWORD mov eax, suitIndex cmp eax, 1 je set_red_suit cmp eax, 3 je set_red_suit invoke SetColor, COLOR_CARD ret set_red_suit: invoke SetColor, COLOR_RED_CARD ret SetSuitColor ENDP ; --- SetCardBackColor: карты, руки, очки и базовая карточная логика --- SetCardBackColor PROC mov eax, shopBackStyle cmp eax, 1 je card_back_blue cmp eax, 2 je card_back_red cmp eax, 3 je card_back_gold cmp eax, 4 je card_back_skull cmp eax, 5 je card_back_clover cmp eax, 6 je card_back_arcane cmp eax, 7 je card_back_noir cmp eax, 8 je card_back_diamond cmp eax, 9 je card_back_rider cmp eax, 10 je card_back_bee cmp eax, 11 je card_back_fan cmp eax, 12 je card_back_web invoke SetColor, COLOR_BACK_CARD ret card_back_blue: invoke SetColor, COLOR_TITLE ret card_back_red: invoke SetColor, COLOR_BAD ret card_back_gold: invoke SetColor, COLOR_WARN ret card_back_skull: invoke SetColor, COLOR_BAD ret card_back_clover: invoke SetColor, COLOR_MONEY ret card_back_arcane: invoke SetColor, COLOR_TITLE ret card_back_noir: invoke SetColor, COLOR_CARD ret card_back_diamond: invoke SetColor, COLOR_TITLE ret card_back_rider: invoke SetColor, COLOR_WARN ret card_back_bee: invoke SetColor, COLOR_WARN ret card_back_fan: invoke SetColor, COLOR_TITLE ret card_back_web: invoke SetColor, COLOR_CARD ret SetCardBackColor ENDP ; --- PrintCardBackSegLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintCardBackSegLine PROC lineNo:DWORD mov eax, shopBackStyle cmp eax, 1 je back_line_blue cmp eax, 2 je back_line_red cmp eax, 3 je back_line_gold cmp eax, 4 je back_line_skull cmp eax, 5 je back_line_clover cmp eax, 6 je back_line_arcane cmp eax, 7 je back_line_noir cmp eax, 8 je back_line_diamond cmp eax, 9 je back_line_rider cmp eax, 10 je back_line_bee cmp eax, 11 je back_line_fan cmp eax, 12 je back_line_web back_line_gray: mov eax, lineNo cmp eax, 1 je back_gray_1 cmp eax, 2 je back_gray_2 cmp eax, 3 je back_gray_3 cmp eax, 4 je back_gray_4 invoke PrintUtf8, OFFSET backGray5 ret back_gray_1: invoke PrintUtf8, OFFSET backGray1 ret back_gray_2: invoke PrintUtf8, OFFSET backGray2 ret back_gray_3: invoke PrintUtf8, OFFSET backGray3 ret back_gray_4: invoke PrintUtf8, OFFSET backGray4 ret back_line_blue: mov eax, lineNo cmp eax, 1 je back_blue_1 cmp eax, 2 je back_blue_2 cmp eax, 3 je back_blue_3 cmp eax, 4 je back_blue_4 invoke PrintUtf8, OFFSET backBlue5 ret back_blue_1: invoke PrintUtf8, OFFSET backBlue1 ret back_blue_2: invoke PrintUtf8, OFFSET backBlue2 ret back_blue_3: invoke PrintUtf8, OFFSET backBlue3 ret back_blue_4: invoke PrintUtf8, OFFSET backBlue4 ret back_line_red: mov eax, lineNo cmp eax, 1 je back_red_1 cmp eax, 2 je back_red_2 cmp eax, 3 je back_red_3 cmp eax, 4 je back_red_4 invoke PrintUtf8, OFFSET backRed5 ret back_red_1: invoke PrintUtf8, OFFSET backRed1 ret back_red_2: invoke PrintUtf8, OFFSET backRed2 ret back_red_3: invoke PrintUtf8, OFFSET backRed3 ret back_red_4: invoke PrintUtf8, OFFSET backRed4 ret back_line_gold: mov eax, lineNo cmp eax, 1 je back_gold_1 cmp eax, 2 je back_gold_2 cmp eax, 3 je back_gold_3 cmp eax, 4 je back_gold_4 invoke PrintUtf8, OFFSET backGold5 ret back_gold_1: invoke PrintUtf8, OFFSET backGold1 ret back_gold_2: invoke PrintUtf8, OFFSET backGold2 ret back_gold_3: invoke PrintUtf8, OFFSET backGold3 ret back_gold_4: invoke PrintUtf8, OFFSET backGold4 ret back_line_skull: mov eax, lineNo cmp eax, 1 je back_skull_1 cmp eax, 2 je back_skull_2 cmp eax, 3 je back_skull_3 cmp eax, 4 je back_skull_4 invoke PrintUtf8, OFFSET backSkull5 ret back_skull_1: invoke PrintUtf8, OFFSET backSkull1 ret back_skull_2: invoke PrintUtf8, OFFSET backSkull2 ret back_skull_3: invoke PrintUtf8, OFFSET backSkull3 ret back_skull_4: invoke PrintUtf8, OFFSET backSkull4 ret back_line_clover: mov eax, lineNo cmp eax, 1 je back_clover_1 cmp eax, 2 je back_clover_2 cmp eax, 3 je back_clover_3 cmp eax, 4 je back_clover_4 invoke PrintUtf8, OFFSET backClover5 ret back_clover_1: invoke PrintUtf8, OFFSET backClover1 ret back_clover_2: invoke PrintUtf8, OFFSET backClover2 ret back_clover_3: invoke PrintUtf8, OFFSET backClover3 ret back_clover_4: invoke PrintUtf8, OFFSET backClover4 ret back_line_arcane: mov eax, lineNo cmp eax, 1 je back_arcane_1 cmp eax, 2 je back_arcane_2 cmp eax, 3 je back_arcane_3 cmp eax, 4 je back_arcane_4 invoke PrintUtf8, OFFSET backArcane5 ret back_arcane_1: invoke PrintUtf8, OFFSET backArcane1 ret back_arcane_2: invoke PrintUtf8, OFFSET backArcane2 ret back_arcane_3: invoke PrintUtf8, OFFSET backArcane3 ret back_arcane_4: invoke PrintUtf8, OFFSET backArcane4 ret back_line_noir: mov eax, lineNo cmp eax, 1 je back_noir_1 cmp eax, 2 je back_noir_2 cmp eax, 3 je back_noir_3 cmp eax, 4 je back_noir_4 invoke PrintUtf8, OFFSET backNoir5 ret back_noir_1: invoke PrintUtf8, OFFSET backNoir1 ret back_noir_2: invoke PrintUtf8, OFFSET backNoir2 ret back_noir_3: invoke PrintUtf8, OFFSET backNoir3 ret back_noir_4: invoke PrintUtf8, OFFSET backNoir4 ret back_line_diamond: mov eax, lineNo cmp eax, 1 je back_diamond_1 cmp eax, 2 je back_diamond_2 cmp eax, 3 je back_diamond_3 cmp eax, 4 je back_diamond_4 invoke PrintUtf8, OFFSET backDiamond5 ret back_diamond_1: invoke PrintUtf8, OFFSET backDiamond1 ret back_diamond_2: invoke PrintUtf8, OFFSET backDiamond2 ret back_diamond_3: invoke PrintUtf8, OFFSET backDiamond3 ret back_diamond_4: invoke PrintUtf8, OFFSET backDiamond4 ret back_line_rider: mov eax, lineNo cmp eax, 1 je back_rider_1 cmp eax, 2 je back_rider_2 cmp eax, 3 je back_rider_3 cmp eax, 4 je back_rider_4 invoke PrintUtf8, OFFSET backRider5 ret back_rider_1: invoke PrintUtf8, OFFSET backRider1 ret back_rider_2: invoke PrintUtf8, OFFSET backRider2 ret back_rider_3: invoke PrintUtf8, OFFSET backRider3 ret back_rider_4: invoke PrintUtf8, OFFSET backRider4 ret back_line_bee: mov eax, lineNo cmp eax, 1 je back_bee_1 cmp eax, 2 je back_bee_2 cmp eax, 3 je back_bee_3 cmp eax, 4 je back_bee_4 invoke PrintUtf8, OFFSET backBee5 ret back_bee_1: invoke PrintUtf8, OFFSET backBee1 ret back_bee_2: invoke PrintUtf8, OFFSET backBee2 ret back_bee_3: invoke PrintUtf8, OFFSET backBee3 ret back_bee_4: invoke PrintUtf8, OFFSET backBee4 ret back_line_fan: mov eax, lineNo cmp eax, 1 je back_fan_1 cmp eax, 2 je back_fan_2 cmp eax, 3 je back_fan_3 cmp eax, 4 je back_fan_4 invoke PrintUtf8, OFFSET backFan5 ret back_fan_1: invoke PrintUtf8, OFFSET backFan1 ret back_fan_2: invoke PrintUtf8, OFFSET backFan2 ret back_fan_3: invoke PrintUtf8, OFFSET backFan3 ret back_fan_4: invoke PrintUtf8, OFFSET backFan4 ret back_line_web: mov eax, lineNo cmp eax, 1 je back_web_1 cmp eax, 2 je back_web_2 cmp eax, 3 je back_web_3 cmp eax, 4 je back_web_4 invoke PrintUtf8, OFFSET backWeb5 ret back_web_1: invoke PrintUtf8, OFFSET backWeb1 ret back_web_2: invoke PrintUtf8, OFFSET backWeb2 ret back_web_3: invoke PrintUtf8, OFFSET backWeb3 ret back_web_4: invoke PrintUtf8, OFFSET backWeb4 ret PrintCardBackSegLine ENDP ; --- PrintCardBackSeg: вывод текста, цветов, картинок и элементов интерфейса --- PrintCardBackSeg PROC invoke PrintCardBackSegLine, 3 ret PrintCardBackSeg ENDP ; --- PrintSuit: вывод текста, цветов, картинок и элементов интерфейса --- PrintSuit PROC uses eax, suitIndex:DWORD invoke SetSuitColor, suitIndex mov eax, suitIndex invoke PrintUtf8, suits[eax * 4] call ResetColor ret PrintSuit ENDP ; --- PrintMoney: вывод текста, цветов, картинок и элементов интерфейса --- PrintMoney PROC value:DWORD invoke SetColor, COLOR_MONEY invoke PrintUInt, value call ResetColor ret PrintMoney ENDP ; --- PrintTitleColor: вывод текста, цветов, картинок и элементов интерфейса --- PrintTitleColor PROC pText:DWORD invoke SetColor, COLOR_TITLE invoke PrintStr, pText call ResetColor ret PrintTitleColor ENDP ; --- ColorPrint: вывод текста, цветов, картинок и элементов интерфейса --- ColorPrint PROC pText:DWORD, attr:DWORD invoke SetColor, attr invoke PrintStr, pText call ResetColor ret ColorPrint ENDP ; --- PrintWinEvent: вывод текста, цветов, картинок и элементов интерфейса --- PrintWinEvent PROC invoke ColorPrint, OFFSET winText, COLOR_MONEY ret PrintWinEvent ENDP ; --- PrintLoseEvent: вывод текста, цветов, картинок и элементов интерфейса --- PrintLoseEvent PROC invoke ColorPrint, OFFSET loseText, COLOR_BAD ret PrintLoseEvent ENDP ; --- PrintDrawEvent: вывод текста, цветов, картинок и элементов интерфейса --- PrintDrawEvent PROC invoke ColorPrint, OFFSET drawText, COLOR_WARN ret PrintDrawEvent ENDP ; --- PrintCroupierFromList: вывод текста, цветов, картинок и элементов интерфейса --- PrintCroupierFromList PROC uses eax ebx, pList:DWORD invoke RandomRange, 3 shl eax, 2 mov ebx, pList add ebx, eax invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET croupierPrefix invoke PrintStr, DWORD PTR [ebx] call ResetColor ret PrintCroupierFromList ENDP ; --- DealerProcessLine: служебный блок игровой логики --- DealerProcessLine PROC uses eax edx mov eax, dealerLineLen cmp eax, 3 jb dealer_process_done mov al, byte ptr [frameBuffer] cmp al, dealerWantedTag jne dealer_process_done cmp byte ptr [frameBuffer+1], '|' jne dealer_process_done cmp dealerScanMode, 0 jne dealer_process_select inc dealerPhraseCount ret dealer_process_select: mov eax, dealerPhraseCount cmp eax, dealerPhrasePick jne dealer_process_next mov eax, OFFSET frameBuffer add eax, dealerLineLen mov byte ptr [eax], 0 invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET croupierPrefix mov edx, OFFSET frameBuffer add edx, 2 invoke PrintStr, edx invoke PrintStr, OFFSET nl call ResetColor mov dealerPhrasePick, 0FFFFFFFFh dealer_process_next: inc dealerPhraseCount dealer_process_done: ret DealerProcessLine ENDP ; --- DealerScanFile: служебный блок игровой логики --- DealerScanFile PROC uses eax edx, mode:DWORD mov eax, mode mov dealerScanMode, eax mov dealerLineLen, 0 invoke CreateFileA, OFFSET dealerFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE jne dealer_scan_opened xor eax, eax ret dealer_scan_opened: mov dealerFileHandle, eax dealer_scan_loop: invoke ReadFile, dealerFileHandle, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je dealer_scan_eof mov al, byte ptr inputBuffer cmp al, 13 je dealer_scan_loop cmp al, 10 je dealer_scan_line_end mov edx, dealerLineLen cmp edx, 32760 jae dealer_scan_loop mov byte ptr [frameBuffer + edx], al inc dealerLineLen jmp dealer_scan_loop dealer_scan_line_end: call DealerProcessLine mov dealerLineLen, 0 jmp dealer_scan_loop dealer_scan_eof: cmp dealerLineLen, 0 je dealer_scan_close call DealerProcessLine dealer_scan_close: invoke CloseHandle, dealerFileHandle mov eax, 1 ret DealerScanFile ENDP ; --- PrintCroupierFromFile: вывод текста, цветов, картинок и элементов интерфейса --- PrintCroupierFromFile PROC uses eax, wanted:DWORD, pFallback:DWORD mov eax, wanted mov dealerWantedTag, al mov dealerPhraseCount, 0 invoke DealerScanFile, 0 cmp eax, 0 je croupier_file_fallback cmp dealerPhraseCount, 0 je croupier_file_fallback invoke RandomRange, dealerPhraseCount mov dealerPhrasePick, eax mov dealerPhraseCount, 0 invoke DealerScanFile, 1 ret croupier_file_fallback: invoke PrintCroupierFromList, pFallback ret PrintCroupierFromFile ENDP ; --- PrintCroupierWin: вывод текста, цветов, картинок и элементов интерфейса --- PrintCroupierWin PROC invoke PrintCroupierFromFile, 'W', OFFSET croupierWinList ret PrintCroupierWin ENDP ; --- PrintCroupierLose: вывод текста, цветов, картинок и элементов интерфейса --- PrintCroupierLose PROC invoke PrintCroupierFromFile, 'L', OFFSET croupierLoseList ret PrintCroupierLose ENDP ; --- PrintCroupierDraw: вывод текста, цветов, картинок и элементов интерфейса --- PrintCroupierDraw PROC invoke PrintCroupierFromFile, 'D', OFFSET croupierDrawList ret PrintCroupierDraw ENDP ; --- FlushFrame: звук, интро или покадровая анимация --- FlushFrame PROC uses eax ebx ecx edx esi edi LOCAL csbi[22]:BYTE LOCAL X_start:DWORD LOCAL Y_start:DWORD LOCAL nextLinePtr:DWORD LOCAL currentLineIndex:DWORD cmp frameBytes, 0 je flush_frame_done mov eax, OFFSET frameBuffer add eax, frameBytes mov byte ptr [eax], 0 cmp animWidth, 0 je print_default cmp animHeight, 0 je print_default call ClearView lea eax, csbi invoke GetConsoleScreenBufferInfo, hOut, eax cmp eax, 0 je print_default movzx ecx, word ptr csbi[14] movzx esi, word ptr csbi[10] sub ecx, esi inc ecx movzx edx, word ptr csbi[16] movzx esi, word ptr csbi[12] sub edx, esi inc edx mov eax, ecx cmp eax, animWidth jbe set_x_left sub eax, animWidth shr eax, 1 add ax, word ptr csbi[10] movzx eax, ax mov X_start, eax jmp x_calculated set_x_left: movzx eax, word ptr csbi[10] mov X_start, eax x_calculated: mov eax, edx cmp eax, animHeight jbe set_y_top sub eax, animHeight shr eax, 1 add ax, word ptr csbi[12] movzx eax, ax mov Y_start, eax jmp y_calculated set_y_top: movzx eax, word ptr csbi[12] mov Y_start, eax y_calculated: mov esi, OFFSET frameBuffer skip_lead_loop: cmp byte ptr [esi], 1Bh jne check_lead_newline cmp byte ptr [esi+1], '[' jne check_lead_newline cmp byte ptr [esi+2], '2' jne check_lead_H cmp byte ptr [esi+3], 'J' jne check_lead_newline add esi, 4 jmp skip_lead_loop check_lead_H: cmp byte ptr [esi+2], 'H' jne check_lead_hide add esi, 3 jmp skip_lead_loop check_lead_hide: cmp byte ptr [esi+2], '?' jne check_lead_newline cmp byte ptr [esi+3], '2' jne check_lead_newline cmp byte ptr [esi+4], '5' jne check_lead_newline cmp byte ptr [esi+5], 'l' jne check_lead_show add esi, 6 jmp skip_lead_loop check_lead_show: cmp byte ptr [esi+5], 'h' jne check_lead_newline add esi, 6 jmp skip_lead_loop check_lead_newline: mov al, [esi] cmp al, 0Dh je skip_lead_nl_char cmp al, 0Ah je skip_lead_nl_char jmp done_lead_skipping skip_lead_nl_char: inc esi jmp skip_lead_loop done_lead_skipping: mov currentLineIndex, 0 line_parse_loop: cmp byte ptr [esi], 0 je print_done mov edi, esi find_line_end: mov al, [edi] cmp al, 0 je line_end_found cmp al, 0Dh je line_end_found cmp al, 0Ah je line_end_found inc edi jmp find_line_end line_end_found: mov dl, [edi] mov byte ptr [edi], 0 mov ebx, edi cmp dl, 0 je next_line_ptr_done inc ebx mov al, [ebx] cmp al, 0Dh je skip_nl_chars cmp al, 0Ah je skip_nl_chars jmp next_line_ptr_done skip_nl_chars: inc ebx mov al, [ebx] cmp al, 0Dh je skip_nl_chars cmp al, 0Ah je skip_nl_chars next_line_ptr_done: mov nextLinePtr, ebx mov eax, currentLineIndex add eax, Y_start movzx edx, word ptr csbi[16] cmp eax, edx jg skip_this_line invoke MoveCursor, X_start, eax invoke PrintUtf8, esi skip_this_line: mov esi, nextLinePtr inc currentLineIndex jmp line_parse_loop print_default: invoke PrintUtf8, OFFSET frameBuffer print_done: mov frameBytes, 0 flush_frame_done: ret FlushFrame ENDP ; --- PlayHakariDance: звук, интро или покадровая анимация --- PlayHakariDance PROC uses eax ebx ecx edx esi edi mov animWidth, 118 mov animHeight, 43 invoke CreateFileA, OFFSET danceFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE jne hakari_file_ok invoke mciSendStringA, OFFSET hakariSoundStop, 0, 0, 0 mov animWidth, 0 mov animHeight, 0 ret hakari_file_ok: mov danceHandle, eax mov frameBytes, 0 mov animFrameCounter, 0 hakari_read_loop: invoke ReadFile, danceHandle, ADDR inputBuffer, 1, ADDR danceBytes, 0 cmp danceBytes, 0 je hakari_finish mov al, byte ptr inputBuffer cmp al, 0Ch je hakari_show_frame mov edx, frameBytes cmp edx, 32760 jae hakari_show_frame_keep_char mov [frameBuffer + edx], al inc frameBytes jmp hakari_read_loop hakari_show_frame_keep_char: call ClearView call FlushFrame invoke AnimFrameDelay, 12 invoke Sleep, eax mov al, byte ptr inputBuffer mov [frameBuffer], al mov frameBytes, 1 jmp hakari_read_loop hakari_show_frame: call AnimShouldDrawFrame cmp eax, 1 jne hakari_skip_frame call ClearView call FlushFrame invoke AnimFrameDelay, 12 invoke Sleep, eax jmp hakari_read_loop hakari_skip_frame: mov frameBytes, 0 jmp hakari_read_loop hakari_finish: call ClearView call FlushFrame invoke CloseHandle, danceHandle invoke mciSendStringA, OFFSET hakariSoundStop, 0, 0, 0 invoke Sleep, 40 call ClearView mov animWidth, 0 mov animHeight, 0 ret PlayHakariDance ENDP ; --- WriteAnimProfileFile: shares animation profile with helper windows --- WriteAnimProfileFile PROC uses eax ebx edx invoke CreateFileA, OFFSET animProfileFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je write_anim_profile_done mov ebx, eax mov edx, settingsLowSpec cmp edx, 2 jbe write_anim_profile_value_ok xor edx, edx write_anim_profile_value_ok: mov al, byte ptr [animProfileDigits + edx] mov byte ptr [inputBuffer], al invoke WriteFile, ebx, ADDR inputBuffer, 1, ADDR charsWritten, 0 invoke CloseHandle, ebx write_anim_profile_done: ret WriteAnimProfileFile ENDP ; --- PlayDbDHookScene: покадровая анимация крюка из Dead by Daylight --- PlayDbDHookScene PROC uses eax cmp settingsDbdWindowEnabled, 1 jne play_dbd_done invoke WinExec, OFFSET dbdHookCmd, 1 play_dbd_done: ret PlayDbDHookScene ENDP ; --- StopDbDHookScene: закрывает отдельное окно DBD-анимации через файл-сигнал --- StopDbDHookScene PROC uses eax invoke CreateFileA, OFFSET dbdHookStopFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je stop_dbd_done invoke CloseHandle, eax stop_dbd_done: ret StopDbDHookScene ENDP ; --- IntroMaybeLoopMarker: звук, интро или покадровая анимация --- IntroMaybeLoopMarker PROC cmp frameBytes, 10 jne intro_marker_no cmp byte ptr [frameBuffer], '@' jne intro_marker_no cmp byte ptr [frameBuffer+1], '@' jne intro_marker_no cmp byte ptr [frameBuffer+2], 'L' jne intro_marker_no cmp byte ptr [frameBuffer+3], 'O' jne intro_marker_no cmp byte ptr [frameBuffer+4], 'O' jne intro_marker_no cmp byte ptr [frameBuffer+5], 'P' jne intro_marker_no cmp byte ptr [frameBuffer+6], '@' jne intro_marker_no cmp byte ptr [frameBuffer+7], '@' jne intro_marker_no mov introLoopSeen, 1 mov introSkipLoop, 0 mov frameBytes, 0 mov eax, 1 ret intro_marker_no: xor eax, eax ret IntroMaybeLoopMarker ENDP ; --- IntroHandleFrameEnd: звук, интро или покадровая анимация --- IntroHandleFrameEnd PROC call IntroMaybeLoopMarker cmp eax, 1 je intro_handle_done cmp introSkipLoop, 1 je intro_discard_frame call AnimShouldDrawFrame cmp eax, 1 jne intro_discard_frame call FlushFrame invoke AnimFrameDelay, 45 invoke Sleep, eax ret intro_discard_frame: mov frameBytes, 0 intro_handle_done: ret IntroHandleFrameEnd ENDP ; --- PlayCasinoIntro: звук, интро или покадровая анимация --- PlayCasinoIntro PROC uses eax ebx ecx edx esi edi cmp settingsIntroEnabled, 1 jne intro_disabled mov introLoopSeen, 0 mov introSkipLoop, 0 mov animFrameCounter, 0 mov animWidth, 64 mov animHeight, 21 intro_restart_file: invoke CreateFileA, OFFSET casinoIntroFile, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE jne intro_file_ok mov animWidth, 0 mov animHeight, 0 ret intro_file_ok: mov danceHandle, eax mov frameBytes, 0 intro_read_loop: invoke GetAsyncKeyState, VK_RETURN test ax, 8000h jnz intro_exit invoke ReadFile, danceHandle, ADDR inputBuffer, 1, ADDR danceBytes, 0 cmp danceBytes, 0 je intro_restart_cycle mov al, byte ptr inputBuffer cmp al, 0Ch je intro_show_frame mov edx, frameBytes cmp edx, 32760 jae intro_show_frame_keep_char mov [frameBuffer + edx], al inc frameBytes jmp intro_read_loop intro_show_frame_keep_char: call IntroHandleFrameEnd mov al, byte ptr inputBuffer mov [frameBuffer], al mov frameBytes, 1 jmp intro_read_loop intro_show_frame: call IntroHandleFrameEnd jmp intro_read_loop intro_restart_cycle: call FlushFrame invoke CloseHandle, danceHandle cmp introLoopSeen, 1 jne intro_restart_file mov introSkipLoop, 1 jmp intro_restart_file intro_exit: invoke CloseHandle, danceHandle invoke PrintUtf8, OFFSET ansiExitIntro invoke Sleep, 180 intro_disabled: mov animWidth, 0 mov animHeight, 0 ret PlayCasinoIntro ENDP ; --- InitSounds: служебный блок игровой логики --- InitSounds PROC uses eax ecx edx invoke mciSendStringA, OFFSET cardSoundClose, 0, 0, 0 invoke mciSendStringA, OFFSET cardSoundOpen, 0, 0, 0 invoke mciSendStringA, OFFSET slotSoundClose, 0, 0, 0 invoke mciSendStringA, OFFSET slotSoundOpen, 0, 0, 0 invoke mciSendStringA, OFFSET slotIntroClose, 0, 0, 0 invoke mciSendStringA, OFFSET slotIntroOpen, 0, 0, 0 invoke mciSendStringA, OFFSET jackpotClose, 0, 0, 0 invoke mciSendStringA, OFFSET jackpotOpen, 0, 0, 0 invoke mciSendStringA, OFFSET hakariSoundClose, 0, 0, 0 invoke mciSendStringA, OFFSET hakariSoundOpen, 0, 0, 0 invoke mciSendStringA, OFFSET coinSoundClose, 0, 0, 0 invoke mciSendStringA, OFFSET coinSoundOpen, 0, 0, 0 invoke mciSendStringA, OFFSET bankruptClose, 0, 0, 0 invoke mciSendStringA, OFFSET bankruptOpen, 0, 0, 0 invoke mciSendStringA, OFFSET victoryClose, 0, 0, 0 invoke mciSendStringA, OFFSET victoryOpen, 0, 0, 0 invoke mciSendStringA, OFFSET rrSpinClose, 0, 0, 0 invoke mciSendStringA, OFFSET rrSpinOpen, 0, 0, 0 invoke mciSendStringA, OFFSET rrDryClose, 0, 0, 0 invoke mciSendStringA, OFFSET rrDryOpen, 0, 0, 0 invoke mciSendStringA, OFFSET rrShotClose, 0, 0, 0 invoke mciSendStringA, OFFSET rrShotOpen, 0, 0, 0 invoke mciSendStringA, OFFSET casinoRouletteSoundClose, 0, 0, 0 invoke mciSendStringA, OFFSET casinoRouletteSoundOpen, 0, 0, 0 invoke mciSendStringA, OFFSET stoneSoundClose, 0, 0, 0 invoke mciSendStringA, OFFSET stoneSoundOpen, 0, 0, 0 ret InitSounds ENDP ; --- PlayCardSound: звук, интро или покадровая анимация --- PlayCardSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET cardSoundStop, 0, 0, 0 invoke mciSendStringA, OFFSET cardSoundPlay, 0, 0, 0 invoke Sleep, 90 ret PlayCardSound ENDP ; --- PlaySlotSound: звук, интро или покадровая анимация --- PlaySlotSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET slotSoundStop, 0, 0, 0 invoke mciSendStringA, OFFSET slotSoundPlay, 0, 0, 0 ret PlaySlotSound ENDP ; --- PlaySlotIntroSound: звук, интро или покадровая анимация --- PlaySlotIntroSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET slotIntroStop, 0, 0, 0 invoke mciSendStringA, OFFSET slotIntroPlay, 0, 0, 0 ret PlaySlotIntroSound ENDP ; --- PlayJackpotSound: звук, интро или покадровая анимация --- PlayJackpotSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET jackpotStop, 0, 0, 0 invoke mciSendStringA, OFFSET jackpotPlay, 0, 0, 0 ret PlayJackpotSound ENDP ; --- PlayHakariSound: звук, интро или покадровая анимация --- PlayHakariSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET hakariSoundStop, 0, 0, 0 invoke mciSendStringA, OFFSET hakariSoundPlay, 0, 0, 0 ret PlayHakariSound ENDP ; --- PlayCoinSound: звук, интро или покадровая анимация --- PlayCoinSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET coinSoundStop, 0, 0, 0 invoke mciSendStringA, OFFSET coinSoundPlay, 0, 0, 0 ret PlayCoinSound ENDP ; --- PlayBankruptSound: звук, интро или покадровая анимация --- PlayBankruptSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET bankruptStop, 0, 0, 0 invoke mciSendStringA, OFFSET bankruptPlay, 0, 0, 0 ret PlayBankruptSound ENDP ; --- PlayVictorySound: звук, интро или покадровая анимация --- PlayVictorySound PROC uses eax ecx edx invoke mciSendStringA, OFFSET victoryStop, 0, 0, 0 invoke mciSendStringA, OFFSET victoryPlay, 0, 0, 0 ret PlayVictorySound ENDP ; --- PlayCasinoRouletteSound: звук, интро или покадровая анимация --- PlayCasinoRouletteSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET casinoRouletteSoundStop, 0, 0, 0 invoke mciSendStringA, OFFSET casinoRouletteSoundPlay, 0, 0, 0 ret PlayCasinoRouletteSound ENDP ; --- PlayRouletteSpinSound: звук, интро или покадровая анимация --- PlayRouletteSpinSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET rrSpinStop, 0, 0, 0 invoke mciSendStringA, OFFSET rrSpinPlay, 0, 0, 0 ret PlayRouletteSpinSound ENDP ; --- PlayRouletteDrySound: звук, интро или покадровая анимация --- PlayRouletteDrySound PROC uses eax ecx edx invoke mciSendStringA, OFFSET rrDryStop, 0, 0, 0 invoke mciSendStringA, OFFSET rrDryPlay, 0, 0, 0 ret PlayRouletteDrySound ENDP ; --- PlayRouletteShotSound: звук, интро или покадровая анимация --- PlayRouletteShotSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET rrShotStop, 0, 0, 0 invoke mciSendStringA, OFFSET rrShotPlay, 0, 0, 0 ret PlayRouletteShotSound ENDP ; --- PlayStoneSound: звук, интро или покадровая анимация --- PlayStoneSound PROC uses eax ecx edx invoke mciSendStringA, OFFSET stoneSoundStop, 0, 0, 0 invoke mciSendStringA, OFFSET stoneSoundPlay, 0, 0, 0 ret PlayStoneSound ENDP ; --- StopTowerMusic: музыка турнир-башни --- StopTowerMusic PROC invoke mciSendStringA, OFFSET towerMusicStop, 0, 0, 0 invoke mciSendStringA, OFFSET towerMusicClose, 0, 0, 0 ret StopTowerMusic ENDP ; --- PlayTowerRandomMusic: случайная музыка турнир-башни --- PlayTowerRandomMusic PROC uses eax call StopTowerMusic invoke RandomRange, 4 cmp eax, 0 je tower_music_1 cmp eax, 1 je tower_music_2 cmp eax, 2 je tower_music_3 tower_music_4: invoke mciSendStringA, OFFSET towerMusicOpen4, 0, 0, 0 jmp tower_music_play tower_music_1: invoke mciSendStringA, OFFSET towerMusicOpen1, 0, 0, 0 jmp tower_music_play tower_music_2: invoke mciSendStringA, OFFSET towerMusicOpen2, 0, 0, 0 jmp tower_music_play tower_music_3: invoke mciSendStringA, OFFSET towerMusicOpen3, 0, 0, 0 tower_music_play: invoke mciSendStringA, OFFSET towerMusicPlay, 0, 0, 0 ret PlayTowerRandomMusic ENDP ; --- PrintSlotCell: вывод текста, цветов, картинок и элементов интерфейса --- PrintSlotCell PROC uses eax ebx ecx, value:DWORD invoke PrintStr, OFFSET slotWall mov eax, slotCurrentCell mov ebx, 1 mov ecx, eax shl ebx, cl mov eax, slotWinMask test eax, ebx je slot_cell_normal invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET slotWinLeft invoke PrintSlotSymbol, value invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET slotWinRight call ResetColor ret slot_cell_normal: invoke PrintStr, OFFSET slotPadOne invoke PrintSlotSymbol, value invoke PrintStr, OFFSET slotPadOne ret PrintSlotCell ENDP ; --- PrintSlotBlankCell: вывод текста, цветов, картинок и элементов интерфейса --- PrintSlotBlankCell PROC invoke PrintStr, OFFSET slotWall invoke PrintStr, OFFSET slotCellBlank ret PrintSlotBlankCell ENDP ; --- PrintSlotPaddingRow: вывод текста, цветов, картинок и элементов интерфейса --- PrintSlotPaddingRow PROC call PrintSlotBlankCell call PrintSlotBlankCell call PrintSlotBlankCell call PrintSlotBlankCell call PrintSlotBlankCell invoke PrintStr, OFFSET slotWall invoke PrintStr, OFFSET nl ret PrintSlotPaddingRow ENDP ; --- PrintSlotWindow: вывод текста, цветов, картинок и элементов интерфейса --- PrintSlotWindow PROC uses eax ebx call ClearView invoke PrintTitleColor, OFFSET slotTitle invoke PrintStr, OFFSET slotBorder mov rowIndex, 0 slot_window_row_loop: cmp rowIndex, 3 jae slot_window_done call PrintSlotPaddingRow mov ebx, rowIndex imul ebx, 5 cmp slotVisible, 1 jb slot_blank_col1 mov slotCurrentCell, ebx invoke PrintSlotCell, slotGrid[ebx * 4] jmp slot_col2 slot_blank_col1: call PrintSlotBlankCell slot_col2: cmp slotVisible, 2 jb slot_blank_col2 mov eax, ebx inc eax mov slotCurrentCell, eax invoke PrintSlotCell, slotGrid[eax * 4] jmp slot_col3 slot_blank_col2: call PrintSlotBlankCell slot_col3: cmp slotVisible, 3 jb slot_blank_col3 mov eax, ebx add eax, 2 mov slotCurrentCell, eax invoke PrintSlotCell, slotGrid[eax * 4] jmp slot_col4 slot_blank_col3: call PrintSlotBlankCell slot_col4: cmp slotVisible, 4 jb slot_blank_col4 mov eax, ebx add eax, 3 mov slotCurrentCell, eax invoke PrintSlotCell, slotGrid[eax * 4] jmp slot_col5 slot_blank_col4: call PrintSlotBlankCell slot_col5: cmp slotVisible, 5 jb slot_blank_col5 mov eax, ebx add eax, 4 mov slotCurrentCell, eax invoke PrintSlotCell, slotGrid[eax * 4] jmp slot_row_end slot_blank_col5: call PrintSlotBlankCell slot_row_end: invoke PrintStr, OFFSET slotWall invoke PrintStr, OFFSET nl call PrintSlotPaddingRow invoke PrintStr, OFFSET slotBorder inc rowIndex jmp slot_window_row_loop slot_window_done: ret PrintSlotWindow ENDP ; --- FillSlotColumn: слот-машины, барабаны, символы, выплаты и джекпоты --- FillSlotColumn PROC uses eax ebx, column:DWORD mov ebx, column invoke RandomRange, 7 mov slotGrid[ebx * 4], eax mov ebx, column add ebx, 5 invoke RandomRange, 7 mov slotGrid[ebx * 4], eax mov ebx, column add ebx, 10 invoke RandomRange, 7 mov slotGrid[ebx * 4], eax ret FillSlotColumn ENDP ; --- PrintUInt: вывод текста, цветов, картинок и элементов интерфейса --- PrintUInt PROC uses eax ebx ecx edx edi, value:DWORD LOCAL buffer[12]:BYTE lea edi, buffer[11] mov byte ptr [edi], 0 mov eax, value cmp eax, 0 jne convert_loop_start dec edi mov byte ptr [edi], '0' invoke PrintStr, edi ret convert_loop_start: mov ebx, 10 convert_loop: xor edx, edx div ebx add dl, '0' dec edi mov byte ptr [edi], dl cmp eax, 0 jne convert_loop invoke PrintStr, edi ret PrintUInt ENDP ; --- ReadKey: ввод пользователя и разбор введенных данных --- ReadKey PROC uses ebx read_key_again: invoke ReadFile, hIn, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je read_key_empty movzx eax, byte ptr inputBuffer cmp al, 13 je read_key_again cmp al, 10 je read_key_again mov ebx, eax read_key_drain: invoke ReadFile, hIn, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je read_key_return movzx eax, byte ptr inputBuffer cmp al, 10 jne read_key_drain read_key_return: mov eax, ebx ret read_key_empty: xor eax, eax ret ReadKey ENDP ; --- ReadAnyKey: ввод пользователя и разбор введенных данных --- ReadAnyKey PROC read_any_again: invoke ReadFile, hIn, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je read_any_empty movzx eax, byte ptr inputBuffer ret read_any_empty: xor eax, eax ret ReadAnyKey ENDP ; --- ReadUInt: ввод числа одной строкой, без зависания на CR/LF --- ReadUInt PROC uses ebx ecx edx esi edi xor ebx, ebx ; parsed number xor edi, edi ; digit count invoke ReadFile, hIn, ADDR inputBuffer, 31, ADDR charsRead, 0 cmp charsRead, 0 je read_uint_zero mov esi, OFFSET inputBuffer mov ecx, charsRead read_uint_parse_loop: cmp ecx, 0 je read_uint_end movzx eax, byte ptr [esi] inc esi dec ecx cmp al, 13 je read_uint_end cmp al, 10 je read_uint_end cmp al, ' ' je read_uint_parse_loop cmp al, 9 je read_uint_parse_loop cmp al, '0' jb read_uint_bad cmp al, '9' ja read_uint_bad sub al, '0' movzx edx, al mov eax, ebx imul eax, eax, 10 add eax, edx mov ebx, eax inc edi jmp read_uint_parse_loop read_uint_end: cmp edi, 0 je read_uint_zero mov eax, ebx ret read_uint_bad: xor eax, eax ret read_uint_zero: xor eax, eax ret ReadUInt ENDP ; --- StrEqual: ввод пользователя и разбор введенных данных --- StrEqual PROC uses esi edi ebx, pLeft:DWORD, pRight:DWORD mov esi, pLeft mov edi, pRight str_equal_loop: mov al, [esi] mov bl, [edi] cmp al, bl jne str_not_equal cmp al, 0 je str_is_equal inc esi inc edi jmp str_equal_loop str_is_equal: mov eax, 1 ret str_not_equal: xor eax, eax ret StrEqual ENDP ; --- PrintCheatApplied: вывод текста, цветов, картинок и элементов интерфейса --- PrintCheatApplied PROC pText:DWORD invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET cheatAppliedText invoke PrintStr, pText call ResetColor ret PrintCheatApplied ENDP ; --- ApplyCheatCode: банк, ставки, стресс, подозрение и экономика казино --- ApplyCheatCode PROC pCode:DWORD invoke StrEqual, pCode, OFFSET cheatCodeMoney cmp eax, 1 je cheat_money invoke StrEqual, pCode, OFFSET cheatCodeSeven cmp eax, 1 je cheat_sevens invoke StrEqual, pCode, OFFSET cheatCodeWin cmp eax, 1 je cheat_win_next invoke StrEqual, pCode, OFFSET cheatCodeGod cmp eax, 1 je cheat_god invoke StrEqual, pCode, OFFSET cheatCodeFair cmp eax, 1 je cheat_fair invoke StrEqual, pCode, OFFSET cheatCodeGoal cmp eax, 1 je cheat_goal invoke StrEqual, pCode, OFFSET cheatCodeReset cmp eax, 1 je cheat_reset invoke StrEqual, pCode, OFFSET cheatCodeEasy cmp eax, 1 je cheat_easy invoke StrEqual, pCode, OFFSET cheatCodeNormal cmp eax, 1 je cheat_normal invoke StrEqual, pCode, OFFSET cheatCodeHard cmp eax, 1 je cheat_hard invoke StrEqual, pCode, OFFSET cheatCodeJackpot cmp eax, 1 je cheat_jackpot invoke StrEqual, pCode, OFFSET cheatCodeRich cmp eax, 1 je cheat_rich invoke StrEqual, pCode, OFFSET cheatCodeDouble cmp eax, 1 je cheat_double invoke StrEqual, pCode, OFFSET cheatCodePoor cmp eax, 1 je cheat_poor invoke StrEqual, pCode, OFFSET cheatCodeShop cmp eax, 1 je cheat_shop invoke StrEqual, pCode, OFFSET cheatCodeBacks cmp eax, 1 je cheat_backs invoke StrEqual, pCode, OFFSET cheatCodeCharm cmp eax, 1 je cheat_max_charm invoke StrEqual, pCode, OFFSET cheatCodeNoCharm cmp eax, 1 je cheat_no_charm invoke StrEqual, pCode, OFFSET cheatCodeAch cmp eax, 1 je cheat_ach invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET cheatBadText call ResetColor xor eax, eax ret cheat_money: add bankroll, 50000 call SaveGame invoke PrintCheatApplied, OFFSET cheatMoneyText call PrintBank call CheckVictory mov eax, 1 ret cheat_sevens: add bankroll, 7777 call SaveGame invoke PrintCheatApplied, OFFSET cheatSevenText call PrintBank call CheckVictory mov eax, 1 ret cheat_win_next: mov cheatLuckyWin, 1 call SaveGame invoke PrintCheatApplied, OFFSET cheatWinText mov eax, 1 ret cheat_god: mov cheatGodMode, 1 call SaveGame invoke PrintCheatApplied, OFFSET cheatGodText mov eax, 1 ret cheat_fair: mov cheatLuckyWin, 0 mov cheatGodMode, 0 mov casinoSuspicion, 0 call SaveGame invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET cheatAppliedText invoke PrintStr, OFFSET cheatFairText call ResetColor mov eax, 1 ret cheat_goal: mov eax, targetBank mov bankroll, eax call SaveGame invoke PrintCheatApplied, OFFSET cheatGoalText call PrintBank call CheckVictory mov eax, 1 ret cheat_reset: mov bankroll, 10000 call SaveGame invoke PrintCheatApplied, OFFSET cheatResetText call PrintBank mov eax, 1 ret cheat_easy: mov aiDifficulty, 1 call SaveGame invoke PrintCheatApplied, OFFSET cheatEasyText mov eax, 1 ret cheat_normal: mov aiDifficulty, 2 call SaveGame invoke PrintCheatApplied, OFFSET cheatNormalText mov eax, 1 ret cheat_hard: mov aiDifficulty, 3 call SaveGame invoke PrintCheatApplied, OFFSET cheatHardText mov eax, 1 ret cheat_jackpot: mov cheatSlotJackpot, 1 call SaveGame invoke PrintCheatApplied, OFFSET cheatJackpotText mov eax, 1 ret cheat_rich: add bankroll, 250000 call SaveGame invoke PrintCheatApplied, OFFSET cheatRichText call PrintBank call CheckVictory mov eax, 1 ret cheat_double: mov eax, bankroll add bankroll, eax call SaveGame invoke PrintCheatApplied, OFFSET cheatDoubleText call PrintBank call CheckVictory mov eax, 1 ret cheat_poor: mov bankroll, 1 call SaveGame invoke PrintCheatApplied, OFFSET cheatPoorText call PrintBank mov eax, 1 ret cheat_shop: add bankroll, 30000 call SaveGame invoke PrintCheatApplied, OFFSET cheatShopText call PrintBank call CheckVictory mov eax, 1 ret cheat_backs: mov shopBackOwned, 1FFFh call SaveGame invoke PrintCheatApplied, OFFSET cheatBacksText mov eax, 1 ret cheat_max_charm: mov shopCharmLevel, 5 mov shopCharmUses, 1 call SaveGame invoke PrintCheatApplied, OFFSET cheatCharmText mov eax, 1 ret cheat_no_charm: mov shopCharmLevel, 0 call SaveGame invoke PrintCheatApplied, OFFSET cheatNoCharmText mov eax, 1 ret cheat_ach: mov achievements, 7FFFFh call SaveGame invoke PrintCheatApplied, OFFSET cheatAchText mov eax, 1 ret ApplyCheatCode ENDP ; --- ReadBetInput: ввод пользователя и разбор введенных данных --- ReadBetInput PROC uses ebx ecx edx esi edi mov ecx, 32 mov edi, OFFSET cheatBuffer xor eax, eax rep stosb xor ebx, ebx ; parsed numeric bet xor esi, esi ; stored input length xor edi, edi ; 0 = number, 1 = cheat/code read_bet_loop: invoke ReadFile, hIn, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je read_bet_finish movzx eax, byte ptr inputBuffer cmp al, 13 je read_bet_drain_lf cmp al, 10 je read_bet_finish cmp al, ' ' je read_bet_loop cmp al, 9 je read_bet_loop cmp al, 'a' jb read_bet_store cmp al, 'z' ja read_bet_store sub al, 20h read_bet_store: cmp esi, 31 jae read_bet_after_store mov cheatBuffer[esi], al read_bet_after_store: inc esi cmp edi, 0 jne read_bet_loop cmp al, '0' jb read_bet_mark_code cmp al, '9' ja read_bet_mark_code movzx edx, al sub edx, '0' imul ebx, ebx, 10 add ebx, edx jmp read_bet_loop read_bet_mark_code: mov edi, 1 jmp read_bet_loop read_bet_drain_lf: invoke ReadFile, hIn, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je read_bet_finish movzx eax, byte ptr inputBuffer cmp al, 10 jne read_bet_drain_lf read_bet_finish: cmp esi, 0 je read_bet_empty cmp edi, 0 jne read_bet_cheat mov eax, ebx ret read_bet_cheat: invoke ApplyCheatCode, OFFSET cheatBuffer cmp eax, 1 je read_bet_cheat_ok mov eax, 0FFFFFFFEh ret read_bet_cheat_ok: mov eax, 0FFFFFFFFh ret read_bet_empty: xor eax, eax ret ReadBetInput ENDP ; --- Pause: ввод пользователя и разбор введенных данных --- PauseConsole PROC invoke PrintStr, OFFSET pauseText call ReadAnyKey ret PauseConsole ENDP ; --- PrintBank: вывод текста, цветов, картинок и элементов интерфейса --- PrintBank PROC invoke PrintStr, OFFSET bankText invoke PrintMoney, bankroll invoke PrintStr, OFFSET nl ret PrintBank ENDP ; --- PrintGoal: вывод текста, цветов, картинок и элементов интерфейса --- PrintGoal PROC invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET goalText call ResetColor invoke PrintMoney, targetBank invoke PrintStr, OFFSET nl ret PrintGoal ENDP ; --- ResetProfileDefaults: аккаунты, файлы сохранений и загрузка профиля --- ResetProfileDefaults PROC uses ecx edi mov bankroll, 10000 mov targetBank, 50000 mov gamesPlayed, 0 mov gamesWon, 0 mov gamesLost, 0 mov gamesDrawn, 0 mov bestWin, 0 mov bestLoss, 0 mov aiDifficulty, 2 mov cheatLuckyWin, 0 mov cheatGodMode, 0 mov cheatSlotJackpot, 0 mov settingsVolume, 10 mov secretEndingSeen, 0 mov vipTaxAmount, 0 mov bankRecovered, 0 mov shopBackOwned, 1 mov shopBackStyle, 0 mov shopCharmLevel, 0 mov shopCharmUses, 0 mov achievements, 0 mov casinoSuspicion, 0 mov stressLevel, 0 mov lastGameResult, 0 mov currentGameId, 0 mov ecx, 11 mov edi, OFFSET gameStatsPlayed reset_game_stats_loop: mov dword ptr [edi], 0 add edi, 4 loop reset_game_stats_loop mov ecx, 11 mov edi, OFFSET gameStatsWon reset_game_won_loop: mov dword ptr [edi], 0 add edi, 4 loop reset_game_won_loop mov ecx, 11 mov edi, OFFSET gameStatsLost reset_game_lost_loop: mov dword ptr [edi], 0 add edi, 4 loop reset_game_lost_loop mov ecx, 11 mov edi, OFFSET gameStatsDraw reset_game_draw_loop: mov dword ptr [edi], 0 add edi, 4 loop reset_game_draw_loop ret ResetProfileDefaults ENDP ; --- ReadAccountName: ввод пользователя и разбор введенных данных --- ; --- CopyCString: копирование ASCIIZ-строки --- CopyCString PROC uses eax esi edi, pDst:DWORD, pSrc:DWORD mov edi, pDst mov esi, pSrc copy_cstring_loop: mov al, [esi] mov [edi], al inc esi inc edi cmp al, 0 jne copy_cstring_loop ret CopyCString ENDP ; --- AppendCString: дописывает ASCIIZ-строку в конец буфера --- AppendCString PROC uses eax esi edi, pDst:DWORD, pSrc:DWORD mov edi, pDst append_find_end: cmp byte ptr [edi], 0 je append_copy_start inc edi jmp append_find_end append_copy_start: mov esi, pSrc append_copy_loop: mov al, [esi] mov [edi], al inc esi inc edi cmp al, 0 jne append_copy_loop ret AppendCString ENDP ; --- BuildAppDataDir: путь к %APPDATA%\AssemblerCasino --- BuildAppDataDir PROC uses eax mov appDataReady, 0 invoke GetEnvironmentVariableA, OFFSET appDataEnvName, OFFSET saveDirPath, 220 cmp eax, 0 je build_appdata_done cmp eax, 220 jae build_appdata_done invoke AppendCString, OFFSET saveDirPath, OFFSET appDataSubDir invoke CreateDirectoryA, OFFSET saveDirPath, 0 mov appDataReady, 1 build_appdata_done: ret BuildAppDataDir ENDP ; --- BuildSaveFullPath: полный путь текущего аккаунта --- BuildSaveFullPath PROC call BuildAppDataDir cmp appDataReady, 1 jne build_save_local invoke CopyCString, OFFSET saveFullPath, OFFSET saveDirPath invoke AppendCString, OFFSET saveFullPath, OFFSET pathSlashText invoke AppendCString, OFFSET saveFullPath, OFFSET saveFileName ret build_save_local: invoke CopyCString, OFFSET saveFullPath, OFFSET saveFileName ret BuildSaveFullPath ENDP ; --- BuildAccountPatternFull: маска поиска аккаунтов --- BuildAccountPatternFull PROC call BuildAppDataDir cmp appDataReady, 1 jne build_pattern_local invoke CopyCString, OFFSET accountPatternFull, OFFSET saveDirPath invoke AppendCString, OFFSET accountPatternFull, OFFSET pathSlashText invoke AppendCString, OFFSET accountPatternFull, OFFSET accountPattern ret build_pattern_local: invoke CopyCString, OFFSET accountPatternFull, OFFSET accountPattern ret BuildAccountPatternFull ENDP ; --- BuildLeaderSavePath: полный путь аккаунта для таблиц лидеров --- BuildLeaderSavePath PROC call BuildAppDataDir cmp appDataReady, 1 jne build_leader_local invoke CopyCString, OFFSET leaderSavePath, OFFSET saveDirPath invoke AppendCString, OFFSET leaderSavePath, OFFSET pathSlashText invoke AppendCString, OFFSET leaderSavePath, leaderAccountPtr ret build_leader_local: invoke CopyCString, OFFSET leaderSavePath, leaderAccountPtr ret BuildLeaderSavePath ENDP ReadAccountName PROC uses eax ecx edi mov ecx, 64 mov edi, OFFSET saveFileName clear_account_name: mov byte ptr [edi], 0 inc edi loop clear_account_name mov accountNameLen, 0 mov edi, OFFSET saveFileName read_account_loop: invoke ReadFile, hIn, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je account_name_done mov al, byte ptr inputBuffer cmp al, 13 je account_name_drain_lf cmp al, 10 je account_name_done cmp accountNameLen, 50 jae read_account_loop cmp al, '0' jb check_account_upper cmp al, '9' jbe store_account_char check_account_upper: cmp al, 'A' jb check_account_lower cmp al, 'Z' jbe store_account_char check_account_lower: cmp al, 'a' jb check_account_symbols cmp al, 'z' jbe store_account_char check_account_symbols: cmp al, '_' je store_account_char cmp al, '-' je store_account_char jmp read_account_loop store_account_char: mov [edi], al inc edi inc accountNameLen jmp read_account_loop account_name_drain_lf: invoke ReadFile, hIn, ADDR inputBuffer, 1, ADDR charsRead, 0 cmp charsRead, 0 je account_name_done mov al, byte ptr inputBuffer cmp al, 10 jne account_name_drain_lf account_name_done: cmp accountNameLen, 0 je account_name_return mov byte ptr [edi], '.' inc edi mov byte ptr [edi], 'd' inc edi mov byte ptr [edi], 'a' inc edi mov byte ptr [edi], 't' inc edi mov byte ptr [edi], 0 account_name_return: ret ReadAccountName ENDP ; --- AskAccountName: аккаунты, файлы сохранений и загрузка профиля --- AskAccountName PROC ask_account_name_again: invoke PrintStr, OFFSET accountPromptText call ReadAccountName cmp accountNameLen, 0 jne account_name_ok invoke PrintStr, OFFSET accountBadText jmp ask_account_name_again account_name_ok: ret AskAccountName ENDP ; --- CopyFindAccountName: аккаунты, файлы сохранений и загрузка профиля --- CopyFindAccountName PROC uses eax ecx esi edi mov eax, accountCount shl eax, 6 mov edi, OFFSET accountList add edi, eax mov esi, OFFSET findData add esi, 44 mov ecx, 63 copy_find_name_loop: mov al, [esi] mov [edi], al cmp al, 0 je copy_find_name_done inc esi inc edi loop copy_find_name_loop mov byte ptr [edi], 0 copy_find_name_done: ret CopyFindAccountName ENDP ; --- CopySelectedAccountName: аккаунты, файлы сохранений и загрузка профиля --- CopySelectedAccountName PROC uses eax ecx esi edi mov eax, selectedAccount dec eax shl eax, 6 mov esi, OFFSET accountList add esi, eax mov edi, OFFSET saveFileName mov ecx, 63 copy_selected_name_loop: mov al, [esi] mov [edi], al cmp al, 0 je copy_selected_name_done inc esi inc edi loop copy_selected_name_loop mov byte ptr [edi], 0 copy_selected_name_done: ret CopySelectedAccountName ENDP ; --- CollectAccounts: аккаунты, файлы сохранений и загрузка профиля --- CollectAccounts PROC uses eax mov accountCount, 0 call BuildAccountPatternFull invoke FindFirstFileA, OFFSET accountPatternFull, OFFSET findData cmp eax, INVALID_HANDLE_VALUE je collect_accounts_done mov findHandle, eax collect_accounts_loop: mov eax, DWORD PTR [findData] test eax, 10h jne collect_accounts_next cmp accountCount, 20 jae collect_accounts_close call CopyFindAccountName inc accountCount collect_accounts_next: invoke FindNextFileA, findHandle, OFFSET findData cmp eax, 0 jne collect_accounts_loop collect_accounts_close: invoke FindClose, findHandle collect_accounts_done: ret CollectAccounts ENDP ; --- PrintAccountList: вывод текста, цветов, картинок и элементов интерфейса --- PrintAccountList PROC uses eax ebx invoke PrintStr, OFFSET accountListTitle mov ebx, 0 print_account_loop: cmp ebx, accountCount jae print_account_done mov eax, ebx inc eax invoke PrintUInt, eax invoke PrintStr, OFFSET dotSpaceText mov eax, ebx shl eax, 6 add eax, OFFSET accountList invoke PrintStr, eax invoke PrintStr, OFFSET nl inc ebx jmp print_account_loop print_account_done: ret PrintAccountList ENDP ; --- SelectExistingAccount: аккаунты, файлы сохранений и загрузка профиля --- SelectExistingAccount PROC select_account_again: call ClearView invoke PrintTitleColor, OFFSET titleText call CollectAccounts cmp accountCount, 0 jne accounts_available invoke PrintStr, OFFSET accountNoFilesText call PauseConsole xor eax, eax ret accounts_available: call PrintAccountList invoke PrintStr, OFFSET accountSelectText call ReadUInt cmp eax, 1 jb select_account_bad cmp eax, accountCount ja select_account_bad mov selectedAccount, eax call CopySelectedAccountName mov eax, 1 ret select_account_bad: invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp select_account_again SelectExistingAccount ENDP ; --- AccountMenu: аккаунты, файлы сохранений и загрузка профиля --- AccountMenu PROC account_menu_loop: call ClearView invoke PrintTitleColor, OFFSET titleText invoke PrintStr, OFFSET accountMenuText invoke PrintStr, OFFSET choiceText call ReadKey cmp al, '1' je account_login cmp al, '2' je account_create invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp account_menu_loop account_login: call ResetProfileDefaults call SelectExistingAccount cmp eax, 1 jne account_menu_loop call LoadSave invoke PrintStr, OFFSET accountLoginText invoke PrintStr, OFFSET saveFileName invoke PrintStr, OFFSET nl invoke Sleep, 700 ret account_create: call ClearView invoke PrintTitleColor, OFFSET titleText call ResetProfileDefaults call AskAccountName call SaveGame invoke PrintStr, OFFSET accountCreateText invoke PrintStr, OFFSET saveFileName invoke PrintStr, OFFSET nl invoke Sleep, 700 ret AccountMenu ENDP ; --- CalcSaveSignature: простая подпись сохранения от ручной правки --- CalcSaveSignature PROC uses ecx esi edx mov esi, OFFSET saveBuffer mov ecx, SAVE_SIGN_SIZE / 4 mov eax, SAVE_SALT save_signature_loop: rol eax, 5 xor eax, [esi] mov edx, eax shr edx, 16 xor eax, edx add eax, 9E3779B9h add esi, 4 loop save_signature_loop ret CalcSaveSignature ENDP ; --- SaveGame: аккаунты, файлы сохранений и загрузка профиля --- SaveGame PROC uses eax ecx esi edi mov DWORD PTR [saveBuffer], SAVE_MAGIC mov eax, bankroll mov DWORD PTR [saveBuffer+4], eax mov eax, targetBank mov DWORD PTR [saveBuffer+36], eax mov eax, gamesPlayed mov DWORD PTR [saveBuffer+8], eax mov eax, gamesWon mov DWORD PTR [saveBuffer+12], eax mov eax, gamesLost mov DWORD PTR [saveBuffer+16], eax mov eax, gamesDrawn mov DWORD PTR [saveBuffer+20], eax mov eax, bestWin mov DWORD PTR [saveBuffer+24], eax mov eax, bestLoss mov DWORD PTR [saveBuffer+28], eax mov eax, aiDifficulty mov DWORD PTR [saveBuffer+32], eax mov eax, shopBackOwned mov DWORD PTR [saveBuffer+40], eax mov eax, shopBackStyle mov DWORD PTR [saveBuffer+44], eax mov eax, shopCharmLevel mov DWORD PTR [saveBuffer+48], eax mov eax, achievements mov DWORD PTR [saveBuffer+52], eax mov eax, shopCharmUses mov DWORD PTR [saveBuffer+56], eax mov eax, casinoSuspicion mov DWORD PTR [saveBuffer+236], eax mov eax, dailyDateKey mov DWORD PTR [saveBuffer+240], eax mov eax, dailyRewardMask mov DWORD PTR [saveBuffer+244], eax mov eax, dailyProgressPacked mov DWORD PTR [saveBuffer+248], eax mov eax, dailyTaskPacked mov DWORD PTR [saveBuffer+252], eax mov eax, settingsVolume mov DWORD PTR [saveBuffer+256], eax mov eax, secretEndingSeen mov DWORD PTR [saveBuffer+260], eax mov eax, settingsLowSpec mov DWORD PTR [saveBuffer+264], eax mov eax, settingsIntroEnabled mov DWORD PTR [saveBuffer+268], eax mov eax, settingsDbdWindowEnabled mov DWORD PTR [saveBuffer+272], eax mov ecx, 44 mov esi, OFFSET gameStatsPlayed mov edi, OFFSET saveBuffer+60 save_stats_played_loop: mov eax, [esi] mov [edi], eax add esi, 4 add edi, 4 loop save_stats_played_loop call CalcSaveSignature mov DWORD PTR [saveBuffer+SAVE_SIGN_SIZE], eax call BuildSaveFullPath invoke CreateFileA, OFFSET saveFullPath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je save_done mov saveHandle, eax invoke WriteFile, saveHandle, ADDR saveBuffer, SAVE_FILE_SIZE, ADDR charsWritten, 0 invoke CloseHandle, saveHandle save_done: ret SaveGame ENDP ; --- LoadSave: аккаунты, файлы сохранений и загрузка профиля --- LoadSave PROC uses eax ecx esi edi mov dailyDateKey, 0 mov dailyRewardMask, 0 mov dailyProgressPacked, 0 mov dailyTaskPacked, 0 mov settingsVolume, 10 ; load default for old saves mov secretEndingSeen, 0 mov settingsLowSpec, 0 mov settingsIntroEnabled, 1 mov settingsDbdWindowEnabled, 1 mov saveTampered, 0 call BuildSaveFullPath invoke CreateFileA, OFFSET saveFullPath, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE jne load_file_opened cmp appDataReady, 1 jne load_done invoke CreateFileA, OFFSET saveFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je load_done load_file_opened: mov saveHandle, eax invoke ReadFile, saveHandle, ADDR saveBuffer, SAVE_FILE_SIZE, ADDR charsRead, 0 invoke CloseHandle, saveHandle cmp charsRead, 32 jb load_done mov eax, DWORD PTR [saveBuffer] cmp eax, SAVE_MAGIC jne load_done cmp charsRead, SAVE_FILE_SIZE jb load_signature_ok mov edx, DWORD PTR [saveBuffer+SAVE_SIGN_SIZE] call CalcSaveSignature cmp eax, edx jne load_tampered load_signature_ok: mov eax, DWORD PTR [saveBuffer+4] mov bankroll, eax cmp eax, 0 jne load_bank_ok mov bankroll, 10000 mov bankRecovered, 1 load_bank_ok: mov eax, DWORD PTR [saveBuffer+8] mov gamesPlayed, eax mov eax, DWORD PTR [saveBuffer+12] mov gamesWon, eax mov eax, DWORD PTR [saveBuffer+16] mov gamesLost, eax mov eax, DWORD PTR [saveBuffer+20] mov gamesDrawn, eax mov eax, DWORD PTR [saveBuffer+24] mov bestWin, eax mov eax, DWORD PTR [saveBuffer+28] mov bestLoss, eax cmp charsRead, 36 jb load_done mov eax, DWORD PTR [saveBuffer+32] cmp eax, 1 jb load_done cmp eax, 3 ja load_done mov aiDifficulty, eax cmp charsRead, 40 jb load_done mov eax, DWORD PTR [saveBuffer+36] cmp eax, 50000 jb load_done mov targetBank, eax cmp charsRead, 52 jb load_done mov eax, DWORD PTR [saveBuffer+40] cmp eax, 0 je load_done mov shopBackOwned, eax mov eax, DWORD PTR [saveBuffer+44] cmp eax, 12 ja load_shop_charm mov shopBackStyle, eax load_shop_charm: mov eax, DWORD PTR [saveBuffer+48] cmp eax, 24 ja load_done mov shopCharmLevel, eax cmp charsRead, 56 jb load_done mov eax, DWORD PTR [saveBuffer+52] mov achievements, eax cmp charsRead, 60 jb load_done mov eax, DWORD PTR [saveBuffer+56] cmp eax, 8 ja load_done mov shopCharmUses, eax cmp charsRead, 236 jb load_done mov ecx, 44 mov esi, OFFSET saveBuffer+60 mov edi, OFFSET gameStatsPlayed load_stats_played_loop: mov eax, [esi] mov [edi], eax add esi, 4 add edi, 4 loop load_stats_played_loop cmp charsRead, 240 jb load_done mov eax, DWORD PTR [saveBuffer+236] cmp eax, 100 ja load_done mov casinoSuspicion, eax cmp charsRead, 252 jb load_done mov eax, DWORD PTR [saveBuffer+240] mov dailyDateKey, eax mov eax, DWORD PTR [saveBuffer+244] mov dailyRewardMask, eax mov eax, DWORD PTR [saveBuffer+248] mov dailyProgressPacked, eax cmp charsRead, 256 jb load_daily_check mov eax, DWORD PTR [saveBuffer+252] mov dailyTaskPacked, eax cmp charsRead, 260 jb load_daily_check load_settings_volume: mov eax, DWORD PTR [saveBuffer+256] cmp eax, 10 ja load_secret_seen mov settingsVolume, eax load_secret_seen: cmp charsRead, 264 jb load_daily_check mov eax, DWORD PTR [saveBuffer+260] cmp eax, 1 ja load_low_spec_setting mov secretEndingSeen, eax load_low_spec_setting: cmp charsRead, 268 jb load_daily_check mov eax, DWORD PTR [saveBuffer+264] cmp eax, 2 ja load_intro_setting mov settingsLowSpec, eax load_intro_setting: cmp charsRead, 272 jb load_daily_check mov eax, DWORD PTR [saveBuffer+268] cmp eax, 1 ja load_dbd_setting mov settingsIntroEnabled, eax load_dbd_setting: cmp charsRead, 276 jb load_daily_check mov eax, DWORD PTR [saveBuffer+272] cmp eax, 1 ja load_daily_check mov settingsDbdWindowEnabled, eax load_daily_check: call DailyCheckDate jmp load_done load_tampered: mov bankroll, 10000 mov bankRecovered, 1 mov saveTampered, 1 jmp load_done load_done: ret LoadSave ENDP ; --- RegisterGamePlayed: статистика, достижения и таблицы лидеров --- RegisterGamePlayed PROC uses eax ebx mov eax, currentGameId cmp eax, 1 jb register_game_played_done cmp eax, 11 ja register_game_played_done dec eax mov ebx, eax inc dword ptr gameStatsPlayed[ebx * 4] register_game_played_done: ret RegisterGamePlayed ENDP ; --- RegisterGameWin: статистика, достижения и таблицы лидеров --- RegisterGameWin PROC uses eax ebx call RegisterGamePlayed mov eax, currentGameId cmp eax, 1 jb register_game_win_done cmp eax, 10 ja register_game_win_done dec eax mov ebx, eax inc dword ptr gameStatsWon[ebx * 4] register_game_win_done: ret RegisterGameWin ENDP ; --- RegisterGameLoss: статистика, достижения и таблицы лидеров --- RegisterGameLoss PROC uses eax ebx call RegisterGamePlayed mov eax, currentGameId cmp eax, 1 jb register_game_loss_done cmp eax, 10 ja register_game_loss_done dec eax mov ebx, eax inc dword ptr gameStatsLost[ebx * 4] register_game_loss_done: ret RegisterGameLoss ENDP ; --- RegisterGameDraw: статистика, достижения и таблицы лидеров --- RegisterGameDraw PROC uses eax ebx call RegisterGamePlayed mov eax, currentGameId cmp eax, 1 jb register_game_draw_done cmp eax, 10 ja register_game_draw_done dec eax mov ebx, eax inc dword ptr gameStatsDraw[ebx * 4] register_game_draw_done: ret RegisterGameDraw ENDP ; --- RegisterWin: статистика, достижения и таблицы лидеров --- RegisterWin PROC uses eax, amount:DWORD inc gamesPlayed inc gamesWon call DailyAddWin call RegisterGameWin mov eax, amount cmp eax, bestWin jbe register_win_save mov bestWin, eax register_win_save: call SaveGame ret RegisterWin ENDP ; --- RegisterLoss: статистика, достижения и таблицы лидеров --- RegisterLoss PROC uses eax, amount:DWORD inc gamesPlayed inc gamesLost call DailyAddLoss call RegisterGameLoss mov eax, amount cmp eax, bestLoss jbe register_loss_save mov bestLoss, eax register_loss_save: invoke UnlockAchievement, 2, OFFSET achFirstLossName register_loss_ach_done: call SaveGame ret RegisterLoss ENDP ; --- RegisterDraw: статистика, достижения и таблицы лидеров --- RegisterDraw PROC inc gamesPlayed inc gamesDrawn call DailyAddDraw call RegisterGameDraw call SaveGame ret RegisterDraw ENDP ; --- DailyTaskGoal: цель задания из пула 40 --- DailyTaskGoal PROC taskId:DWORD mov eax, taskId cmp eax, 2 je daily_goal_5 cmp eax, 3 je daily_goal_7 cmp eax, 5 je daily_goal_2 cmp eax, 6 je daily_goal_3 cmp eax, 8 je daily_goal_2 cmp eax, 11 je daily_goal_3 cmp eax, 35 je daily_goal_2 cmp eax, 37 je daily_goal_3 cmp eax, 38 je daily_goal_2 cmp eax, 39 je daily_goal_2 mov eax, 1 ret daily_goal_2: mov eax, 2 ret daily_goal_3: mov eax, 3 ret daily_goal_5: mov eax, 5 ret daily_goal_7: mov eax, 7 ret DailyTaskGoal ENDP ; --- DailyTaskReward: денежная награда задания из пула 40 --- DailyTaskReward PROC taskId:DWORD mov eax, taskId cmp eax, 12 je daily_reward_big cmp eax, 30 je daily_reward_big cmp eax, 34 je daily_reward_big cmp eax, 36 je daily_reward_big cmp eax, 38 je daily_reward_mid cmp eax, 40 je daily_reward_mid cmp eax, 10 jb daily_reward_small cmp eax, 28 jbe daily_reward_mid mov eax, 2000 ret daily_reward_small: mov eax, 1000 ret daily_reward_mid: mov eax, 2500 ret daily_reward_big: mov eax, 4000 ret DailyTaskReward ENDP ; --- DailyGenerateTasks: выбирает 3 задания из 40 по календарной дате --- DailyGenerateTasks PROC uses eax ebx ecx edx mov eax, dailyDateKey xor edx, edx mov ebx, 40 div ebx inc edx mov byte ptr [dailyTaskPacked], dl mov eax, dailyDateKey xor edx, edx mov ebx, 3 div ebx add eax, 17 xor edx, edx mov ebx, 40 div ebx inc edx mov al, dl cmp al, byte ptr [dailyTaskPacked] jne daily_gen_store2 inc al cmp al, 41 jb daily_gen_store2 mov al, 1 daily_gen_store2: mov byte ptr [dailyTaskPacked+1], al mov eax, dailyDateKey xor edx, edx mov ebx, 7 div ebx add eax, 29 xor edx, edx mov ebx, 40 div ebx inc edx mov al, dl daily_gen_unique3: cmp al, byte ptr [dailyTaskPacked] je daily_gen_inc3 cmp al, byte ptr [dailyTaskPacked+1] je daily_gen_inc3 jmp daily_gen_store3 daily_gen_inc3: inc al cmp al, 41 jb daily_gen_unique3 mov al, 1 jmp daily_gen_unique3 daily_gen_store3: mov byte ptr [dailyTaskPacked+2], al mov byte ptr [dailyTaskPacked+3], 0 ret DailyGenerateTasks ENDP ; --- DailyCheckDate: календарные ежедневные задания --- DailyCheckDate PROC uses eax ebx invoke GetLocalTime, OFFSET systemTime movzx eax, word ptr [systemTime] imul eax, eax, 10000 movzx ebx, word ptr [systemTime+2] imul ebx, ebx, 100 add eax, ebx movzx ebx, word ptr [systemTime+6] add eax, ebx cmp dailyDateKey, eax je daily_date_has_date mov dailyDateKey, eax mov dailyRewardMask, 0 mov dailyProgressPacked, 0 mov dailyTaskPacked, 0 call DailyGenerateTasks ret daily_date_has_date: cmp byte ptr [dailyTaskPacked], 0 jne daily_date_done call DailyGenerateTasks daily_date_done: ret DailyCheckDate ENDP ; --- DailyTaskMatches: проверяет, реагирует ли задание на событие --- ; eventType: 1 played, 2 win, 3 loss, 4 draw, 5 bet>=5000, 6 bet>=10000 DailyTaskMatches PROC uses ebx ecx edx, taskId:DWORD, eventType:DWORD mov eax, taskId mov ebx, eventType cmp eax, 1 je daily_match_play_any cmp eax, 2 je daily_match_play_any cmp eax, 3 je daily_match_play_any cmp eax, 4 je daily_match_win_any cmp eax, 5 je daily_match_win_any cmp eax, 6 je daily_match_win_any cmp eax, 7 je daily_match_loss_any cmp eax, 8 je daily_match_loss_any cmp eax, 9 je daily_match_draw_any cmp eax, 10 je daily_match_bet5 cmp eax, 11 je daily_match_bet5 cmp eax, 12 je daily_match_bet10 cmp eax, 13 jb daily_match_none cmp eax, 34 ja daily_match_groups mov ecx, eax sub ecx, 13 shr ecx, 1 inc ecx ; map compact game order 1..11 to actual currentGameId cmp ecx, 3 jb daily_match_game_ready cmp ecx, 3 je daily_match_game_clover cmp ecx, 4 je daily_match_game_rr cmp ecx, 5 je daily_match_game_skulls cmp ecx, 6 je daily_match_game_coin cmp ecx, 7 je daily_match_game_dice cmp ecx, 8 je daily_match_game_casino_roulette cmp ecx, 9 je daily_match_game_slot cmp ecx, 10 je daily_match_game_durak mov ecx, 11 jmp daily_match_game_ready daily_match_game_clover: mov ecx, 3 jmp daily_match_game_ready daily_match_game_rr: mov ecx, 4 jmp daily_match_game_ready daily_match_game_skulls: mov ecx, 5 jmp daily_match_game_ready daily_match_game_coin: mov ecx, 6 jmp daily_match_game_ready daily_match_game_dice: mov ecx, 7 jmp daily_match_game_ready daily_match_game_casino_roulette: mov ecx, 8 jmp daily_match_game_ready daily_match_game_slot: mov ecx, 9 jmp daily_match_game_ready daily_match_game_durak: mov ecx, 10 daily_match_game_ready: cmp currentGameId, ecx jne daily_match_none test eax, 1 jnz daily_match_play_any jmp daily_match_win_any daily_match_groups: cmp eax, 35 je daily_match_card_play cmp eax, 36 je daily_match_card_win cmp eax, 37 je daily_match_luck_play cmp eax, 38 je daily_match_luck_win cmp eax, 39 je daily_match_risk_play cmp eax, 40 je daily_match_risk_win jmp daily_match_none daily_match_play_any: cmp ebx, 1 je daily_match_yes jmp daily_match_none daily_match_win_any: cmp ebx, 2 je daily_match_yes jmp daily_match_none daily_match_loss_any: cmp ebx, 3 je daily_match_yes jmp daily_match_none daily_match_draw_any: cmp ebx, 4 je daily_match_yes jmp daily_match_none daily_match_bet5: cmp ebx, 5 je daily_match_yes jmp daily_match_none daily_match_bet10: cmp ebx, 6 je daily_match_yes jmp daily_match_none daily_match_card_play: cmp ebx, 1 jne daily_match_none cmp currentGameId, 1 je daily_match_yes cmp currentGameId, 2 je daily_match_yes cmp currentGameId, 10 je daily_match_yes jmp daily_match_none daily_match_card_win: cmp ebx, 2 jne daily_match_none cmp currentGameId, 1 je daily_match_yes cmp currentGameId, 2 je daily_match_yes cmp currentGameId, 10 je daily_match_yes jmp daily_match_none daily_match_luck_play: cmp ebx, 1 jne daily_match_none cmp currentGameId, 3 je daily_match_yes cmp currentGameId, 6 je daily_match_yes cmp currentGameId, 7 je daily_match_yes cmp currentGameId, 8 je daily_match_yes cmp currentGameId, 9 je daily_match_yes jmp daily_match_none daily_match_luck_win: cmp ebx, 2 jne daily_match_none cmp currentGameId, 3 je daily_match_yes cmp currentGameId, 6 je daily_match_yes cmp currentGameId, 7 je daily_match_yes cmp currentGameId, 8 je daily_match_yes cmp currentGameId, 9 je daily_match_yes jmp daily_match_none daily_match_risk_play: cmp ebx, 1 jne daily_match_none cmp currentGameId, 4 je daily_match_yes cmp currentGameId, 5 je daily_match_yes cmp currentGameId, 11 je daily_match_yes jmp daily_match_none daily_match_risk_win: cmp ebx, 2 jne daily_match_none cmp currentGameId, 4 je daily_match_yes cmp currentGameId, 5 je daily_match_yes cmp currentGameId, 11 je daily_match_yes jmp daily_match_none daily_match_yes: mov eax, 1 ret daily_match_none: xor eax, eax ret DailyTaskMatches ENDP ; --- DailyApplyEvent: применяет игровое событие к трём заданиям дня --- DailyApplyEvent PROC uses eax ebx ecx edx esi, eventType:DWORD call DailyCheckDate mov esi, 0 daily_apply_loop: cmp esi, 3 jae daily_apply_done movzx eax, byte ptr [dailyTaskPacked + esi] cmp eax, 0 je daily_apply_next mov ebx, eax invoke DailyTaskMatches, ebx, eventType cmp eax, 1 jne daily_apply_next movzx ecx, byte ptr [dailyProgressPacked + esi] invoke DailyTaskGoal, ebx cmp ecx, eax jae daily_apply_next inc byte ptr [dailyProgressPacked + esi] daily_apply_next: inc esi jmp daily_apply_loop daily_apply_done: ret DailyApplyEvent ENDP DailyAddPlayed PROC invoke DailyApplyEvent, 1 ret DailyAddPlayed ENDP DailyAddWin PROC call DailyAddPlayed invoke DailyApplyEvent, 2 ret DailyAddWin ENDP DailyAddLoss PROC call DailyAddPlayed invoke DailyApplyEvent, 3 ret DailyAddLoss ENDP DailyAddDraw PROC call DailyAddPlayed invoke DailyApplyEvent, 4 ret DailyAddDraw ENDP DailyAddHighBet PROC call DailyCheckDate cmp currentBet, 5000 jb daily_bet_done invoke DailyApplyEvent, 5 cmp currentBet, 10000 jb daily_bet_done invoke DailyApplyEvent, 6 daily_bet_done: ret DailyAddHighBet ENDP ; --- DailyClaimSlot: выдача награды за один слот ежедневки --- DailyClaimSlot PROC uses eax ebx ecx edx, slotIndex:DWORD, maskValue:DWORD mov eax, dailyRewardMask and eax, maskValue cmp eax, 0 jne daily_claim_slot_done mov ecx, slotIndex movzx ebx, byte ptr [dailyTaskPacked + ecx] cmp ebx, 0 je daily_claim_slot_done movzx edx, byte ptr [dailyProgressPacked + ecx] invoke DailyTaskGoal, ebx cmp edx, eax jb daily_claim_slot_done mov eax, maskValue or dailyRewardMask, eax invoke DailyTaskReward, ebx add bankroll, eax push eax invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET dailyClaimText pop eax invoke PrintUInt, eax invoke PrintStr, OFFSET nl call ResetColor daily_claim_slot_done: ret DailyClaimSlot ENDP DailyClaimRewards PROC call DailyCheckDate invoke DailyClaimSlot, 0, 1 invoke DailyClaimSlot, 1, 2 invoke DailyClaimSlot, 2, 4 call SaveGame ret DailyClaimRewards ENDP ; --- PrintDailySlot: строка одного ежедневного задания --- PrintDailySlot PROC uses eax ebx ecx edx, slotIndex:DWORD, maskValue:DWORD mov ecx, slotIndex mov eax, ecx inc eax invoke PrintUInt, eax invoke PrintStr, OFFSET dotSpaceText movzx ebx, byte ptr [dailyTaskPacked + ecx] cmp ebx, 1 jb daily_slot_done cmp ebx, 40 ja daily_slot_done mov eax, ebx dec eax mov edx, dword ptr [dailyTaskNameTable + eax * 4] invoke PrintStr, edx invoke PrintStr, OFFSET dailySlashText mov ecx, slotIndex movzx eax, byte ptr [dailyProgressPacked + ecx] push eax invoke PrintUInt, eax invoke PrintStr, OFFSET dailySlashText invoke DailyTaskGoal, ebx mov edx, eax invoke PrintUInt, edx invoke PrintStr, OFFSET dailyRewardText invoke DailyTaskReward, ebx invoke PrintUInt, eax mov eax, dailyRewardMask and eax, maskValue cmp eax, 0 jne daily_slot_status_done pop eax cmp eax, edx jae daily_slot_status_ready invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET dailyOpenText call ResetColor ret daily_slot_status_ready: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET dailyReadyText call ResetColor ret daily_slot_status_done: pop eax invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET dailyDoneText call ResetColor ret daily_slot_done: ret PrintDailySlot ENDP GameDailyTasks PROC call ClearView invoke PrintTitleColor, OFFSET dailyTitle invoke PrintStr, OFFSET dailyIntro call DailyClaimRewards call PrintBank invoke PrintStr, OFFSET dailyDateText invoke PrintUInt, dailyDateKey invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET dailyPoolText invoke PrintDailySlot, 0, 1 invoke PrintDailySlot, 1, 2 invoke PrintDailySlot, 2, 4 call PauseConsole ret GameDailyTasks ENDP ; --- PrintDifficultyName: вывод текста, цветов, картинок и элементов интерфейса --- PrintDifficultyName PROC cmp aiDifficulty, 1 je print_easy_name cmp aiDifficulty, 3 je print_hard_name invoke PrintStr, OFFSET normalName ret print_easy_name: invoke PrintStr, OFFSET easyName ret print_hard_name: invoke PrintStr, OFFSET hardName ret PrintDifficultyName ENDP ; --- PrintBankLevelName: вывод текста, цветов, картинок и элементов интерфейса --- PrintBankLevelName PROC mov eax, bankroll cmp eax, 100000 jae print_level_legend cmp eax, 50000 jae print_level_high cmp eax, 20000 jae print_level_player invoke PrintStr, OFFSET bankLevelNewbie ret print_level_player: invoke PrintStr, OFFSET bankLevelPlayer ret print_level_high: invoke PrintStr, OFFSET bankLevelHigh ret print_level_legend: invoke PrintStr, OFFSET bankLevelLegend ret PrintBankLevelName ENDP ; --- PrintBankLevel: вывод текста, цветов, картинок и элементов интерфейса --- PrintBankLevel PROC invoke PrintStr, OFFSET bankLevelText call PrintBankLevelName ret PrintBankLevel ENDP ; --- ApplySoundVolume: настройки громкости WinMM, 0-10 --- ApplySoundVolume PROC uses eax edx mov eax, settingsVolume cmp eax, 10 jb volume_scaled mov eax, 0FFFFh jmp volume_pack volume_scaled: imul eax, eax, 6553 volume_pack: mov edx, eax shl edx, 16 or eax, edx invoke waveOutSetVolume, 0FFFFFFFFh, eax ret ApplySoundVolume ENDP ; --- AnimShouldDrawFrame: animation profile frame skipper --- AnimShouldDrawFrame PROC uses ecx edx inc animFrameCounter mov eax, settingsLowSpec cmp eax, 0 je anim_draw_yes cmp eax, 1 je anim_adaptive_check mov eax, animFrameCounter xor edx, edx mov ecx, 3 div ecx cmp edx, 1 je anim_draw_yes xor eax, eax ret anim_adaptive_check: mov eax, animFrameCounter and eax, 1 cmp eax, 1 je anim_draw_yes xor eax, eax ret anim_draw_yes: mov eax, 1 ret AnimShouldDrawFrame ENDP ; --- AnimFrameDelay: keeps scene timing while reducing redraws --- AnimFrameDelay PROC baseDelay:DWORD mov eax, baseDelay cmp settingsLowSpec, 1 je anim_delay_adaptive cmp settingsLowSpec, 2 je anim_delay_stable ret anim_delay_adaptive: shl eax, 1 ret anim_delay_stable: imul eax, eax, 3 ret AnimFrameDelay ENDP ; --- PrintVIPStatus: VIP-статус по размеру банка --- PrintVIPStatus PROC invoke PrintStr, OFFSET vipStatusText mov eax, bankroll cmp eax, 500000 jae print_vip_diamond cmp eax, 250000 jae print_vip_gold cmp eax, 100000 jae print_vip_silver invoke PrintStr, OFFSET vipBronzeText ret print_vip_silver: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET vipSilverText call ResetColor ret print_vip_gold: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET vipGoldText call ResetColor ret print_vip_diamond: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET vipDiamondText call ResetColor ret PrintVIPStatus ENDP ; --- ApplyVIPTax: казино берет комиссию с больших VIP-ставок --- ApplyVIPTax PROC uses eax ebx edx mov vipTaxAmount, 0 mov eax, bankroll cmp eax, 100000 jb vip_tax_done mov eax, currentBet cmp bankroll, 500000 jae vip_tax_diamond cmp bankroll, 250000 jae vip_tax_gold mov ebx, 1 jmp vip_tax_calc vip_tax_gold: mov ebx, 2 jmp vip_tax_calc vip_tax_diamond: mov ebx, 3 vip_tax_calc: mul ebx mov ebx, 100 xor edx, edx div ebx cmp eax, 0 jne vip_tax_have mov eax, 1 vip_tax_have: mov vipTaxAmount, eax cmp bankroll, eax jae vip_tax_sub mov eax, bankroll mov vipTaxAmount, eax vip_tax_sub: sub bankroll, eax invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET vipTaxText invoke PrintUInt, vipTaxAmount invoke PrintStr, OFFSET nl call ResetColor call SaveGame vip_tax_done: ret ApplyVIPTax ENDP ; --- CheckSecretEnding: секретная концовка за полное закрытие казино --- CheckSecretEnding PROC uses eax cmp secretEndingSeen, 0 jne secret_ending_done mov eax, achievements and eax, 3FFFFh cmp eax, 3FFFFh jne secret_ending_done mov eax, shopBackOwned and eax, 1FFFh cmp eax, 1FFFh jne secret_ending_done cmp bankroll, 1000000 jb secret_ending_done mov secretEndingSeen, 1 call SaveGame call ClearView call PlayVictorySound invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET secretEndingTitle invoke PrintStr, OFFSET secretEndingArt1 invoke Sleep, 500 invoke PrintStr, OFFSET secretEndingArt2 call ResetColor invoke PrintStr, OFFSET secretEndingBody call PauseConsole secret_ending_done: ret CheckSecretEnding ENDP ; --- GameSettings: настройки звука и игровых опций --- GameSettings PROC settings_loop: call ClearView invoke PrintTitleColor, OFFSET settingsTitle invoke PrintStr, OFFSET settingsVolumeText invoke PrintUInt, settingsVolume invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET settingsVolumeHint call PrintVIPStatus invoke PrintStr, OFFSET settingsModeText cmp settingsLowSpec, 0 je settings_print_cinematic cmp settingsLowSpec, 1 je settings_print_adaptive invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET settingsStableText call ResetColor jmp settings_print_intro settings_print_cinematic: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET settingsCinematicText call ResetColor jmp settings_print_intro settings_print_adaptive: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET settingsAdaptiveText call ResetColor settings_print_intro: invoke PrintStr, OFFSET settingsIntroText cmp settingsIntroEnabled, 1 je settings_intro_on invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET settingsOffText call ResetColor jmp settings_print_dbd settings_intro_on: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET settingsOnText call ResetColor settings_print_dbd: invoke PrintStr, OFFSET settingsDbdText cmp settingsDbdWindowEnabled, 1 je settings_dbd_on invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET settingsOffText call ResetColor jmp settings_show_menu settings_dbd_on: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET settingsOnText call ResetColor settings_show_menu: invoke PrintStr, OFFSET settingsAnimHintText invoke PrintStr, OFFSET settingsMenuText call ReadUInt cmp eax, 0 je settings_exit cmp eax, 1 je settings_quieter cmp eax, 2 je settings_louder cmp eax, 3 je settings_toggle_low cmp eax, 4 je settings_toggle_intro cmp eax, 5 je settings_toggle_dbd invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp settings_loop settings_quieter: cmp settingsVolume, 0 jbe settings_apply dec settingsVolume jmp settings_apply settings_louder: cmp settingsVolume, 10 jae settings_apply inc settingsVolume jmp settings_apply settings_toggle_low: inc settingsLowSpec cmp settingsLowSpec, 3 jb settings_apply mov settingsLowSpec, 0 jmp settings_apply settings_toggle_intro: mov eax, settingsIntroEnabled xor eax, 1 mov settingsIntroEnabled, eax jmp settings_apply settings_toggle_dbd: mov eax, settingsDbdWindowEnabled xor eax, 1 mov settingsDbdWindowEnabled, eax settings_apply: call ApplySoundVolume call SaveGame jmp settings_loop settings_exit: ret GameSettings ENDP ; --- CalcStressLevel: банк, ставки, стресс, подозрение и экономика казино --- CalcStressLevel PROC uses eax ebx edx mov stressLevel, 0 cmp bankroll, 0 je calc_stress_done cmp currentBet, 0 je calc_stress_done mov eax, currentBet mov ebx, 100 mul ebx mov ebx, bankroll xor edx, edx div ebx cmp eax, 75 jae calc_stress_max cmp eax, 50 jae calc_stress_high cmp eax, 25 jae calc_stress_mid jmp calc_stress_done calc_stress_mid: mov stressLevel, 1 jmp calc_stress_done calc_stress_high: mov stressLevel, 2 jmp calc_stress_done calc_stress_max: mov stressLevel, 3 calc_stress_done: ret CalcStressLevel ENDP ; --- PrintStressLevel: вывод текста, цветов, картинок и элементов интерфейса --- PrintStressLevel PROC invoke PrintStr, OFFSET stressText mov eax, stressLevel cmp eax, 0 je print_stress_low cmp eax, 1 je print_stress_mid cmp eax, 2 je print_stress_high invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET stressMaxText call ResetColor ret print_stress_low: invoke PrintStr, OFFSET stressLowText ret print_stress_mid: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET stressMidText call ResetColor ret print_stress_high: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET stressHighText call ResetColor ret PrintStressLevel ENDP ; --- PrintSuspicion: вывод текста, цветов, картинок и элементов интерфейса --- PrintSuspicion PROC invoke PrintStr, OFFSET suspicionText mov eax, casinoSuspicion cmp eax, 44 jae print_suspicion_hunt cmp eax, 25 jae print_suspicion_watch invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET suspicionCalmText call ResetColor ret print_suspicion_watch: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET suspicionWatchText call ResetColor ret print_suspicion_hunt: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET suspicionHuntText call ResetColor ret PrintSuspicion ENDP ; --- AddSuspicion: банк, ставки, стресс, подозрение и экономика казино --- AddSuspicion PROC uses eax ebx, amount:DWORD mov eax, casinoSuspicion add eax, amount cmp eax, 100 jbe add_suspicion_store mov eax, 100 add_suspicion_store: mov casinoSuspicion, eax invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET suspicionUpText call ResetColor call SaveGame ret AddSuspicion ENDP ; --- CheckCasinoHeat: служебный блок игровой логики --- CheckCasinoHeat PROC uses eax ebx mov eax, casinoSuspicion cmp eax, 44 jb casino_heat_done sub eax, 40 mov ebx, eax invoke RandomRange, 100 cmp eax, ebx jae casino_heat_done mov eax, currentBet shr eax, 1 cmp eax, 1 jae casino_heat_have_fine mov eax, 1 casino_heat_have_fine: cmp bankroll, eax jae casino_heat_sub mov eax, bankroll casino_heat_sub: sub bankroll, eax invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET suspicionFineText invoke PrintUInt, eax invoke PrintStr, OFFSET nl call ResetColor call PrintBank call SaveGame casino_heat_done: ret CheckCasinoHeat ENDP ; --- ShowStats: статистика, достижения и таблицы лидеров --- ShowStats PROC invoke PrintStr, OFFSET difficultyNowText call PrintDifficultyName call PrintBankLevel invoke PrintStr, OFFSET statsGamesText invoke PrintUInt, gamesPlayed invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET statsWinsText invoke PrintUInt, gamesWon invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET statsLossText invoke PrintUInt, gamesLost invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET statsDrawText invoke PrintUInt, gamesDrawn invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET statsBestWinText invoke PrintUInt, bestWin invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET statsBestLossText invoke PrintUInt, bestLoss invoke PrintStr, OFFSET nl call PrintSuspicion ret ShowStats ENDP ; --- WriteAchievementPopup: статистика, достижения и таблицы лидеров --- WriteAchievementPopup PROC uses eax ecx esi, pName:DWORD mov esi, pName xor ecx, ecx achievement_len_loop: mov al, [esi + ecx] cmp al, 0 je achievement_len_ready cmp al, 13 je achievement_len_ready cmp ecx, 64 jae achievement_len_ready inc ecx jmp achievement_len_loop achievement_len_ready: invoke CreateFileA, OFFSET achievementFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je achievement_popup_run mov achievementHandle, eax invoke WriteFile, achievementHandle, pName, ecx, ADDR charsWritten, 0 invoke CloseHandle, achievementHandle achievement_popup_run: invoke WinExec, OFFSET achievementCmd, 1 ret WriteAchievementPopup ENDP ; --- UnlockAchievement: статистика, достижения и таблицы лидеров --- UnlockAchievement PROC uses eax ebx, maskValue:DWORD, pName:DWORD mov eax, achievements mov ebx, maskValue test eax, ebx jz unlock_achievement_new ret unlock_achievement_new: or eax, ebx mov achievements, eax call SaveGame invoke WriteAchievementPopup, pName ret UnlockAchievement ENDP ; --- PrintAchievementLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintAchievementLine PROC uses eax ebx, maskValue:DWORD, pName:DWORD mov eax, achievements mov ebx, maskValue test eax, ebx jz print_achievement_locked invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET achDoneText call ResetColor jmp print_achievement_name print_achievement_locked: invoke SetColor, COLOR_BACK_CARD invoke PrintStr, OFFSET achTodoText call ResetColor print_achievement_name: invoke PrintStr, pName ret PrintAchievementLine ENDP ; --- ShowWelcome: служебный блок игровой логики --- ShowWelcome PROC call ClearView invoke PrintTitleColor, OFFSET titleText invoke PrintStr, OFFSET welcomeText call PrintGoal cmp bankRecovered, 0 je welcome_check_tampered invoke PrintStr, OFFSET bankRecoveredText welcome_check_tampered: cmp saveTampered, 0 je welcome_bank_normal invoke PrintStr, OFFSET saveTamperedText welcome_bank_normal: call PrintBank call ShowStats call PauseConsole ret ShowWelcome ENDP ; --- SelectDifficulty: служебный блок игровой логики --- SelectDifficulty PROC select_difficulty_again: call ClearView invoke PrintTitleColor, OFFSET titleText invoke PrintStr, OFFSET difficultyText call ReadKey cmp al, '1' je set_easy_ai cmp al, '2' je set_normal_ai cmp al, '3' je set_hard_ai jmp select_difficulty_again set_easy_ai: mov aiDifficulty, 1 jmp difficulty_selected set_normal_ai: mov aiDifficulty, 2 jmp difficulty_selected set_hard_ai: mov aiDifficulty, 3 difficulty_selected: call SaveGame ret SelectDifficulty ENDP ; --- ShowPokerChips: покер: оценка комбинаций, ставки, фолды и ИИ --- ShowPokerChips PROC uses eax ebx edx invoke PrintStr, OFFSET pokerChipTitle mov eax, currentBet mov ebx, 5000 xor edx, edx div ebx add eax, 5 cmp eax, 10 jbe poker_chips_count_ready mov eax, 10 poker_chips_count_ready: mov rowIndex, eax poker_chips_loop: cmp rowIndex, 0 je poker_chips_done mov eax, rowIndex cmp eax, 7 ja poker_chips_high cmp eax, 4 ja poker_chips_mid invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET pokerChipLow jmp poker_chips_next poker_chips_mid: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET pokerChipMid jmp poker_chips_next poker_chips_high: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET pokerChipHigh poker_chips_next: dec rowIndex jmp poker_chips_loop poker_chips_done: call ResetColor ret ShowPokerChips ENDP ; --- ShowPokerMoney: покер: оценка комбинаций, ставки, фолды и ИИ --- ShowPokerMoney PROC uses eax ebx call ShowPokerChips invoke PrintStr, OFFSET pokerPotText mov eax, currentBet mov ebx, 2 mul ebx invoke PrintUInt, eax invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET pokerBetText invoke PrintUInt, currentBet invoke PrintStr, OFFSET nl ret ShowPokerMoney ENDP ; --- PromptPokerRaise: покер: оценка комбинаций, ставки, фолды и ИИ --- PromptPokerRaise PROC uses ebx call PrintBank invoke PrintStr, OFFSET pokerRaiseAskText call ReadUInt cmp eax, 0 je raise_bad mov pokerRaiseAmount, eax mov ebx, currentBet add ebx, eax cmp ebx, bankroll ja raise_bad mov currentBet, ebx invoke PrintStr, OFFSET pokerRaisedText invoke PrintUInt, currentBet invoke PrintStr, OFFSET nl mov eax, 1 ret raise_bad: invoke PrintStr, OFFSET pokerBadRaiseText xor eax, eax ret PromptPokerRaise ENDP ; --- PaySlotMultiplier: банк, ставки, стресс, подозрение и экономика казино --- PaySlotMultiplier PROC uses eax ebx edx, multiplier:DWORD mov lastGameResult, 1 mov eax, currentBet mov ebx, multiplier mul ebx mov pokerRaiseAmount, eax add bankroll, eax invoke PrintStr, OFFSET slotPayoutText invoke PrintUInt, multiplier invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET moneyWinText invoke PrintUInt, pokerRaiseAmount invoke PrintStr, OFFSET nl invoke RegisterWin, pokerRaiseAmount invoke UnlockAchievement, 1, OFFSET achFirstWinName call PrintBank call PrintCroupierWin cmp multiplier, 10 jb slot_multiplier_no_ach invoke UnlockAchievement, 4, OFFSET achJackpotName slot_multiplier_no_ach: call CheckVictory ret PaySlotMultiplier ENDP ; --- CheckBankrupt: банк, ставки, стресс, подозрение и экономика казино --- CheckBankrupt PROC cmp bankroll, 0 ja bankroll_ok call PlayBankruptSound invoke Sleep, 300 invoke PrintStr, OFFSET casinoKickText invoke PrintStr, OFFSET casinoExitText call ReadAnyKey invoke ExitProcess, 0 bankroll_ok: ret CheckBankrupt ENDP ; --- CheckVictory: банк, ставки, стресс, подозрение и экономика казино --- CheckVictory PROC mov eax, bankroll cmp eax, targetBank jb victory_not_yet call PlayVictorySound call ClearView invoke PrintTitleColor, OFFSET titleText invoke PrintStr, OFFSET victoryText invoke PrintStr, OFFSET victoryReachedText invoke PrintUInt, targetBank invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET victoryTailText call PrintBank advance_victory_goal: mov eax, bankroll cmp eax, targetBank jb victory_goal_ready add targetBank, 50000 jmp advance_victory_goal victory_goal_ready: call SaveGame invoke UnlockAchievement, 40h, OFFSET achGoalName invoke PrintStr, OFFSET nextGoalText invoke PrintUInt, targetBank invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET victoryExitText call CheckSecretEnding victory_secret_checked: call ReadAnyKey ret victory_not_yet: call CheckSecretEnding ret CheckVictory ENDP ; --- ShowStressPulse: банк, ставки, стресс, подозрение и экономика казино --- ShowStressPulse PROC uses eax ebx edx cmp bankroll, 0 je stress_pulse_done mov eax, currentBet cmp eax, 0 je stress_pulse_done mov ebx, 100 mul ebx mov ebx, bankroll xor edx, edx div ebx cmp eax, 25 jb stress_pulse_done invoke PrintStr, OFFSET pulseTitleText cmp eax, 50 jae stress_pulse_hot invoke SetColor, COLOR_WARN jmp stress_pulse_frames stress_pulse_hot: invoke SetColor, COLOR_BAD stress_pulse_frames: mov eax, stressLevel inc eax mov pulseCycles, eax stress_pulse_cycle: invoke PrintStr, OFFSET pulseFrame1 invoke Sleep, 70 invoke PrintStr, OFFSET pulseFrame2 invoke Sleep, 70 invoke PrintStr, OFFSET pulseFrame3 invoke Sleep, 70 invoke PrintStr, OFFSET pulseFrame4 invoke Sleep, 70 invoke PrintStr, OFFSET pulseFrame5 invoke Sleep, 90 dec pulseCycles cmp pulseCycles, 0 jne stress_pulse_cycle call ResetColor stress_pulse_done: ret ShowStressPulse ENDP ; --- PromptBet: банк, ставки, стресс, подозрение и экономика казино --- PromptBet PROC prompt_bet_again: call CheckBankrupt call PrintBank invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET betText call ReadBetInput push eax call ResetColor pop eax cmp eax, 0FFFFFFFFh je prompt_bet_again cmp eax, 0FFFFFFFEh je prompt_bet_again cmp eax, 0FFFFFFFDh je prompt_bet_again cmp eax, 0 jne bet_check_money invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET badBetText call ResetColor jmp prompt_bet_again bet_check_money: cmp eax, bankroll jbe bet_store invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET tooBigBetText call ResetColor jmp prompt_bet_again bet_store: mov currentBet, eax call ApplyVIPTax cmp currentBet, 10000 jb bet_highroller_done invoke UnlockAchievement, 8, OFFSET achHighRollerName bet_highroller_done: call DailyAddHighBet invoke PrintStr, OFFSET betChosenText invoke PrintMoney, currentBet invoke PrintStr, OFFSET nl call CalcStressLevel call PrintStressLevel call ShowStressPulse invoke Sleep, 500 ret PromptBet ENDP ; --- PayWin: банк, ставки, стресс, подозрение и экономика казино --- PayWin PROC mov lastGameResult, 1 mov eax, currentBet add bankroll, eax invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET moneyWinText invoke PrintUInt, currentBet call ResetColor invoke PrintStr, OFFSET nl invoke RegisterWin, currentBet invoke UnlockAchievement, 1, OFFSET achFirstWinName call PrintBank call PrintCroupierWin call CheckVictory ret PayWin ENDP ; --- TryCharmSave: талисманы спасают ставку, но у сильных есть цена --- TryCharmSave PROC uses ebx ecx edx cmp shopCharmLevel, 0 jne charm_has_level xor eax, eax ret charm_has_level: cmp shopCharmUses, 0 jne charm_has_uses mov shopCharmLevel, 0 xor eax, eax ret charm_has_uses: mov ebx, shopCharmLevel cmp ebx, 1 je charm_chance_clover cmp ebx, 2 je charm_chance_bell cmp ebx, 3 je charm_chance_diamond cmp ebx, 4 je charm_chance_skull cmp ebx, 5 je charm_chance_web cmp ebx, 6 je charm_chance_bee cmp ebx, 7 je charm_chance_moon cmp ebx, 8 je charm_chance_crown cmp ebx, 9 je charm_chance_mirror cmp ebx, 10 je charm_chance_dice cmp ebx, 11 je charm_chance_blood cmp ebx, 12 je charm_chance_hourglass cmp ebx, 13 je charm_chance_horseshoe cmp ebx, 14 je charm_chance_joker cmp ebx, 15 je charm_chance_phoenix cmp ebx, 16 je charm_chance_compass cmp ebx, 17 je charm_chance_tooth cmp ebx, 18 je charm_chance_eye cmp ebx, 19 je charm_chance_key cmp ebx, 20 je charm_chance_candle cmp ebx, 21 je charm_chance_chip cmp ebx, 22 je charm_chance_snake cmp ebx, 23 je charm_chance_ace cmp ebx, 24 je charm_chance_devil xor eax, eax ret charm_chance_clover: mov ecx, 7 jmp charm_roll charm_chance_bell: mov ecx, 14 jmp charm_roll charm_chance_diamond: mov ecx, 21 jmp charm_roll charm_chance_skull: mov ecx, 28 jmp charm_roll charm_chance_web: mov ecx, 35 jmp charm_roll charm_chance_bee: mov ecx, 12 jmp charm_roll charm_chance_moon: mov ecx, 18 jmp charm_roll charm_chance_crown: mov ecx, 24 jmp charm_roll charm_chance_mirror: mov ecx, 16 jmp charm_roll charm_chance_dice: mov ecx, 10 jmp charm_roll charm_chance_blood: mov ecx, 40 jmp charm_roll charm_chance_hourglass: mov ecx, 22 jmp charm_roll charm_chance_horseshoe: mov ecx, 9 jmp charm_roll charm_chance_joker: mov ecx, 33 jmp charm_roll charm_chance_phoenix: mov ecx, 26 jmp charm_roll charm_chance_compass: mov ecx, 19 jmp charm_roll charm_chance_tooth: mov ecx, 15 jmp charm_roll charm_chance_eye: mov ecx, 31 jmp charm_roll charm_chance_key: mov ecx, 13 jmp charm_roll charm_chance_candle: mov ecx, 38 jmp charm_roll charm_chance_chip: mov ecx, 20 jmp charm_roll charm_chance_snake: mov ecx, 29 jmp charm_roll charm_chance_ace: mov ecx, 17 jmp charm_roll charm_chance_devil: mov ecx, 50 charm_roll: invoke RandomRange, 100 cmp eax, ecx jb charm_save_hit xor eax, eax ret charm_save_hit: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopCharmSaveText call ResetColor dec shopCharmUses mov ebx, shopCharmLevel cmp ebx, 2 je charm_penalty_bell cmp ebx, 3 je charm_penalty_diamond cmp ebx, 4 je charm_penalty_skull cmp ebx, 5 je charm_penalty_web cmp ebx, 7 je charm_penalty_moon cmp ebx, 8 je charm_penalty_crown cmp ebx, 9 je charm_penalty_mirror cmp ebx, 11 je charm_penalty_blood cmp ebx, 12 je charm_penalty_hourglass cmp ebx, 14 je charm_penalty_joker cmp ebx, 15 je charm_penalty_phoenix cmp ebx, 16 je charm_penalty_compass cmp ebx, 17 je charm_penalty_tooth cmp ebx, 18 je charm_penalty_eye cmp ebx, 20 je charm_penalty_candle cmp ebx, 22 je charm_penalty_snake cmp ebx, 23 je charm_penalty_ace cmp ebx, 24 je charm_penalty_devil jmp charm_penalty_done charm_penalty_bell: invoke AddSuspicion, 4 jmp charm_penalty_done charm_penalty_diamond: invoke AddSuspicion, 8 jmp charm_penalty_done charm_penalty_web: invoke AddSuspicion, 20 jmp charm_penalty_done charm_penalty_moon: invoke AddSuspicion, 8 jmp charm_penalty_done charm_penalty_crown: invoke AddSuspicion, 12 jmp charm_penalty_done charm_penalty_mirror: invoke AddSuspicion, 6 jmp charm_penalty_done charm_penalty_hourglass: invoke AddSuspicion, 15 jmp charm_penalty_done charm_penalty_joker: invoke AddSuspicion, 30 jmp charm_penalty_done charm_penalty_phoenix: invoke AddSuspicion, 10 jmp charm_penalty_done charm_penalty_compass: invoke AddSuspicion, 12 jmp charm_penalty_done charm_penalty_eye: invoke AddSuspicion, 18 jmp charm_penalty_done charm_penalty_snake: invoke AddSuspicion, 16 jmp charm_penalty_done charm_penalty_ace: invoke AddSuspicion, 7 jmp charm_penalty_done charm_penalty_blood: invoke AddSuspicion, 25 mov ebx, 4 jmp charm_take_fraction charm_penalty_skull: mov ebx, 2 jmp charm_take_fraction charm_penalty_tooth: mov ebx, 5 jmp charm_take_fraction charm_penalty_candle: invoke AddSuspicion, 35 mov ebx, 3 jmp charm_take_fraction charm_penalty_devil: invoke AddSuspicion, 45 mov ebx, 2 charm_take_fraction: mov eax, currentBet xor edx, edx div ebx cmp eax, 1 jae charm_have_price mov eax, 1 charm_have_price: cmp bankroll, eax jae charm_sub_price mov eax, bankroll charm_sub_price: sub bankroll, eax invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET charmPenaltyText invoke PrintUInt, eax invoke PrintStr, OFFSET nl call ResetColor charm_penalty_done: call RegisterDraw invoke UnlockAchievement, 20h, OFFSET achCharmName cmp shopCharmUses, 0 jne charm_still_alive mov shopCharmLevel, 0 invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopCharmBurnText call ResetColor charm_still_alive: call SaveGame call PrintBank call PrintCroupierDraw mov eax, 1 ret TryCharmSave ENDP ; --- PayLose: банк, ставки, стресс, подозрение и экономика казино --- PayLose PROC cmp cheatGodMode, 0 jne pay_lose_cheat_win cmp cheatLuckyWin, 0 jne pay_lose_cheat_once jmp pay_lose_normal pay_lose_cheat_once: mov cheatLuckyWin, 0 pay_lose_cheat_win: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET cheatSavedText call ResetColor call PayWin ret pay_lose_normal: call TryCharmSave cmp eax, 1 je pay_lose_charm_saved mov eax, currentBet cmp bankroll, eax jae pay_lose_sub mov bankroll, 0 jmp pay_lose_done pay_lose_sub: sub bankroll, eax pay_lose_done: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET moneyLoseText invoke PrintUInt, currentBet call ResetColor invoke PrintStr, OFFSET nl invoke RegisterLoss, currentBet call PrintBank call PrintCroupierLose call CheckBankrupt pay_lose_charm_saved: ret PayLose ENDP ; --- PayDraw: банк, ставки, стресс, подозрение и экономика казино --- PayDraw PROC mov lastGameResult, 3 invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET moneyDrawText call ResetColor call RegisterDraw call PrintBank call PrintCroupierDraw ret PayDraw ENDP ; --- PaySlotPair: банк, ставки, стресс, подозрение и экономика казино --- PaySlotPair PROC mov lastGameResult, 1 mov eax, currentBet add bankroll, eax invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET moneyWinText invoke PrintUInt, currentBet call ResetColor invoke PrintStr, OFFSET nl call PrintBank ret PaySlotPair ENDP ; --- PaySlotJackpot: банк, ставки, стресс, подозрение и экономика казино --- PaySlotJackpot PROC uses ebx mov lastGameResult, 1 mov eax, currentBet mov ebx, 5 mul ebx add bankroll, eax invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET moneyWinText invoke PrintUInt, eax call ResetColor invoke PrintStr, OFFSET nl call PrintBank invoke UnlockAchievement, 4, OFFSET achJackpotName ret PaySlotJackpot ENDP ; --- ConfigureConsoleSize: задает стартовый размер окна консоли без масштабирования ASCII --- ConfigureConsoleSize PROC invoke SetConsoleWindowInfo, hOut, 1, OFFSET consoleRectTiny invoke SetConsoleScreenBufferSize, hOut, 012C00A0h ; 160 x 300 buffer cmp eax, 0 je try_console_140 invoke SetConsoleWindowInfo, hOut, 1, OFFSET consoleRect160 cmp eax, 0 jne console_size_done try_console_140: invoke SetConsoleWindowInfo, hOut, 1, OFFSET consoleRectTiny invoke SetConsoleScreenBufferSize, hOut, 012C008Ch ; 140 x 300 buffer cmp eax, 0 je try_console_120 invoke SetConsoleWindowInfo, hOut, 1, OFFSET consoleRect140 cmp eax, 0 jne console_size_done try_console_120: invoke SetConsoleWindowInfo, hOut, 1, OFFSET consoleRectTiny invoke SetConsoleScreenBufferSize, hOut, 012C0078h ; 120 x 300 buffer cmp eax, 0 je console_size_done invoke SetConsoleWindowInfo, hOut, 1, OFFSET consoleRect120 console_size_done: ret ConfigureConsoleSize ENDP ; --- HomeCursor: служебные функции консоли и случайных чисел --- HomeCursor PROC invoke SetConsoleCursorPosition, hOut, 0 ret HomeCursor ENDP ; --- ClearView: служебные функции консоли и случайных чисел --- ClearView PROC uses eax edx LOCAL csbi[22]:BYTE LOCAL cells:DWORD call ResetColor invoke GetConsoleScreenBufferInfo, hOut, ADDR csbi cmp eax, 0 jne clear_console_buffer invoke PrintStr, OFFSET clearLines ret clear_console_buffer: movzx eax, word ptr csbi[0] movzx edx, word ptr csbi[2] mul edx mov cells, eax invoke FillConsoleOutputCharacterA, hOut, 32, cells, 0, ADDR charsWritten call HomeCursor ret ClearView ENDP ; --- RandomRange: служебные функции консоли и случайных чисел --- RandomRange PROC uses ecx edx, range:DWORD mov eax, seed imul eax, 214013 add eax, 2531011 mov seed, eax shr eax, 16 and eax, 7FFFh xor edx, edx mov ecx, range div ecx mov eax, edx ret RandomRange ENDP ; --- ResetDeck: карты, руки, очки и базовая карточная логика --- ResetDeck PROC uses ecx edi mov ecx, 52 mov edi, OFFSET deckUsed reset_loop: mov byte ptr [edi], 0 inc edi loop reset_loop ret ResetDeck ENDP ; --- DrawCard: карты, руки, очки и базовая карточная логика --- DrawCard PROC uses edi draw_again: invoke RandomRange, 52 mov edi, OFFSET deckUsed add edi, eax cmp byte ptr [edi], 0 jne draw_again mov byte ptr [edi], 1 ret DrawCard ENDP ; --- CardValue21: карты, руки, очки и базовая карточная логика --- CardValue21 PROC uses ecx edx, card:DWORD mov eax, card xor edx, edx mov ecx, 13 div ecx mov eax, edx cmp eax, 8 jbe numeric_card cmp eax, 9 je jack_card cmp eax, 10 je queen_card cmp eax, 11 je king_card mov eax, 11 ret numeric_card: add eax, 2 ret jack_card: mov eax, 2 ret queen_card: mov eax, 3 ret king_card: mov eax, 4 ret CardValue21 ENDP ; --- CardValueBJ: карты, руки, очки и базовая карточная логика --- CardValueBJ PROC uses ecx edx, card:DWORD mov eax, card xor edx, edx mov ecx, 13 div ecx mov eax, edx cmp eax, 8 jbe bj_numeric cmp eax, 12 je bj_ace mov eax, 10 ret bj_numeric: add eax, 2 ret bj_ace: mov eax, 11 ret CardValueBJ ENDP ; --- AdjustPlayerAces: карты, руки, очки и базовая карточная логика --- AdjustPlayerAces PROC adjust_player: cmp playerTotal, 21 jbe adjust_player_done cmp playerAces, 0 je adjust_player_done sub playerTotal, 10 dec playerAces jmp adjust_player adjust_player_done: ret AdjustPlayerAces ENDP ; --- AdjustDealerAces: карты, руки, очки и базовая карточная логика --- AdjustDealerAces PROC adjust_dealer: cmp dealerTotal, 21 jbe adjust_dealer_done cmp dealerAces, 0 je adjust_dealer_done sub dealerTotal, 10 dec dealerAces jmp adjust_dealer adjust_dealer_done: ret AdjustDealerAces ENDP ; --- PrintScore: вывод текста, цветов, картинок и элементов интерфейса --- PrintScore PROC invoke PrintStr, OFFSET yourScoreText invoke PrintUInt, playerTotal invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET dealerScoreText invoke PrintUInt, dealerTotal invoke PrintStr, OFFSET nl ret PrintScore ENDP ; --- PrintCard: вывод текста, цветов, картинок и элементов интерфейса --- PrintCard PROC uses eax ebx ecx edx esi, card:DWORD mov eax, card xor edx, edx mov ecx, 13 div ecx mov ebx, eax mov esi, edx invoke PrintUtf8, OFFSET cardTop invoke PrintUtf8, OFFSET cardSuitLeft invoke PrintSuit, ebx invoke PrintUtf8, OFFSET cardSuitRight cmp esi, 8 jne one_rank invoke PrintUtf8, OFFSET cardRankTenL invoke PrintStr, ranks[esi * 4] invoke PrintUtf8, OFFSET cardRankTenR jmp rank_done one_rank: invoke PrintUtf8, OFFSET cardRankOneL invoke PrintStr, ranks[esi * 4] invoke PrintUtf8, OFFSET cardRankOneR rank_done: invoke PrintUtf8, OFFSET cardEmpty invoke PrintUtf8, OFFSET cardEmpty invoke PrintUtf8, OFFSET cardCenterL invoke PrintSuit, ebx invoke PrintUtf8, OFFSET cardCenterR invoke PrintUtf8, OFFSET cardBottom ret PrintCard ENDP ; --- AddPlayer21: карты, руки, очки и базовая карточная логика --- AddPlayer21 PROC uses eax ebx call PlayCardSound call DrawCard mov ebx, eax invoke PrintStr, OFFSET yourCardText invoke PrintCard, ebx invoke CardValue21, ebx add playerTotal, eax ret AddPlayer21 ENDP ; --- AddDealer21: карты, руки, очки и базовая карточная логика --- AddDealer21 PROC uses eax ebx call PlayCardSound call DrawCard mov ebx, eax invoke PrintStr, OFFSET dealerCardText invoke PrintCard, ebx invoke CardValue21, ebx add dealerTotal, eax ret AddDealer21 ENDP ; --- Reset21Hands: карты, руки, очки и базовая карточная логика --- Reset21Hands PROC mov playerTotal, 0 mov dealerTotal, 0 mov playerCnt21, 0 mov aiCnt21, 0 mov revealAI21, 0 ret Reset21Hands ENDP ; --- DrawPlayer21Hand: карты, руки, очки и базовая карточная логика --- DrawPlayer21Hand PROC uses ebx ecx cmp playerCnt21, 10 jae draw_player21_done call PlayCardSound call DrawCard mov ebx, playerCnt21 mov playerHand21[ebx * 4], eax inc playerCnt21 draw_player21_done: ret DrawPlayer21Hand ENDP ; --- DrawAI21Hand: карты, руки, очки и базовая карточная логика --- DrawAI21Hand PROC uses ebx ecx cmp aiCnt21, 10 jae draw_ai21_done call PlayCardSound call DrawCard mov ebx, aiCnt21 mov aiHand21[ebx * 4], eax inc aiCnt21 draw_ai21_done: ret DrawAI21Hand ENDP ; --- PrintHandTop: вывод текста, цветов, картинок и элементов интерфейса --- PrintHandTop PROC uses eax, count:DWORD mov rowIndex, 0 top_loop: mov eax, rowIndex cmp eax, count jae top_done invoke PrintUtf8, OFFSET cardTopSeg invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp top_loop top_done: invoke PrintStr, OFFSET nl ret PrintHandTop ENDP ; --- PrintHandBottom: вывод текста, цветов, картинок и элементов интерфейса --- PrintHandBottom PROC uses eax, count:DWORD mov rowIndex, 0 bottom_loop: mov eax, rowIndex cmp eax, count jae bottom_done invoke PrintUtf8, OFFSET cardBottomSeg invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp bottom_loop bottom_done: invoke PrintStr, OFFSET nl ret PrintHandBottom ENDP ; --- PrintHandBlankLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintHandBlankLine PROC uses eax, count:DWORD, reveal:DWORD mov rowIndex, 0 blank_loop: mov eax, rowIndex cmp eax, count jae blank_done cmp reveal, 0 je blank_hidden invoke PrintUtf8, OFFSET cardEmptySeg jmp blank_next blank_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 4 call ResetColor blank_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp blank_loop blank_done: invoke PrintStr, OFFSET nl ret PrintHandBlankLine ENDP ; --- PrintHandSuitLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintHandSuitLine PROC uses eax ebx ecx edx, pHand:DWORD, count:DWORD, reveal:DWORD LOCAL suitIndex:DWORD mov rowIndex, 0 suit_loop: mov eax, rowIndex cmp eax, count jae suit_done cmp reveal, 0 je suit_hidden mov ebx, pHand mov eax, [ebx + eax * 4] xor edx, edx mov ecx, 13 div ecx mov suitIndex, eax invoke PrintUtf8, OFFSET cardSuitLeft mov eax, suitIndex invoke PrintSuit, eax invoke PrintUtf8, OFFSET cardSuitRightSeg jmp suit_next suit_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 1 call ResetColor suit_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp suit_loop suit_done: invoke PrintStr, OFFSET nl ret PrintHandSuitLine ENDP ; --- PrintHandRankLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintHandRankLine PROC uses eax ebx ecx edx, pHand:DWORD, count:DWORD, reveal:DWORD LOCAL rankIndex:DWORD mov rowIndex, 0 rank_loop_row: mov eax, rowIndex cmp eax, count jae rank_done_row cmp reveal, 0 je rank_hidden mov ebx, pHand mov eax, [ebx + eax * 4] xor edx, edx mov ecx, 13 div ecx mov rankIndex, edx cmp edx, 8 jne rank_one_char invoke PrintUtf8, OFFSET cardRankTenL mov eax, rankIndex invoke PrintStr, ranks[eax * 4] invoke PrintUtf8, OFFSET cardRankTenRSeg jmp rank_next rank_one_char: invoke PrintUtf8, OFFSET cardRankOneL mov eax, rankIndex invoke PrintStr, ranks[eax * 4] invoke PrintUtf8, OFFSET cardRankOneRSeg jmp rank_next rank_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 2 call ResetColor rank_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp rank_loop_row rank_done_row: invoke PrintStr, OFFSET nl ret PrintHandRankLine ENDP ; --- PrintHandCenterLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintHandCenterLine PROC uses eax ebx ecx edx, pHand:DWORD, count:DWORD, reveal:DWORD LOCAL suitIndex:DWORD mov rowIndex, 0 center_loop: mov eax, rowIndex cmp eax, count jae center_done cmp reveal, 0 je center_hidden mov ebx, pHand mov eax, [ebx + eax * 4] xor edx, edx mov ecx, 13 div ecx mov suitIndex, eax invoke PrintUtf8, OFFSET cardCenterL mov eax, suitIndex invoke PrintSuit, eax invoke PrintUtf8, OFFSET cardCenterRSeg jmp center_next center_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 5 call ResetColor center_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp center_loop center_done: invoke PrintStr, OFFSET nl ret PrintHandCenterLine ENDP ; --- PrintHandRow21: вывод текста, цветов, картинок и элементов интерфейса --- PrintHandRow21 PROC pHand:DWORD, count:DWORD, reveal:DWORD invoke PrintHandTop, count invoke PrintHandSuitLine, pHand, count, reveal invoke PrintHandRankLine, pHand, count, reveal invoke PrintHandBlankLine, count, reveal invoke PrintHandBlankLine, count, reveal invoke PrintHandCenterLine, pHand, count, reveal invoke PrintHandBottom, count ret PrintHandRow21 ENDP ; --- PrintCommunitySuitLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintCommunitySuitLine PROC uses eax ebx ecx edx LOCAL suitIndex:DWORD mov rowIndex, 0 community_suit_loop: mov eax, rowIndex cmp eax, 5 jae community_suit_done cmp eax, communityCnt jae community_suit_hidden mov eax, communityHand[eax * 4] xor edx, edx mov ecx, 13 div ecx mov suitIndex, eax invoke PrintUtf8, OFFSET cardSuitLeft mov eax, suitIndex invoke PrintSuit, eax invoke PrintUtf8, OFFSET cardSuitRightSeg jmp community_suit_next community_suit_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 1 call ResetColor community_suit_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp community_suit_loop community_suit_done: invoke PrintStr, OFFSET nl ret PrintCommunitySuitLine ENDP ; --- PrintCommunityRankLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintCommunityRankLine PROC uses eax ecx edx LOCAL rankIndex:DWORD mov rowIndex, 0 community_rank_loop: mov eax, rowIndex cmp eax, 5 jae community_rank_done cmp eax, communityCnt jae community_rank_hidden mov eax, communityHand[eax * 4] xor edx, edx mov ecx, 13 div ecx mov rankIndex, edx cmp edx, 8 jne community_rank_one invoke PrintUtf8, OFFSET cardRankTenL mov eax, rankIndex invoke PrintStr, ranks[eax * 4] invoke PrintUtf8, OFFSET cardRankTenRSeg jmp community_rank_next community_rank_one: invoke PrintUtf8, OFFSET cardRankOneL mov eax, rankIndex invoke PrintStr, ranks[eax * 4] invoke PrintUtf8, OFFSET cardRankOneRSeg jmp community_rank_next community_rank_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 2 call ResetColor community_rank_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp community_rank_loop community_rank_done: invoke PrintStr, OFFSET nl ret PrintCommunityRankLine ENDP ; --- PrintCommunityBlankLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintCommunityBlankLine PROC uses eax mov rowIndex, 0 community_blank_loop: mov eax, rowIndex cmp eax, 5 jae community_blank_done cmp eax, communityCnt jae community_blank_hidden invoke PrintUtf8, OFFSET cardEmptySeg jmp community_blank_next community_blank_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 4 call ResetColor community_blank_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp community_blank_loop community_blank_done: invoke PrintStr, OFFSET nl ret PrintCommunityBlankLine ENDP ; --- PrintCommunityCenterLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintCommunityCenterLine PROC uses eax ecx edx LOCAL suitIndex:DWORD mov rowIndex, 0 community_center_loop: mov eax, rowIndex cmp eax, 5 jae community_center_done cmp eax, communityCnt jae community_center_hidden mov eax, communityHand[eax * 4] xor edx, edx mov ecx, 13 div ecx mov suitIndex, eax invoke PrintUtf8, OFFSET cardCenterL mov eax, suitIndex invoke PrintSuit, eax invoke PrintUtf8, OFFSET cardCenterRSeg jmp community_center_next community_center_hidden: call SetCardBackColor invoke PrintCardBackSegLine, 5 call ResetColor community_center_next: invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp community_center_loop community_center_done: invoke PrintStr, OFFSET nl ret PrintCommunityCenterLine ENDP ; --- PrintCommunityRow: вывод текста, цветов, картинок и элементов интерфейса --- PrintCommunityRow PROC invoke PrintHandTop, 5 call PrintCommunitySuitLine call PrintCommunityRankLine call PrintCommunityBlankLine call PrintCommunityBlankLine call PrintCommunityCenterLine invoke PrintHandBottom, 5 ret PrintCommunityRow ENDP ; --- PrintFlipLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintFlipLine PROC uses eax, count:DWORD, pSegment:DWORD mov rowIndex, 0 flip_line_loop: mov eax, rowIndex cmp eax, count jae flip_line_done invoke PrintUtf8, pSegment invoke PrintUtf8, OFFSET cardGap inc rowIndex jmp flip_line_loop flip_line_done: invoke PrintStr, OFFSET nl ret PrintFlipLine ENDP ; --- PrintFlipCards: вывод текста, цветов, картинок и элементов интерфейса --- PrintFlipCards PROC count:DWORD, pSegment:DWORD invoke PrintHandTop, count invoke PrintFlipLine, count, pSegment invoke PrintFlipLine, count, pSegment invoke PrintFlipLine, count, pSegment invoke PrintFlipLine, count, pSegment invoke PrintFlipLine, count, pSegment invoke PrintHandBottom, count ret PrintFlipCards ENDP ; --- ShowRevealFrame21: звук, интро или покадровая анимация --- ShowRevealFrame21 PROC pSegment:DWORD call ClearView invoke PrintTitleColor, OFFSET twentyOneTitle invoke PrintStr, OFFSET revealText invoke PrintStr, OFFSET aiCardsText invoke PrintFlipCards, aiCnt21, pSegment invoke PrintStr, OFFSET playerCardsText invoke PrintHandRow21, OFFSET playerHand21, playerCnt21, 1 call CalcPlayerScore21 invoke PrintStr, OFFSET yourScoreText invoke PrintUInt, playerTotal invoke PrintStr, OFFSET nl ret ShowRevealFrame21 ENDP ; --- AnimateReveal21: карты, руки, очки и базовая карточная логика --- AnimateReveal21 PROC call PlayCardSound invoke ShowRevealFrame21, OFFSET cardBackSeg invoke Sleep, FLIP_DELAY invoke ShowRevealFrame21, OFFSET cardFlipLeft invoke Sleep, FLIP_DELAY invoke ShowRevealFrame21, OFFSET cardFlipMid invoke Sleep, FLIP_DELAY invoke ShowRevealFrame21, OFFSET cardFlipRight invoke Sleep, FLIP_DELAY mov revealAI21, 1 call ClearView invoke PrintTitleColor, OFFSET twentyOneTitle call ShowAllCards21 invoke Sleep, FLIP_FINAL_DELAY ret AnimateReveal21 ENDP ; --- CalcPlayerScore21: карты, руки, очки и базовая карточная логика --- CalcPlayerScore21 PROC uses eax ebx mov playerTotal, 0 mov rowIndex, 0 calc_player21_loop: mov eax, rowIndex cmp eax, playerCnt21 jae calc_player21_done mov ebx, playerHand21[eax * 4] invoke CardValue21, ebx add playerTotal, eax inc rowIndex jmp calc_player21_loop calc_player21_done: ret CalcPlayerScore21 ENDP ; --- CalcAIScore21: карты, руки, очки и базовая карточная логика --- CalcAIScore21 PROC uses eax ebx mov dealerTotal, 0 mov rowIndex, 0 calc_ai21_loop: mov eax, rowIndex cmp eax, aiCnt21 jae calc_ai21_done mov ebx, aiHand21[eax * 4] invoke CardValue21, ebx add dealerTotal, eax inc rowIndex jmp calc_ai21_loop calc_ai21_done: ret CalcAIScore21 ENDP ; --- ShowAllCards21: карты, руки, очки и базовая карточная логика --- ShowAllCards21 PROC cmp revealAI21, 0 jne show_ai_cards invoke PrintStr, OFFSET aiThinkText show_ai_cards: invoke PrintStr, OFFSET aiCardsText invoke PrintHandRow21, OFFSET aiHand21, aiCnt21, revealAI21 invoke PrintStr, OFFSET playerCardsText invoke PrintHandRow21, OFFSET playerHand21, playerCnt21, 1 call CalcPlayerScore21 call CalcAIScore21 invoke PrintStr, OFFSET yourScoreText invoke PrintUInt, playerTotal invoke PrintStr, OFFSET nl cmp revealAI21, 0 je show_cards_done invoke PrintStr, OFFSET aiScoreText invoke PrintUInt, dealerTotal invoke PrintStr, OFFSET nl show_cards_done: ret ShowAllCards21 ENDP ; --- PeekUnusedCard: карты, руки, очки и базовая карточная логика --- PeekUnusedCard PROC uses edi peek_unused_again: invoke RandomRange, 52 mov edi, OFFSET deckUsed add edi, eax cmp byte ptr [edi], 0 jne peek_unused_again ret PeekUnusedCard ENDP ; --- CheatPeek21: банк, ставки, стресс, подозрение и экономика казино --- CheatPeek21 PROC uses eax ebx invoke PrintStr, OFFSET cheatPeekText call PeekUnusedCard mov ebx, eax invoke PrintCard, ebx invoke AddSuspicion, 12 call CheckCasinoHeat call PauseConsole ret CheatPeek21 ENDP ; --- CheatSwap21: банк, ставки, стресс, подозрение и экономика казино --- CheatSwap21 PROC uses eax ebx cmp playerCnt21, 0 je cheat_swap21_none call DrawCard mov ebx, playerCnt21 dec ebx mov playerHand21[ebx * 4], eax call CalcPlayerScore21 invoke PrintStr, OFFSET cheatSwapText invoke AddSuspicion, 18 call CheckCasinoHeat call PauseConsole ret cheat_swap21_none: invoke PrintStr, OFFSET cheatNoTargetText call PauseConsole ret CheatSwap21 ENDP ; --- CheatPeekPoker: банк, ставки, стресс, подозрение и экономика казино --- CheatPeekPoker PROC uses eax ebx mov ebx, communityCnt cmp ebx, 5 jb cheat_peek_poker_table invoke PrintStr, OFFSET cheatPeekText mov ebx, 0 mov eax, aiHand21[ebx * 4] invoke PrintCard, eax jmp cheat_peek_poker_done cheat_peek_poker_table: invoke PrintStr, OFFSET cheatPeekText mov eax, communityHand[ebx * 4] invoke PrintCard, eax cheat_peek_poker_done: invoke AddSuspicion, 12 call CheckCasinoHeat call PauseConsole ret CheatPeekPoker ENDP ; --- CheatSwapPoker: банк, ставки, стресс, подозрение и экономика казино --- CheatSwapPoker PROC uses eax cmp playerCnt21, 0 je cheat_swap_poker_none call DrawCard mov DWORD PTR playerHand21[0], eax invoke PrintStr, OFFSET cheatSwapText invoke AddSuspicion, 18 call CheckCasinoHeat call PauseConsole ret cheat_swap_poker_none: invoke PrintStr, OFFSET cheatNoTargetText call PauseConsole ret CheatSwapPoker ENDP ; --- CountDanger21: карты, руки, очки и базовая карточная логика --- CountDanger21 PROC uses eax ebx esi call CalcAIScore21 mov dangerLvl21, 0 mov cardsLeft21, 0 mov rowIndex, 0 danger_loop: mov eax, rowIndex cmp eax, 52 jae danger_done mov esi, OFFSET deckUsed cmp byte ptr [esi + eax], 0 jne danger_next inc cardsLeft21 invoke CardValue21, rowIndex mov ebx, dealerTotal add ebx, eax cmp ebx, 21 jbe danger_next inc dangerLvl21 danger_next: inc rowIndex jmp danger_loop danger_done: ret CountDanger21 ENDP ; --- FinalScreen21: карты, руки, очки и базовая карточная логика --- FinalScreen21 PROC call ClearView mov revealAI21, 1 call ShowAllCards21 mov eax, playerTotal mov ebx, dealerTotal cmp eax, 21 ja final_21_lose cmp ebx, 21 ja final_21_win cmp eax, ebx ja final_21_win jb final_21_lose call PrintDrawEvent call PayDraw ret final_21_win: call PrintWinEvent call PayWin ret final_21_lose: call PrintLoseEvent call PayLose ret FinalScreen21 ENDP ; --- ResetPokerHands: карты, руки, очки и базовая карточная логика --- ResetPokerHands PROC mov playerCnt21, 0 mov aiCnt21, 0 mov communityCnt, 0 mov revealAI21, 0 ret ResetPokerHands ENDP ; --- DrawCommunityPoker: покер: оценка комбинаций, ставки, фолды и ИИ --- DrawCommunityPoker PROC uses ebx ecx cmp communityCnt, 5 jae draw_community_done call PlayCardSound call DrawCard mov ebx, communityCnt mov communityHand[ebx * 4], eax inc communityCnt draw_community_done: ret DrawCommunityPoker ENDP ; --- DealPokerHands: карты, руки, очки и базовая карточная логика --- DealPokerHands PROC uses ecx mov ecx, 2 deal_poker_hands_loop: call DrawPlayer21Hand call DrawAI21Hand loop deal_poker_hands_loop mov ecx, 5 deal_poker_table_loop: call DrawCommunityPoker loop deal_poker_table_loop mov communityCnt, 3 ret DealPokerHands ENDP ; --- ShowPokerTable: покер: оценка комбинаций, ставки, фолды и ИИ --- ShowPokerTable PROC invoke PrintStr, OFFSET aiCardsText invoke PrintHandRow21, OFFSET aiHand21, aiCnt21, revealAI21 invoke PrintStr, OFFSET pokerTableText call PrintCommunityRow invoke PrintStr, OFFSET playerCardsText invoke PrintHandRow21, OFFSET playerHand21, playerCnt21, 1 ret ShowPokerTable ENDP ; --- ShowPokerRevealFrame: звук, интро или покадровая анимация --- ShowPokerRevealFrame PROC pSegment:DWORD call ClearView invoke PrintTitleColor, OFFSET pokerTitle invoke PrintStr, OFFSET pokerRevealText invoke PrintStr, OFFSET aiCardsText invoke PrintFlipCards, aiCnt21, pSegment invoke PrintStr, OFFSET pokerTableText call PrintCommunityRow invoke PrintStr, OFFSET playerCardsText invoke PrintHandRow21, OFFSET playerHand21, playerCnt21, 1 ret ShowPokerRevealFrame ENDP ; --- AnimateRevealPoker: карты, руки, очки и базовая карточная логика --- AnimateRevealPoker PROC call PlayCardSound invoke ShowPokerRevealFrame, OFFSET cardBackSeg invoke Sleep, FLIP_DELAY invoke ShowPokerRevealFrame, OFFSET cardFlipLeft invoke Sleep, FLIP_DELAY invoke ShowPokerRevealFrame, OFFSET cardFlipMid invoke Sleep, FLIP_DELAY invoke ShowPokerRevealFrame, OFFSET cardFlipRight invoke Sleep, FLIP_DELAY mov revealAI21, 1 call ClearView invoke PrintTitleColor, OFFSET pokerTitle call ShowPokerTable invoke Sleep, FLIP_FINAL_DELAY ret AnimateRevealPoker ENDP ; --- ClearPokerCounts: покер: оценка комбинаций, ставки, фолды и ИИ --- ClearPokerCounts PROC uses ecx edi mov ecx, 13 mov edi, OFFSET rankCounts clear_rank_counts: mov byte ptr [edi], 0 inc edi loop clear_rank_counts mov ecx, 4 mov edi, OFFSET suitCounts clear_suit_counts: mov byte ptr [edi], 0 inc edi loop clear_suit_counts ret ClearPokerCounts ENDP ; --- EvaluatePokerN: покер: оценка комбинаций, ставки, фолды и ИИ --- EvaluatePokerN PROC uses ebx ecx edx esi edi, pHand:DWORD, cardCount:DWORD call ClearPokerCounts mov pokerStraight, 0 mov pokerFlush, 0 mov pokerHigh, 0 mov pokerFour, 0FFFFFFFFh mov pokerTrip, 0FFFFFFFFh mov pokerPairHigh, 0FFFFFFFFh mov pokerPairLow, 0FFFFFFFFh mov esi, pHand mov ecx, cardCount count_poker_cards: mov eax, [esi] xor edx, edx mov ebx, 13 div ebx inc byte ptr suitCounts[eax] inc byte ptr rankCounts[edx] add esi, 4 loop count_poker_cards mov ecx, 4 xor ebx, ebx check_flush_loop: cmp byte ptr suitCounts[ebx], 5 jb next_flush_suit mov pokerFlush, 1 next_flush_suit: inc ebx loop check_flush_loop mov ecx, 13 mov ebx, 12 find_high_card: cmp byte ptr rankCounts[ebx], 0 jne high_card_found dec ebx loop find_high_card jmp check_wheel_straight high_card_found: mov pokerHigh, ebx check_wheel_straight: cmp byte ptr rankCounts[12], 0 je check_normal_straight cmp byte ptr rankCounts[0], 0 je check_normal_straight cmp byte ptr rankCounts[1], 0 je check_normal_straight cmp byte ptr rankCounts[2], 0 je check_normal_straight cmp byte ptr rankCounts[3], 0 je check_normal_straight mov pokerStraight, 1 mov pokerHigh, 3 jmp scan_duplicates check_normal_straight: mov ebx, 12 normal_straight_loop: cmp ebx, 4 jb scan_duplicates cmp byte ptr rankCounts[ebx], 0 je normal_straight_next mov eax, ebx dec eax cmp byte ptr rankCounts[eax], 0 je normal_straight_next dec eax cmp byte ptr rankCounts[eax], 0 je normal_straight_next dec eax cmp byte ptr rankCounts[eax], 0 je normal_straight_next dec eax cmp byte ptr rankCounts[eax], 0 je normal_straight_next mov pokerStraight, 1 mov pokerHigh, ebx jmp scan_duplicates normal_straight_next: dec ebx jmp normal_straight_loop scan_duplicates: mov ebx, 12 duplicate_loop: cmp ebx, 0FFFFFFFFh je decide_poker_score mov al, byte ptr rankCounts[ebx] cmp al, 4 jne check_trip_count mov pokerFour, ebx jmp duplicate_next check_trip_count: cmp al, 3 jne check_pair_count cmp pokerTrip, 0FFFFFFFFh jne second_trip_as_pair mov pokerTrip, ebx jmp duplicate_next second_trip_as_pair: cmp pokerPairHigh, 0FFFFFFFFh jne duplicate_next mov pokerPairHigh, ebx jmp duplicate_next check_pair_count: cmp al, 2 jne duplicate_next cmp pokerPairHigh, 0FFFFFFFFh jne set_low_pair mov pokerPairHigh, ebx jmp duplicate_next set_low_pair: mov pokerPairLow, ebx duplicate_next: dec ebx jmp duplicate_loop decide_poker_score: cmp pokerStraight, 1 jne not_straight_flush cmp pokerFlush, 1 jne not_straight_flush mov eax, 8000 add eax, pokerHigh ret not_straight_flush: cmp pokerFour, 0FFFFFFFFh je not_four_kind mov eax, 7000 add eax, pokerFour ret not_four_kind: cmp pokerTrip, 0FFFFFFFFh je not_full_house cmp pokerPairHigh, 0FFFFFFFFh je not_full_house mov eax, 6000 add eax, pokerTrip ret not_full_house: cmp pokerFlush, 1 jne not_flush mov eax, 5000 add eax, pokerHigh ret not_flush: cmp pokerStraight, 1 jne not_straight mov eax, 4000 add eax, pokerHigh ret not_straight: cmp pokerTrip, 0FFFFFFFFh je not_three_kind mov eax, 3000 add eax, pokerTrip ret not_three_kind: cmp pokerPairLow, 0FFFFFFFFh je not_two_pair mov eax, pokerPairHigh mov ebx, 13 mul ebx add eax, pokerPairLow add eax, 2000 ret not_two_pair: cmp pokerPairHigh, 0FFFFFFFFh je high_card_score mov eax, 1000 add eax, pokerPairHigh ret high_card_score: mov eax, pokerHigh ret EvaluatePokerN ENDP ; --- EvaluatePoker: покер: оценка комбинаций, ставки, фолды и ИИ --- EvaluatePoker PROC pHand:DWORD invoke EvaluatePokerN, pHand, 5 ret EvaluatePoker ENDP ; --- PrintPokerHandName: вывод текста, цветов, картинок и элементов интерфейса --- PrintPokerHandName PROC uses eax ebx edx, score:DWORD mov eax, score xor edx, edx mov ebx, 1000 div ebx invoke PrintStr, pokerNames[eax * 4] ret PrintPokerHandName ENDP ; --- BuildPokerEvalHand: карты, руки, очки и базовая карточная логика --- BuildPokerEvalHand PROC uses eax ebx esi edi, pHole:DWORD, pOut:DWORD mov esi, pHole mov edi, pOut mov eax, [esi] mov [edi], eax mov eax, [esi + 4] mov [edi + 4], eax mov eax, communityCnt add eax, 2 mov pokerEvalCount, eax mov ebx, 0 build_table_cards: cmp ebx, communityCnt jae build_eval_done mov eax, communityHand[ebx * 4] mov [edi + ebx * 4 + 8], eax inc ebx jmp build_table_cards build_eval_done: ret BuildPokerEvalHand ENDP ; --- ShowPokerHint: покер: оценка комбинаций, ставки, фолды и ИИ --- ShowPokerHint PROC invoke BuildPokerEvalHand, OFFSET playerHand21, OFFSET pokerPlayerEvalHand invoke EvaluatePokerN, OFFSET pokerPlayerEvalHand, pokerEvalCount mov pokerPlayerScore, eax invoke PrintStr, OFFSET pokerHintText invoke PrintPokerHandName, pokerPlayerScore ret ShowPokerHint ENDP ; --- ShowPokerResult: покер: оценка комбинаций, ставки, фолды и ИИ --- ShowPokerResult PROC uses ebx invoke BuildPokerEvalHand, OFFSET playerHand21, OFFSET pokerPlayerEvalHand mov ebx, pokerEvalCount invoke BuildPokerEvalHand, OFFSET aiHand21, OFFSET pokerAIEvalHand mov pokerEvalCount, ebx invoke EvaluatePokerN, OFFSET pokerPlayerEvalHand, pokerEvalCount mov pokerPlayerScore, eax invoke EvaluatePokerN, OFFSET pokerAIEvalHand, pokerEvalCount mov pokerAIScore, eax invoke PrintStr, OFFSET pokerYourComboText invoke PrintPokerHandName, pokerPlayerScore invoke PrintStr, OFFSET pokerAIComboText invoke PrintPokerHandName, pokerAIScore mov eax, pokerPlayerScore cmp eax, pokerAIScore ja poker_player_win jb poker_ai_win call PrintDrawEvent call PayDraw ret poker_player_win: call PrintWinEvent call PayWin ret poker_ai_win: call PrintLoseEvent call PayLose ret ShowPokerResult ENDP ; --- PokerAIDecide: покер: оценка комбинаций, ставки, фолды и ИИ --- PokerAIDecide PROC uses ebx edx invoke BuildPokerEvalHand, OFFSET aiHand21, OFFSET pokerAIEvalHand invoke EvaluatePokerN, OFFSET pokerAIEvalHand, pokerEvalCount mov pokerAIScore, eax mov eax, pokerAIScore xor edx, edx mov ebx, 1000 div ebx cmp eax, 1 jae ai_will_play cmp aiDifficulty, 1 je ai_easy_decide cmp aiDifficulty, 3 je ai_hard_decide ai_normal_decide: mov eax, pokerAIScore cmp eax, 11 jae ai_normal_random jmp ai_will_fold ai_normal_random: invoke RandomRange, 3 cmp eax, 0 je ai_will_fold jmp ai_will_play ai_easy_decide: invoke RandomRange, 2 cmp eax, 0 je ai_will_play mov eax, pokerAIScore cmp eax, 10 jae ai_will_play jmp ai_will_fold ai_hard_decide: mov eax, pokerAIScore cmp eax, 10 jae ai_hard_high_card invoke RandomRange, 3 cmp eax, 0 je ai_will_play jmp ai_will_fold ai_hard_high_card: invoke RandomRange, 4 cmp eax, 0 je ai_will_fold jmp ai_will_play ai_will_fold: xor eax, eax ret ai_will_play: mov eax, 1 ret PokerAIDecide ENDP ; --- PokerAICallRaise: покер: оценка комбинаций, ставки, фолды и ИИ --- PokerAICallRaise PROC uses ebx ecx edx invoke BuildPokerEvalHand, OFFSET aiHand21, OFFSET pokerAIEvalHand invoke EvaluatePokerN, OFFSET pokerAIEvalHand, pokerEvalCount mov pokerAIScore, eax mov eax, pokerAIScore xor edx, edx mov ebx, 1000 div ebx mov ecx, eax cmp ecx, 1 jae ai_call_raise mov eax, pokerRaiseAmount mov ebx, 2 mul ebx cmp eax, currentBet ja ai_big_raise cmp aiDifficulty, 1 je ai_easy_call_bluff cmp aiDifficulty, 3 je ai_hard_call_bluff invoke RandomRange, 3 cmp eax, 0 jne ai_call_raise jmp ai_fold_raise ai_big_raise: cmp aiDifficulty, 1 je ai_easy_big_raise cmp aiDifficulty, 3 je ai_fold_raise invoke RandomRange, 5 cmp eax, 0 je ai_call_raise jmp ai_fold_raise ai_easy_call_bluff: invoke RandomRange, 2 cmp eax, 0 je ai_call_raise jmp ai_fold_raise ai_easy_big_raise: invoke RandomRange, 3 cmp eax, 0 jne ai_call_raise jmp ai_fold_raise ai_hard_call_bluff: mov eax, pokerAIScore cmp eax, 12 jae ai_call_raise jmp ai_fold_raise ai_fold_raise: xor eax, eax ret ai_call_raise: mov eax, 1 ret PokerAICallRaise ENDP ; --- HardPokerPlayerExchange: покер: оценка комбинаций, ставки, фолды и ИИ --- HardPokerPlayerExchange PROC uses eax ebx cmp aiDifficulty, 3 jne hard_player_exchange_done call ClearView invoke PrintTitleColor, OFFSET pokerTitle call ShowPokerTable call ShowPokerHint invoke PrintStr, OFFSET pokerHardIntroText invoke PrintStr, OFFSET pokerHardExchangeText call ReadKey cmp al, '1' je hard_replace_first cmp al, '2' je hard_replace_second jmp hard_player_exchange_done hard_replace_first: xor ebx, ebx jmp hard_replace_card hard_replace_second: mov ebx, 1 hard_replace_card: call PlayCardSound call DrawCard mov playerHand21[ebx * 4], eax hard_player_exchange_done: ret HardPokerPlayerExchange ENDP ; --- HardPokerAIExchange: покер: оценка комбинаций, ставки, фолды и ИИ --- HardPokerAIExchange PROC uses eax ebx ecx edx cmp aiDifficulty, 3 jne hard_ai_exchange_done invoke PrintStr, OFFSET pokerHardAIExchangeText invoke Sleep, 650 mov eax, aiHand21[0] xor edx, edx mov ecx, 13 div ecx mov ebx, edx mov eax, aiHand21[4] xor edx, edx mov ecx, 13 div ecx cmp ebx, edx je hard_ai_exchange_done cmp ebx, 8 jb hard_ai_check_second cmp edx, 8 jae hard_ai_exchange_done hard_ai_check_second: cmp ebx, edx jbe hard_replace_ai_first mov ebx, 1 jmp hard_replace_ai_card hard_replace_ai_first: xor ebx, ebx hard_replace_ai_card: call PlayCardSound call DrawCard mov aiHand21[ebx * 4], eax hard_ai_exchange_done: ret HardPokerAIExchange ENDP ; --- PokerAIRaiseMaybe: покер: оценка комбинаций, ставки, фолды и ИИ --- PokerAIRaiseMaybe PROC uses ebx ecx edx invoke BuildPokerEvalHand, OFFSET aiHand21, OFFSET pokerAIEvalHand invoke EvaluatePokerN, OFFSET pokerAIEvalHand, pokerEvalCount mov pokerAIScore, eax mov eax, bankroll sub eax, currentBet cmp eax, 0 jbe ai_no_raise mov ecx, eax mov eax, pokerAIScore xor edx, edx mov ebx, 1000 div ebx cmp eax, 2 jae ai_strong_raise cmp eax, 1 je ai_pair_raise_check cmp aiDifficulty, 3 jne ai_no_raise mov eax, pokerAIScore cmp eax, 12 jne ai_no_raise invoke RandomRange, 7 cmp eax, 0 jne ai_no_raise mov eax, currentBet xor edx, edx mov ebx, 3 div ebx jmp ai_raise_amount_ready ai_pair_raise_check: cmp aiDifficulty, 1 je ai_easy_pair_raise cmp aiDifficulty, 2 je ai_normal_pair_raise invoke RandomRange, 3 cmp eax, 0 je ai_no_raise mov eax, currentBet xor edx, edx mov ebx, 2 div ebx jmp ai_raise_amount_ready ai_easy_pair_raise: invoke RandomRange, 5 cmp eax, 0 jne ai_no_raise mov eax, currentBet xor edx, edx mov ebx, 3 div ebx jmp ai_raise_amount_ready ai_normal_pair_raise: invoke RandomRange, 3 cmp eax, 0 je ai_no_raise mov eax, currentBet xor edx, edx mov ebx, 2 div ebx jmp ai_raise_amount_ready ai_strong_raise: cmp aiDifficulty, 1 je ai_easy_strong_raise cmp aiDifficulty, 2 je ai_normal_strong_raise mov eax, currentBet jmp ai_raise_amount_ready ai_easy_strong_raise: invoke RandomRange, 3 cmp eax, 0 jne ai_no_raise mov eax, currentBet xor edx, edx mov ebx, 2 div ebx jmp ai_raise_amount_ready ai_normal_strong_raise: invoke RandomRange, 2 cmp eax, 0 je ai_no_raise mov eax, currentBet xor edx, edx mov ebx, 2 div ebx jmp ai_raise_amount_ready ai_raise_amount_ready: cmp eax, 50 jae ai_raise_min_ok mov eax, 50 ai_raise_min_ok: cmp eax, ecx jbe ai_raise_store mov eax, ecx ai_raise_store: cmp eax, 0 jbe ai_no_raise mov pokerAIRaiseAmount, eax mov pokerRaiseAmount, eax mov eax, 1 ret ai_no_raise: xor eax, eax ret PokerAIRaiseMaybe ENDP ; --- PokerPlayerExchange: покер: оценка комбинаций, ставки, фолды и ИИ --- PokerPlayerExchange PROC uses eax ebx mov pokerReplaceIndex, 0 player_exchange_loop: cmp pokerReplaceIndex, 5 jae player_exchange_done call ClearView invoke PrintTitleColor, OFFSET pokerTitle call ShowPokerTable invoke PrintStr, OFFSET pokerReplaceText mov eax, pokerReplaceIndex inc eax invoke PrintUInt, eax invoke PrintStr, OFFSET pokerReplaceTail call ReadKey cmp al, 'y' je replace_player_card cmp al, 'Y' je replace_player_card cmp al, '1' je replace_player_card jmp next_player_exchange replace_player_card: call DrawCard mov ebx, pokerReplaceIndex mov playerHand21[ebx * 4], eax next_player_exchange: inc pokerReplaceIndex jmp player_exchange_loop player_exchange_done: ret PokerPlayerExchange ENDP ; --- PokerAIExchange: покер: оценка комбинаций, ставки, фолды и ИИ --- PokerAIExchange PROC uses eax ebx ecx edx invoke EvaluatePoker, OFFSET aiHand21 xor edx, edx mov ebx, 1000 div ebx cmp eax, 4 jae ai_exchange_done mov pokerReplaced, 0 mov pokerReplaceIndex, 0 ai_exchange_loop: cmp pokerReplaceIndex, 5 jae ai_exchange_done cmp pokerReplaced, 3 jae ai_exchange_done mov ebx, pokerReplaceIndex mov eax, aiHand21[ebx * 4] xor edx, edx mov ecx, 13 div ecx cmp byte ptr rankCounts[edx], 1 jne next_ai_exchange call DrawCard mov ebx, pokerReplaceIndex mov aiHand21[ebx * 4], eax inc pokerReplaced next_ai_exchange: inc pokerReplaceIndex jmp ai_exchange_loop ai_exchange_done: ret PokerAIExchange ENDP ; --- AddPlayerBJ: карты, руки, очки и базовая карточная логика --- AddPlayerBJ PROC uses eax ebx edx call DrawCard mov ebx, eax invoke PrintStr, OFFSET yourCardText invoke PrintCard, ebx invoke CardValueBJ, ebx add playerTotal, eax cmp eax, 11 jne no_player_ace inc playerAces no_player_ace: inc playerCards call AdjustPlayerAces ret AddPlayerBJ ENDP ; --- AddDealerBJ: карты, руки, очки и базовая карточная логика --- AddDealerBJ PROC uses eax ebx call DrawCard mov ebx, eax invoke PrintStr, OFFSET dealerCardText invoke PrintCard, ebx invoke CardValueBJ, ebx add dealerTotal, eax cmp eax, 11 jne no_dealer_ace inc dealerAces no_dealer_ace: call AdjustDealerAces ret AddDealerBJ ENDP ; --- CompareTotals: служебный блок игровой логики --- CompareTotals PROC call PrintScore cmp playerTotal, 21 ja player_lost cmp dealerTotal, 21 ja dealer_lost mov eax, playerTotal cmp eax, dealerTotal ja player_won jb player_lost call PrintDrawEvent ret player_won: call PrintWinEvent ret player_lost: call PrintLoseEvent ret dealer_lost: invoke PrintStr, OFFSET dealerBustText ret CompareTotals ENDP ; --- Game21: карты, руки, очки и базовая карточная логика --- Game21 PROC start_21: call ClearView invoke PrintTitleColor, OFFSET twentyOneTitle call PromptBet call ResetDeck call Reset21Hands call DrawPlayer21Hand call DrawPlayer21Hand call DrawAI21Hand call DrawAI21Hand player_21_loop: call ClearView invoke PrintTitleColor, OFFSET twentyOneTitle call ShowAllCards21 cmp playerTotal, 21 ja player_21_bust cmp playerTotal, 21 je ai_21_turn invoke PrintStr, OFFSET hitText invoke PrintStr, OFFSET cheatMoveText call ReadKey cmp al, '1' je hit_21 cmp al, 'y' je hit_21 cmp al, 'Y' je hit_21 cmp al, '3' je cheat_peek_21_action cmp al, '4' je cheat_swap_21_action jmp ai_21_turn cheat_peek_21_action: call CheatPeek21 jmp player_21_loop cheat_swap_21_action: call CheatSwap21 jmp player_21_loop hit_21: cmp playerCnt21, 10 jae ai_21_turn call DrawPlayer21Hand jmp player_21_loop player_21_bust: invoke PrintStr, OFFSET bustText call PayLose jmp ask_21_again ai_21_turn: ai_21_cycle: call ClearView invoke PrintTitleColor, OFFSET twentyOneTitle call ShowAllCards21 cmp playerTotal, 21 ja finish_21 cmp dealerTotal, 21 je finish_21 cmp aiDifficulty, 1 je ai_21_easy cmp aiDifficulty, 2 je ai_21_normal cmp dealerTotal, 12 jb ai_21_must_hit mov eax, dealerTotal cmp eax, playerTotal jae finish_21 call CountDanger21 mov eax, dangerLvl21 mov ebx, 2 mul ebx cmp eax, cardsLeft21 ja finish_21 jmp ai_21_must_hit ai_21_easy: cmp dealerTotal, 16 jb ai_21_must_hit jmp finish_21 ai_21_normal: cmp dealerTotal, 17 jb ai_21_must_hit jmp finish_21 ai_21_must_hit: cmp aiCnt21, 10 jae finish_21 invoke PrintStr, OFFSET aiMoveText invoke Sleep, 650 call DrawAI21Hand call CalcAIScore21 cmp dealerTotal, 21 ja finish_21 jmp ai_21_cycle finish_21: call AnimateReveal21 call FinalScreen21 ask_21_again: cmp tournamentMode, 1 je game21_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je start_21 cmp al, 'Y' je start_21 game21_tournament_return: ret Game21 ENDP ; --- GamePoker: покер: оценка комбинаций, ставки, фолды и ИИ --- GamePoker PROC start_poker: call ClearView invoke PrintTitleColor, OFFSET pokerTitle call PromptBet call ResetDeck call ResetPokerHands call DealPokerHands call HardPokerPlayerExchange call HardPokerAIExchange poker_stage_loop: call ClearView invoke PrintTitleColor, OFFSET pokerTitle call ShowPokerTable call ShowPokerHint call ShowPokerMoney cmp communityCnt, 5 jae poker_showdown invoke PrintStr, OFFSET pokerDecisionText invoke PrintStr, OFFSET cheatMoveText call ReadKey cmp al, '1' je poker_play cmp al, 'y' je poker_play cmp al, 'Y' je poker_play cmp al, '2' je poker_raise cmp al, 'r' je poker_raise cmp al, 'R' je poker_raise cmp al, '3' je poker_cheat_peek cmp al, '4' je poker_cheat_swap invoke PrintStr, OFFSET pokerFoldText call PayLose jmp ask_poker_again poker_cheat_peek: call CheatPeekPoker jmp poker_stage_loop poker_cheat_swap: call CheatSwapPoker jmp poker_stage_loop poker_raise: call PromptPokerRaise cmp eax, 0 je poker_stage_loop invoke UnlockAchievement, 200h, OFFSET achPokerRaiseName invoke PrintStr, OFFSET aiThinkText invoke Sleep, 700 call PokerAICallRaise cmp eax, 0 jne poker_raise_called invoke PrintStr, OFFSET pokerAIFoldRaiseText invoke UnlockAchievement, 400h, OFFSET achPokerBluffName call PayWin jmp ask_poker_again poker_raise_called: invoke PrintStr, OFFSET pokerAICallRaiseText invoke Sleep, 700 jmp poker_next_stage poker_play: invoke PrintStr, OFFSET aiThinkText invoke Sleep, 700 call PokerAIDecide cmp eax, 0 jne poker_ai_plays invoke PrintStr, OFFSET pokerAIFoldText call PayWin jmp ask_poker_again poker_ai_plays: call PokerAIRaiseMaybe cmp eax, 0 je poker_next_stage invoke PrintStr, OFFSET pokerAIRaiseText invoke PrintUInt, pokerAIRaiseAmount invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET pokerCallRaiseText call ReadKey cmp al, '1' je poker_call_ai_raise cmp al, 'y' je poker_call_ai_raise cmp al, 'Y' je poker_call_ai_raise invoke PrintStr, OFFSET pokerFoldToRaiseText call PayLose jmp ask_poker_again poker_call_ai_raise: mov eax, currentBet add eax, pokerAIRaiseAmount cmp eax, bankroll jbe poker_call_ai_raise_ok invoke PrintStr, OFFSET tooBigBetText invoke PrintStr, OFFSET pokerFoldToRaiseText call PayLose jmp ask_poker_again poker_call_ai_raise_ok: mov currentBet, eax invoke PrintStr, OFFSET pokerPlayerCallText invoke PrintUInt, currentBet invoke PrintStr, OFFSET nl invoke Sleep, 700 poker_next_stage: cmp communityCnt, 5 jae poker_showdown invoke PrintStr, OFFSET pokerNextCardText invoke Sleep, 900 inc communityCnt jmp poker_stage_loop poker_showdown: call AnimateRevealPoker call ShowPokerResult ask_poker_again: cmp tournamentMode, 1 je poker_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je start_poker cmp al, 'Y' je start_poker poker_tournament_return: ret GamePoker ENDP ; --- PrintSlotSymbol: вывод текста, цветов, картинок и элементов интерфейса --- PrintSlotSymbol PROC uses eax, value:DWORD mov eax, value cmp eax, 0 je slot_symbol_green cmp eax, 1 je slot_symbol_yellow cmp eax, 2 je slot_symbol_red cmp eax, 3 je slot_symbol_yellow cmp eax, 4 je slot_symbol_cyan cmp eax, 5 je slot_symbol_yellow invoke SetColor, COLOR_BAD jmp slot_symbol_print slot_symbol_green: invoke SetColor, COLOR_MONEY jmp slot_symbol_print slot_symbol_yellow: invoke SetColor, COLOR_WARN jmp slot_symbol_print slot_symbol_red: invoke SetColor, COLOR_BAD jmp slot_symbol_print slot_symbol_cyan: invoke SetColor, COLOR_TITLE slot_symbol_print: mov eax, value invoke PrintStr, slotSymbols[eax * 4] call ResetColor ret PrintSlotSymbol ENDP ; --- MoveCursor: служебные функции консоли и случайных чисел --- MoveCursor PROC uses eax edx, xPos:DWORD, yPos:DWORD mov eax, yPos shl eax, 16 mov edx, xPos and edx, 0FFFFh or eax, edx invoke SetConsoleCursorPosition, hOut, eax ret MoveCursor ENDP ; --- PrintSkullAt: вывод текста, цветов, картинок и элементов интерфейса --- PrintSkullAt PROC uses eax, xPos:DWORD, yPos:DWORD mov eax, yPos invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg1 mov eax, yPos inc eax invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg2 mov eax, yPos add eax, 2 invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg3 mov eax, yPos add eax, 3 invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg4 mov eax, yPos add eax, 4 invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg5 mov eax, yPos add eax, 5 invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg6 mov eax, yPos add eax, 6 invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg7 mov eax, yPos add eax, 7 invoke MoveCursor, xPos, eax invoke PrintUtf8, OFFSET skullSeg8 ret PrintSkullAt ENDP ; --- ShowSkullSlideFrame: звук, интро или покадровая анимация --- ShowSkullSlideFrame PROC x1:DWORD, y1:DWORD, x2:DWORD, y2:DWORD, x3:DWORD, y3:DWORD call ClearView invoke PrintTitleColor, OFFSET skullsTitle invoke PrintStr, OFFSET skullsShuffleText invoke PrintSkullAt, x1, y1 invoke PrintSkullAt, x2, y2 invoke PrintSkullAt, x3, y3 invoke Sleep, 220 ret ShowSkullSlideFrame ENDP ; --- AnimateSkullSwap12: игра с черепами и шариком, перемешивание и отрисовка --- AnimateSkullSwap12 PROC invoke ShowSkullSlideFrame, 0, 5, 18, 5, 36, 5 invoke ShowSkullSlideFrame, 4, 6, 14, 4, 36, 5 invoke ShowSkullSlideFrame, 8, 7, 10, 3, 36, 5 invoke ShowSkullSlideFrame, 14, 6, 4, 4, 36, 5 invoke ShowSkullSlideFrame, 18, 5, 0, 5, 36, 5 ret AnimateSkullSwap12 ENDP ; --- AnimateSkullSwap23: игра с черепами и шариком, перемешивание и отрисовка --- AnimateSkullSwap23 PROC invoke ShowSkullSlideFrame, 0, 5, 18, 5, 36, 5 invoke ShowSkullSlideFrame, 0, 5, 22, 6, 32, 4 invoke ShowSkullSlideFrame, 0, 5, 26, 7, 28, 3 invoke ShowSkullSlideFrame, 0, 5, 32, 6, 22, 4 invoke ShowSkullSlideFrame, 0, 5, 36, 5, 18, 5 ret AnimateSkullSwap23 ENDP ; --- AnimateSkullSwap13: игра с черепами и шариком, перемешивание и отрисовка --- AnimateSkullSwap13 PROC invoke ShowSkullSlideFrame, 0, 5, 18, 5, 36, 5 invoke ShowSkullSlideFrame, 8, 7, 18, 5, 28, 3 invoke ShowSkullSlideFrame, 18, 8, 18, 5, 18, 2 invoke ShowSkullSlideFrame, 28, 7, 18, 5, 8, 3 invoke ShowSkullSlideFrame, 36, 5, 18, 5, 0, 5 ret AnimateSkullSwap13 ENDP ; --- PrintSkullRows: вывод текста, цветов, картинок и элементов интерфейса --- PrintSkullRows PROC invoke PrintUtf8, OFFSET skullSeg1 invoke PrintUtf8, OFFSET skullSeg1 invoke PrintUtf8, OFFSET skullSeg1 invoke PrintStr, OFFSET nl invoke PrintUtf8, OFFSET skullSeg2 invoke PrintUtf8, OFFSET skullSeg2 invoke PrintUtf8, OFFSET skullSeg2 invoke PrintStr, OFFSET nl invoke PrintUtf8, OFFSET skullSeg3 invoke PrintUtf8, OFFSET skullSeg3 invoke PrintUtf8, OFFSET skullSeg3 invoke PrintStr, OFFSET nl invoke PrintUtf8, OFFSET skullSeg4 invoke PrintUtf8, OFFSET skullSeg4 invoke PrintUtf8, OFFSET skullSeg4 invoke PrintStr, OFFSET nl invoke PrintUtf8, OFFSET skullSeg5 invoke PrintUtf8, OFFSET skullSeg5 invoke PrintUtf8, OFFSET skullSeg5 invoke PrintStr, OFFSET nl invoke PrintUtf8, OFFSET skullSeg6 invoke PrintUtf8, OFFSET skullSeg6 invoke PrintUtf8, OFFSET skullSeg6 invoke PrintStr, OFFSET nl invoke PrintUtf8, OFFSET skullSeg7 invoke PrintUtf8, OFFSET skullSeg7 invoke PrintUtf8, OFFSET skullSeg7 invoke PrintStr, OFFSET nl invoke PrintUtf8, OFFSET skullSeg8 invoke PrintUtf8, OFFSET skullSeg8 invoke PrintUtf8, OFFSET skullSeg8 invoke PrintStr, OFFSET nl ret PrintSkullRows ENDP ; --- PrintSkulls: вывод текста, цветов, картинок и элементов интерфейса --- PrintSkulls PROC reveal:DWORD call PrintSkullRows invoke PrintStr, OFFSET skullNums cmp reveal, 0 je print_skull_blank_ball mov eax, skullBallPos cmp eax, 0 je print_skull_ball_1 cmp eax, 1 je print_skull_ball_2 invoke PrintStr, OFFSET skullBall3 ret print_skull_ball_1: invoke PrintStr, OFFSET skullBall1 ret print_skull_ball_2: invoke PrintStr, OFFSET skullBall2 ret print_skull_blank_ball: invoke PrintStr, OFFSET skullBlankBall ret PrintSkulls ENDP ; --- PrintSkullFaces: вывод текста, цветов, картинок и элементов интерфейса --- PrintSkullFaces PROC call PrintSkullRows invoke PrintStr, OFFSET skullBlankBall ret PrintSkullFaces ENDP ; --- ShowSkullShuffleFrame: звук, интро или покадровая анимация --- ShowSkullShuffleFrame PROC pSwapText:DWORD call ClearView invoke PrintTitleColor, OFFSET skullsTitle invoke PrintStr, OFFSET skullsShuffleText invoke PrintStr, pSwapText call PrintSkullFaces invoke Sleep, 400 ret ShowSkullShuffleFrame ENDP ; --- ShuffleSkulls: игра с черепами и шариком, перемешивание и отрисовка --- ShuffleSkulls PROC uses eax ebx cmp aiDifficulty, 1 je skulls_easy_steps cmp aiDifficulty, 3 je skulls_hard_steps skulls_normal_steps: invoke RandomRange, 4 add eax, 9 jmp skulls_store_steps skulls_easy_steps: invoke RandomRange, 4 add eax, 5 jmp skulls_store_steps skulls_hard_steps: invoke RandomRange, 5 add eax, 12 skulls_store_steps: mov skullMax, eax mov skullStep, 0 shuffle_skulls_loop: mov eax, skullStep cmp eax, skullMax jae shuffle_skulls_done cmp skullStep, 0 je skulls_play_first_move_sound mov eax, skullMax dec eax cmp skullStep, eax je skulls_play_last_move_sound jmp skulls_after_move_sound skulls_play_first_move_sound: call PlayStoneSound invoke Sleep, 180 jmp skulls_after_move_sound skulls_play_last_move_sound: call PlayStoneSound skulls_after_move_sound: invoke RandomRange, 3 cmp eax, 0 je shuffle_12 cmp eax, 1 je shuffle_23 jmp shuffle_13 shuffle_12: mov eax, skullBallPos cmp eax, 0 je ball_12_to_2 cmp eax, 1 je ball_12_to_1 jmp show_shuffle_12 ball_12_to_2: mov skullBallPos, 1 jmp show_shuffle_12 ball_12_to_1: mov skullBallPos, 0 show_shuffle_12: call AnimateSkullSwap12 jmp shuffle_next shuffle_23: mov eax, skullBallPos cmp eax, 1 je ball_23_to_3 cmp eax, 2 je ball_23_to_2 jmp show_shuffle_23 ball_23_to_3: mov skullBallPos, 2 jmp show_shuffle_23 ball_23_to_2: mov skullBallPos, 1 show_shuffle_23: call AnimateSkullSwap23 jmp shuffle_next shuffle_13: mov eax, skullBallPos cmp eax, 0 je ball_13_to_3 cmp eax, 2 je ball_13_to_1 jmp show_shuffle_13 ball_13_to_3: mov skullBallPos, 2 jmp show_shuffle_13 ball_13_to_1: mov skullBallPos, 0 show_shuffle_13: call AnimateSkullSwap13 shuffle_next: inc skullStep jmp shuffle_skulls_loop shuffle_skulls_done: ret ShuffleSkulls ENDP ; --- GameSkulls: игра с черепами и шариком, перемешивание и отрисовка --- GameSkulls PROC skulls_start: call ClearView invoke PrintTitleColor, OFFSET skullsTitle invoke PrintStr, OFFSET skullsIntroText call PromptBet invoke RandomRange, 3 mov skullBallPos, eax call ClearView invoke PrintTitleColor, OFFSET skullsTitle invoke PrintStr, OFFSET skullsShowText invoke PrintSkulls, 1 invoke Sleep, 1600 call ClearView invoke PrintTitleColor, OFFSET skullsTitle invoke PrintStr, OFFSET skullsHideText invoke PrintSkulls, 0 invoke Sleep, 800 call ShuffleSkulls skulls_guess_again: call ClearView invoke PrintTitleColor, OFFSET skullsTitle invoke PrintSkulls, 0 invoke PrintStr, OFFSET skullsGuessText call ReadKey cmp al, '1' je skull_guess_1 cmp al, '2' je skull_guess_2 cmp al, '3' je skull_guess_3 invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp skulls_guess_again skull_guess_1: mov skullGuess, 0 jmp skulls_reveal skull_guess_2: mov skullGuess, 1 jmp skulls_reveal skull_guess_3: mov skullGuess, 2 skulls_reveal: call ClearView invoke PrintTitleColor, OFFSET skullsTitle invoke PrintSkulls, 1 invoke PrintStr, OFFSET skullsBallText mov eax, skullBallPos inc eax invoke PrintUInt, eax invoke PrintStr, OFFSET nl mov eax, skullGuess cmp eax, skullBallPos jne skulls_lost invoke PrintStr, OFFSET skullsWinText invoke PaySlotMultiplier, 2 jmp ask_skulls_again skulls_lost: invoke PrintStr, OFFSET skullsLoseText call PayLose ask_skulls_again: cmp tournamentMode, 1 je skulls_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je skulls_start cmp al, 'Y' je skulls_start skulls_tournament_return: ret GameSkulls ENDP ; --- PrintRevolver: вывод текста, цветов, картинок и элементов интерфейса --- PrintRevolver PROC pGun:DWORD invoke SetColor, COLOR_WARN invoke PrintStr, pGun call ResetColor ret PrintRevolver ENDP ; --- PrintRouletteTurnGun: вывод текста, цветов, картинок и элементов интерфейса --- PrintRouletteTurnGun PROC cmp rrTurn, 0 jne print_rr_ai_gun invoke PrintRevolver, OFFSET rrGunDown ret print_rr_ai_gun: invoke PrintRevolver, OFFSET rrGunUp ret PrintRouletteTurnGun ENDP ; --- ShowRouletteStatus: русская рулетка или казино-рулетка --- ShowRouletteStatus PROC call ClearView invoke PrintTitleColor, OFFSET rouletteTitle call PrintRouletteTurnGun invoke PrintStr, OFFSET rrDangerText invoke PrintUInt, rrBullets invoke PrintStr, OFFSET nl ret ShowRouletteStatus ENDP ; --- ShowRouletteSpinFrame: звук, интро или покадровая анимация --- ShowRouletteSpinFrame PROC pGun:DWORD call ClearView invoke PrintTitleColor, OFFSET rouletteTitle invoke PrintRevolver, pGun invoke PrintStr, OFFSET rrSpinText invoke Sleep, 85 ret ShowRouletteSpinFrame ENDP ; --- AnimateRouletteSpin: русская рулетка или казино-рулетка --- AnimateRouletteSpin PROC invoke ShowRouletteSpinFrame, OFFSET rrGunUp invoke ShowRouletteSpinFrame, OFFSET rrGunUpLeft invoke ShowRouletteSpinFrame, OFFSET rrGunLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDownLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDown invoke ShowRouletteSpinFrame, OFFSET rrGunDownRight invoke ShowRouletteSpinFrame, OFFSET rrGunRight invoke ShowRouletteSpinFrame, OFFSET rrGunUpRight invoke ShowRouletteSpinFrame, OFFSET rrGunUp invoke ShowRouletteSpinFrame, OFFSET rrGunUpLeft invoke ShowRouletteSpinFrame, OFFSET rrGunLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDownLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDown invoke ShowRouletteSpinFrame, OFFSET rrGunDownRight invoke ShowRouletteSpinFrame, OFFSET rrGunRight invoke ShowRouletteSpinFrame, OFFSET rrGunUpRight cmp rrTurn, 0 jne roulette_spin_ai_final invoke ShowRouletteSpinFrame, OFFSET rrGunUp invoke ShowRouletteSpinFrame, OFFSET rrGunUpLeft invoke ShowRouletteSpinFrame, OFFSET rrGunLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDownLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDown jmp roulette_spin_final_message roulette_spin_ai_final: invoke ShowRouletteSpinFrame, OFFSET rrGunUp roulette_spin_final_message: call ShowRouletteStatus cmp rrTurn, 0 jne roulette_start_ai invoke PrintStr, OFFSET rrStartsPlayerText jmp roulette_start_done roulette_start_ai: invoke PrintStr, OFFSET rrStartsAIText roulette_start_done: invoke Sleep, 400 ret AnimateRouletteSpin ENDP ; --- SetupRoulette: русская рулетка или казино-рулетка --- SetupRoulette PROC uses eax ebx ecx edx mov rrBulletMask, 0 mov eax, aiDifficulty mov rrBullets, eax mov ecx, eax roulette_place_loop: cmp ecx, 0 je roulette_setup_done_bullets roulette_pick_chamber: invoke RandomRange, 6 mov ebx, 1 push ecx mov ecx, eax shl ebx, cl pop ecx mov edx, rrBulletMask test edx, ebx jne roulette_pick_chamber or rrBulletMask, ebx dec ecx jmp roulette_place_loop roulette_setup_done_bullets: invoke RandomRange, 6 mov rrChamber, eax invoke RandomRange, 2 mov rrTurn, eax ret SetupRoulette ENDP ; --- RouletteChamberLoaded: аккаунты, файлы сохранений и загрузка профиля --- RouletteChamberLoaded PROC uses ecx edx mov edx, 1 mov ecx, rrChamber shl edx, cl mov eax, rrBulletMask test eax, edx jne roulette_loaded xor eax, eax ret roulette_loaded: mov eax, 1 ret RouletteChamberLoaded ENDP ; --- AdvanceRouletteChamber: русская рулетка или казино-рулетка --- AdvanceRouletteChamber PROC inc rrChamber cmp rrChamber, 6 jb advance_roulette_done mov rrChamber, 0 advance_roulette_done: ret AdvanceRouletteChamber ENDP ; --- PrintBang: вывод текста, цветов, картинок и элементов интерфейса --- PrintBang PROC call PlayRouletteShotSound invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET rrBangText call ResetColor ret PrintBang ENDP ; --- GameRoulette: русская рулетка или казино-рулетка --- GameRoulette PROC roulette_start: call ClearView invoke PrintTitleColor, OFFSET rouletteTitle invoke PrintStr, OFFSET rrIntroText call PromptBet call PlayRouletteSpinSound call SetupRoulette call AnimateRouletteSpin roulette_turn_loop: call ShowRouletteStatus cmp rrTurn, 0 je roulette_player_turn roulette_ai_turn: invoke PrintStr, OFFSET rrAITurnText invoke Sleep, 900 call RouletteChamberLoaded cmp eax, 1 je roulette_ai_dead call PlayRouletteDrySound invoke PrintStr, OFFSET rrClickText invoke Sleep, 900 call AdvanceRouletteChamber mov rrTurn, 0 jmp roulette_turn_loop roulette_player_turn: invoke PrintStr, OFFSET rrPlayerTurnText call ReadAnyKey invoke PrintStr, OFFSET nl call RouletteChamberLoaded cmp eax, 1 je roulette_player_dead call PlayRouletteDrySound invoke PrintStr, OFFSET rrClickText invoke Sleep, 900 call AdvanceRouletteChamber mov rrTurn, 1 jmp roulette_turn_loop roulette_player_dead: call PrintBang invoke PrintStr, OFFSET rrPlayerLoseText call PayLose jmp ask_roulette_again roulette_ai_dead: invoke UnlockAchievement, 1000h, OFFSET achRussianWinName call PrintBang invoke PrintStr, OFFSET rrAIShotText invoke PrintStr, OFFSET rrPayoutText mov eax, aiDifficulty inc eax mov rrPayout, eax invoke PaySlotMultiplier, rrPayout ask_roulette_again: cmp tournamentMode, 1 je roulette_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je roulette_start cmp al, 'Y' je roulette_start roulette_tournament_return: ret GameRoulette ENDP ; --- ShowBuckshotFrame: звук, интро или покадровая анимация --- ShowBuckshotFrame PROC pFrame:DWORD, frameDelay:DWORD call ClearView invoke PrintTitleColor, OFFSET buckshotTitle invoke SetColor, COLOR_CARD invoke PrintStr, pFrame call ResetColor invoke Sleep, frameDelay ret ShowBuckshotFrame ENDP ; --- AnimateBuckshotLoad: аккаунты, файлы сохранений и загрузка профиля --- AnimateBuckshotLoad PROC invoke ShowBuckshotFrame, OFFSET bsShotgunLoad1, 180 invoke ShowBuckshotFrame, OFFSET bsShotgunLoad2, 260 invoke ShowBuckshotFrame, OFFSET bsShotgunLoad3, 260 ret AnimateBuckshotLoad ENDP ; --- AnimateBuckshotFire: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- AnimateBuckshotFire PROC invoke ShowBuckshotFrame, OFFSET bsShotgunFire, 220 ret AnimateBuckshotFire ENDP ; --- AnimateBuckshotDry: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- AnimateBuckshotDry PROC invoke ShowBuckshotFrame, OFFSET bsShotgunDry, 180 ret AnimateBuckshotDry ENDP ; --- BuckshotGiveItems: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotGiveItems PROC uses eax invoke RandomRange, 2 inc eax mov bsPlayerGlass, eax invoke RandomRange, 2 mov bsPlayerSaw, eax invoke RandomRange, 2 inc eax mov bsPlayerBeer, eax invoke RandomRange, 2 mov bsPlayerCuffs, eax invoke RandomRange, 2 inc eax mov bsAIGlass, eax invoke RandomRange, 2 mov bsAISaw, eax invoke RandomRange, 2 inc eax mov bsAIBeer, eax invoke RandomRange, 2 mov bsAICuffs, eax ret BuckshotGiveItems ENDP ; --- BuckshotLoad: аккаунты, файлы сохранений и загрузка профиля --- BuckshotLoad PROC uses eax ebx ecx edi invoke RandomRange, 5 add eax, 4 mov bsShellCount, eax mov bsShellIndex, 0 mov bsLiveCount, 0 mov bsBlankCount, 0 mov bsKnownShell, 0FFFFFFFFh mov edi, OFFSET bsShells mov ecx, bsShellCount bs_load_loop: invoke RandomRange, 2 mov [edi], eax cmp eax, 1 je bs_count_live inc bsBlankCount jmp bs_count_done bs_count_live: inc bsLiveCount bs_count_done: add edi, 4 loop bs_load_loop cmp bsLiveCount, 0 jne bs_has_live mov dword ptr bsShells, 1 inc bsLiveCount dec bsBlankCount bs_has_live: cmp bsBlankCount, 0 jne bs_has_blank mov dword ptr bsShells+4, 0 inc bsBlankCount dec bsLiveCount bs_has_blank: invoke PrintStr, OFFSET bsLoadText invoke PrintUInt, bsLiveCount invoke PrintStr, OFFSET bsLiveText invoke PrintUInt, bsBlankCount invoke PrintStr, OFFSET bsBlankText invoke Sleep, 900 ret BuckshotLoad ENDP ; --- BuckshotCurrentShell: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotCurrentShell PROC uses ebx mov ebx, bsShellIndex mov eax, bsShells[ebx*4] ret BuckshotCurrentShell ENDP ; --- BuckshotAdvance: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotAdvance PROC cmp bsShell, 1 je bs_advance_live cmp bsBlankCount, 0 je bs_advance_count_done dec bsBlankCount jmp bs_advance_count_done bs_advance_live: cmp bsLiveCount, 0 je bs_advance_count_done dec bsLiveCount bs_advance_count_done: inc bsShellIndex mov bsKnownShell, 0FFFFFFFFh mov bsDamage, 1 ret BuckshotAdvance ENDP ; --- BuckshotRemaining: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotRemaining PROC uses ebx mov eax, bsShellCount sub eax, bsShellIndex ret BuckshotRemaining ENDP ; --- BuckshotPrintKnown: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotPrintKnown PROC mov eax, bsKnownShell cmp eax, 1 je bs_print_known_live cmp eax, 0 je bs_print_known_blank invoke PrintStr, OFFSET bsKnownUnknownText ret bs_print_known_live: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET bsKnownLiveText call ResetColor ret bs_print_known_blank: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET bsKnownBlankText call ResetColor ret BuckshotPrintKnown ENDP ; --- BuckshotStatus: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotStatus PROC call ClearView invoke PrintTitleColor, OFFSET buckshotTitle invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET bsShotgunArt call ResetColor invoke PrintStr, OFFSET bsHPText invoke PrintUInt, bsPlayerHP invoke PrintStr, OFFSET bsAIHPText invoke PrintUInt, bsAIHP invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET bsShellInfoText invoke PrintUInt, bsLiveCount invoke PrintStr, OFFSET bsLiveText invoke PrintUInt, bsBlankCount invoke PrintStr, OFFSET bsBlankText invoke PrintStr, OFFSET bsLeftText call BuckshotRemaining invoke PrintUInt, eax invoke PrintStr, OFFSET nl call BuckshotPrintKnown invoke PrintStr, OFFSET bsItemsText invoke PrintUInt, bsPlayerGlass invoke PrintStr, OFFSET bsSawText invoke PrintUInt, bsPlayerSaw invoke PrintStr, OFFSET bsBeerText invoke PrintUInt, bsPlayerBeer invoke PrintStr, OFFSET bsCuffsText invoke PrintUInt, bsPlayerCuffs invoke PrintStr, OFFSET nl ret BuckshotStatus ENDP ; --- BuckshotAfterShotTurn: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotAfterShotTurn PROC cmp bsShell, 1 je bs_after_switch cmp bsTurn, 0 je bs_after_player_blank cmp bsTarget, 1 je bs_after_keep jmp bs_after_switch bs_after_player_blank: cmp bsTarget, 0 je bs_after_keep bs_after_switch: xor bsTurn, 1 bs_after_keep: cmp bsTurn, 0 je bs_check_skip_player cmp bsSkipAI, 0 je bs_after_done mov bsSkipAI, 0 invoke PrintStr, OFFSET bsSkipAIText invoke Sleep, 800 mov bsTurn, 0 ret bs_check_skip_player: cmp bsSkipPlayer, 0 je bs_after_done mov bsSkipPlayer, 0 invoke PrintStr, OFFSET bsSkipPlayerText invoke Sleep, 800 mov bsTurn, 1 bs_after_done: ret BuckshotAfterShotTurn ENDP ; --- BuckshotShoot: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotShoot PROC uses eax ebx call BuckshotCurrentShell mov bsShell, eax cmp bsTarget, 0 je bs_shoot_player_text invoke PrintStr, OFFSET bsShootAIText jmp bs_shoot_text_done bs_shoot_player_text: invoke PrintStr, OFFSET bsShootPlayerText bs_shoot_text_done: cmp bsShell, 1 je bs_live_shot call AnimateBuckshotDry call PlayRouletteDrySound invoke PrintStr, OFFSET bsDryText call BuckshotAdvance invoke Sleep, 900 call BuckshotAfterShotTurn ret bs_live_shot: call AnimateBuckshotFire call PlayRouletteShotSound invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET bsHitText invoke PrintUInt, bsDamage invoke PrintStr, OFFSET nl call ResetColor mov eax, bsDamage cmp bsTarget, 0 je bs_damage_player cmp bsAIHP, eax ja bs_sub_ai mov bsAIHP, 0 jmp bs_damage_done bs_sub_ai: sub bsAIHP, eax jmp bs_damage_done bs_damage_player: cmp bsPlayerHP, eax ja bs_sub_player mov bsPlayerHP, 0 jmp bs_damage_done bs_sub_player: sub bsPlayerHP, eax bs_damage_done: call BuckshotAdvance invoke Sleep, 1000 call BuckshotAfterShotTurn ret BuckshotShoot ENDP ; --- BuckshotUseGlass: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotUseGlass PROC call BuckshotCurrentShell mov bsKnownShell, eax invoke PrintStr, OFFSET bsGlassUseText call BuckshotPrintKnown invoke Sleep, 1000 ret BuckshotUseGlass ENDP ; --- BuckshotUseBeer: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotUseBeer PROC call BuckshotCurrentShell mov bsShell, eax invoke PrintStr, OFFSET bsBeerUseText cmp bsShell, 1 je bs_beer_live invoke PrintStr, OFFSET bsBlankLoadedText jmp bs_beer_done bs_beer_live: invoke PrintStr, OFFSET bsLiveLoadedText bs_beer_done: call BuckshotAdvance invoke Sleep, 1000 ret BuckshotUseBeer ENDP ; --- BuckshotPlayerTurn: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotPlayerTurn PROC bs_player_again: call BuckshotStatus invoke PrintStr, OFFSET bsPlayerTurnText invoke PrintStr, OFFSET bsMenuText call ReadKey cmp al, '1' je bs_player_self cmp al, '2' je bs_player_ai cmp al, '3' je bs_player_glass cmp al, '4' je bs_player_saw cmp al, '5' je bs_player_beer cmp al, '6' je bs_player_cuffs invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp bs_player_again bs_player_self: mov bsTarget, 0 call BuckshotShoot ret bs_player_ai: mov bsTarget, 1 call BuckshotShoot ret bs_player_glass: cmp bsPlayerGlass, 0 je bs_player_no_item dec bsPlayerGlass call BuckshotUseGlass jmp bs_player_again bs_player_saw: cmp bsPlayerSaw, 0 je bs_player_no_item dec bsPlayerSaw mov bsDamage, 2 invoke PrintStr, OFFSET bsSawUseText invoke Sleep, 900 jmp bs_player_again bs_player_beer: cmp bsPlayerBeer, 0 je bs_player_no_item dec bsPlayerBeer call BuckshotUseBeer call BuckshotRemaining cmp eax, 0 je bs_player_done jmp bs_player_again bs_player_cuffs: cmp bsPlayerCuffs, 0 je bs_player_no_item dec bsPlayerCuffs mov bsSkipAI, 1 invoke PrintStr, OFFSET bsCuffsUseText invoke Sleep, 900 jmp bs_player_again bs_player_no_item: invoke PrintStr, OFFSET bsNoItemText invoke Sleep, 800 jmp bs_player_again bs_player_done: ret BuckshotPlayerTurn ENDP ; --- BuckshotAITurn: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- BuckshotAITurn PROC call BuckshotStatus invoke PrintStr, OFFSET bsAITurnText invoke Sleep, 900 cmp bsKnownShell, 0FFFFFFFFh jne bs_ai_known cmp bsAIGlass, 0 je bs_ai_no_glass dec bsAIGlass invoke PrintStr, OFFSET bsAIGlassText call BuckshotUseGlass bs_ai_no_glass: bs_ai_known: cmp bsKnownShell, 1 je bs_ai_live cmp bsKnownShell, 0 je bs_ai_blank mov eax, bsLiveCount cmp eax, bsBlankCount jae bs_ai_live bs_ai_blank: mov bsTarget, 1 call BuckshotShoot ret bs_ai_live: cmp bsAISaw, 0 je bs_ai_maybe_cuffs dec bsAISaw mov bsDamage, 2 invoke PrintStr, OFFSET bsAISawText invoke Sleep, 700 bs_ai_maybe_cuffs: cmp bsAICuffs, 0 je bs_ai_shoot_player dec bsAICuffs mov bsSkipPlayer, 1 invoke PrintStr, OFFSET bsAICuffsText invoke Sleep, 700 bs_ai_shoot_player: mov bsTarget, 0 call BuckshotShoot ret BuckshotAITurn ENDP ; --- GameBuckshot: Buckshot Roulette: патроны, предметы, ходы игрока и ИИ --- GameBuckshot PROC buckshot_start: call ClearView invoke PrintTitleColor, OFFSET buckshotTitle invoke PrintStr, OFFSET buckshotIntro call PromptBet mov bsPlayerHP, 4 mov bsAIHP, 4 mov bsTurn, 0 mov bsDamage, 1 mov bsSkipPlayer, 0 mov bsSkipAI, 0 call BuckshotGiveItems call PlayRouletteSpinSound call AnimateBuckshotLoad call BuckshotLoad buckshot_loop: call BuckshotRemaining cmp eax, 0 jne buckshot_has_shells call AnimateBuckshotLoad call BuckshotLoad buckshot_has_shells: cmp bsPlayerHP, 0 je buckshot_lost cmp bsAIHP, 0 je buckshot_won cmp bsTurn, 0 je buckshot_player call BuckshotAITurn jmp buckshot_loop buckshot_player: call BuckshotPlayerTurn jmp buckshot_loop buckshot_won: call BuckshotStatus invoke PrintStr, OFFSET bsWinText invoke PaySlotMultiplier, 3 jmp buckshot_again buckshot_lost: call BuckshotStatus invoke PrintStr, OFFSET bsLoseText call PayLose buckshot_again: call SaveGame cmp tournamentMode, 1 je buckshot_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je buckshot_start cmp al, 'Y' je buckshot_start buckshot_tournament_return: ret GameBuckshot ENDP ; --- PrintDiceParity: вывод текста, цветов, картинок и элементов интерфейса --- PrintDiceParity PROC parity:DWORD cmp parity, 1 jne print_dice_odd invoke PrintStr, OFFSET diceEvenText ret print_dice_odd: invoke PrintStr, OFFSET diceOddText ret PrintDiceParity ENDP ; --- GameDice: кости: бросок, четность и результат --- GameDice PROC dice_start: call ClearView invoke PrintTitleColor, OFFSET diceTitle invoke PrintStr, OFFSET diceIntroText call PromptBet dice_choose: call ClearView invoke PrintTitleColor, OFFSET diceTitle invoke PrintStr, OFFSET diceIntroText call PrintBank invoke PrintStr, OFFSET diceChoiceText call ReadKey cmp al, '1' je dice_pick_even cmp al, '2' je dice_pick_odd invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp dice_choose dice_pick_even: mov diceChoice, 1 jmp dice_roll dice_pick_odd: mov diceChoice, 2 dice_roll: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET diceRollText call ResetColor invoke Sleep, 500 invoke RandomRange, 6 inc eax mov diceA, eax invoke RandomRange, 6 inc eax mov diceB, eax mov eax, diceA add eax, diceB mov diceSum, eax invoke PrintStr, OFFSET diceFirstText invoke PrintUInt, diceA invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET diceSecondText invoke PrintUInt, diceB invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET diceSumText invoke PrintUInt, diceSum invoke PrintStr, OFFSET nl mov eax, diceSum and eax, 1 cmp eax, 0 je dice_result_even mov eax, 2 jmp dice_compare dice_result_even: mov eax, 1 dice_compare: cmp eax, diceChoice je dice_win call PrintLoseEvent call PayLose jmp dice_again dice_win: call PrintWinEvent call PayWin dice_again: cmp tournamentMode, 1 je dice_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je dice_start cmp al, 'Y' je dice_start dice_tournament_return: ret GameDice ENDP ; --- Online Dice: Radmin LAN match without a separate server process --- onlineTitle db 13,10,"--- Online Casino (Radmin) ---",13,10,0 onlineMenuText db "1. Host room",13,10,"2. Join room",13,10,"0. Back",13,10,0 onlineHostInfo db "Give your Radmin IPv4 and port 27015 to your friend.",13,10,"Waiting for one player...",13,10,0 onlineJoinPrompt db "Host Radmin IPv4: ",0 onlineConnectingText db "Connecting...",13,10,0 onlineConnectedText db "Connected.",13,10,0 onlineYouRollText db "Your roll: ",0 onlineFriendRollText db "Friend roll: ",0 onlineWinText db "You win this friendly match.",13,10,0 onlineLoseText db "Friend wins this friendly match.",13,10,0 onlineDrawText db "Draw. Same roll.",13,10,0 onlineErrorText db "Network error. Winsock code: ",0 onlineBadIpText db "IPv4 address is invalid.",13,10,0 OnlineStartWinsock PROC invoke WSAStartup, 0202h, OFFSET onlineWsaData test eax, eax jnz online_start_fail mov onlineWsaReady, 1 mov eax, 1 ret online_start_fail: xor eax, eax ret OnlineStartWinsock ENDP OnlineCleanup PROC cmp onlinePeerSock, -1 je online_cleanup_listener invoke closesocket, onlinePeerSock mov onlinePeerSock, -1 online_cleanup_listener: cmp onlineListenSock, -1 je online_cleanup_wsa invoke closesocket, onlineListenSock mov onlineListenSock, -1 online_cleanup_wsa: cmp onlineWsaReady, 1 jne online_cleanup_done invoke WSACleanup mov onlineWsaReady, 0 online_cleanup_done: ret OnlineCleanup ENDP OnlineBuildAddress PROC uses eax ecx edi lea edi, onlineAddr xor eax, eax mov ecx, 4 rep stosd mov word ptr onlineAddr, AF_INET mov word ptr onlineAddr+2, ONLINE_PORT_NET ret OnlineBuildAddress ENDP ReadOnlineIp PROC uses eax ecx esi edi lea edi, onlineIp xor eax, eax mov ecx, 32 rep stosb invoke ReadFile, hIn, OFFSET onlineIp, 31, ADDR charsRead, 0 mov ecx, charsRead cmp ecx, 31 jbe online_ip_len_ok mov ecx, 31 online_ip_len_ok: mov byte ptr onlineIp[ecx], 0 mov esi, OFFSET onlineIp online_ip_trim: cmp ecx, 0 je online_ip_done mov al, [esi] cmp al, 13 je online_ip_end cmp al, 10 je online_ip_end inc esi dec ecx jmp online_ip_trim online_ip_end: mov byte ptr [esi], 0 online_ip_done: ret ReadOnlineIp ENDP NetSendAll PROC uses esi edi, hSocket:DWORD, pData:DWORD, byteCount:DWORD mov esi, pData mov edi, byteCount online_send_loop: cmp edi, 0 je online_send_ok invoke send, hSocket, esi, edi, 0 test eax, eax jle online_send_fail add esi, eax sub edi, eax jmp online_send_loop online_send_ok: mov eax, 1 ret online_send_fail: xor eax, eax ret NetSendAll ENDP NetRecvAll PROC uses esi edi, hSocket:DWORD, pData:DWORD, byteCount:DWORD mov esi, pData mov edi, byteCount online_recv_loop: cmp edi, 0 je online_recv_ok invoke recv, hSocket, esi, edi, 0 test eax, eax jle online_recv_fail add esi, eax sub edi, eax jmp online_recv_loop online_recv_ok: mov eax, 1 ret online_recv_fail: xor eax, eax ret NetRecvAll ENDP PrintOnlineError PROC invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET onlineErrorText invoke WSAGetLastError invoke PrintUInt, eax invoke PrintStr, OFFSET nl call ResetColor ret PrintOnlineError ENDP ShowOnlineResult PROC call ClearView invoke PrintTitleColor, OFFSET onlineTitle invoke PrintStr, OFFSET onlineYouRollText invoke PrintUInt, onlineLocalRoll invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET onlineFriendRollText invoke PrintUInt, onlineRemoteRoll invoke PrintStr, OFFSET nl mov eax, onlineLocalRoll cmp eax, onlineRemoteRoll ja online_result_win jb online_result_lose invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET onlineDrawText call ResetColor jmp online_result_done online_result_win: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET onlineWinText call ResetColor jmp online_result_done online_result_lose: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET onlineLoseText call ResetColor online_result_done: ret ShowOnlineResult ENDP OnlineHostGameText db "Choose online game:",13,10,"1. Dice 1v1",13,10,"2. Russian Roulette 1v1",13,10,"0. Back",13,10,0 OnlineModeDiceText db "Room mode: Dice 1v1",13,10,0 OnlineModeRRText db "Room mode: Russian Roulette 1v1",13,10,0 OnlineProtocolText db "Players use different online protocol versions.",13,10,0 OnlineRRYourTurnText db "Your turn. Press any key to pull the trigger...",0 OnlineRRWaitText db "Friend is holding the revolver. Waiting for the trigger...",13,10,0 OnlineRRStartsYouText db "The revolver points at you. You shoot first.",13,10,0 OnlineRRStartsFriendText db "The revolver points at your friend. Friend shoots first.",13,10,0 OnlineRRWinText db "Your friend caught the loaded chamber. You survived.",13,10,0 OnlineRRLoseText db "The loaded chamber was yours. You lost.",13,10,0 OnlineHostConnect PROC call OnlineStartWinsock test eax, eax jz online_host_connect_error invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP cmp eax, SOCKET_ERROR je online_host_connect_error mov onlineListenSock, eax call OnlineBuildAddress invoke bind, onlineListenSock, OFFSET onlineAddr, 16 test eax, eax jnz online_host_connect_error invoke listen, onlineListenSock, 1 test eax, eax jnz online_host_connect_error call ClearView invoke PrintTitleColor, OFFSET onlineTitle invoke PrintStr, OFFSET onlineHostInfo invoke accept, onlineListenSock, 0, 0 cmp eax, SOCKET_ERROR je online_host_connect_error mov onlinePeerSock, eax invoke closesocket, onlineListenSock mov onlineListenSock, -1 invoke PrintStr, OFFSET onlineConnectedText mov eax, 1 ret online_host_connect_error: call PrintOnlineError call OnlineCleanup call PauseConsole xor eax, eax ret OnlineHostConnect ENDP OnlineJoinConnect PROC call OnlineStartWinsock test eax, eax jz online_join_connect_error call ClearView invoke PrintTitleColor, OFFSET onlineTitle invoke PrintStr, OFFSET onlineJoinPrompt call ReadOnlineIp invoke inet_addr, OFFSET onlineIp cmp eax, 0FFFFFFFFh je online_join_connect_bad_ip mov onlineHostIp, eax invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP cmp eax, SOCKET_ERROR je online_join_connect_error mov onlinePeerSock, eax call OnlineBuildAddress mov eax, onlineHostIp mov dword ptr onlineAddr+4, eax invoke PrintStr, OFFSET onlineConnectingText invoke connect, onlinePeerSock, OFFSET onlineAddr, 16 test eax, eax jnz online_join_connect_error invoke PrintStr, OFFSET onlineConnectedText mov eax, 1 ret online_join_connect_bad_ip: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET onlineBadIpText call ResetColor call OnlineCleanup call PauseConsole xor eax, eax ret online_join_connect_error: call PrintOnlineError call OnlineCleanup call PauseConsole xor eax, eax ret OnlineJoinConnect ENDP OnlineDiceSessionHost PROC invoke RandomRange, 6 inc eax mov onlinePacket, eax mov onlineLocalRoll, eax invoke RandomRange, 6 inc eax mov onlinePacket+4, eax mov onlineRemoteRoll, eax invoke NetSendAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_dice_host_fail invoke Sleep, 450 call ShowOnlineResult mov eax, 1 ret online_dice_host_fail: xor eax, eax ret OnlineDiceSessionHost ENDP OnlineDiceSessionClient PROC invoke NetRecvAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_dice_client_fail mov eax, onlinePacket+4 mov onlineLocalRoll, eax mov eax, onlinePacket mov onlineRemoteRoll, eax invoke Sleep, 450 call ShowOnlineResult mov eax, 1 ret online_dice_client_fail: xor eax, eax ret OnlineDiceSessionClient ENDP ShowOnlineRRStatus PROC role:DWORD call ClearView invoke PrintTitleColor, OFFSET rouletteTitle mov eax, rrTurn cmp eax, role jne online_rr_status_friend invoke PrintRevolver, OFFSET rrGunDown jmp online_rr_status_info online_rr_status_friend: invoke PrintRevolver, OFFSET rrGunUp online_rr_status_info: invoke PrintStr, OFFSET rrDangerText invoke PrintUInt, rrBullets invoke PrintStr, OFFSET nl ret ShowOnlineRRStatus ENDP AnimateOnlineRRStart PROC role:DWORD invoke ShowRouletteSpinFrame, OFFSET rrGunUp invoke ShowRouletteSpinFrame, OFFSET rrGunUpLeft invoke ShowRouletteSpinFrame, OFFSET rrGunLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDownLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDown invoke ShowRouletteSpinFrame, OFFSET rrGunDownRight invoke ShowRouletteSpinFrame, OFFSET rrGunRight invoke ShowRouletteSpinFrame, OFFSET rrGunUpRight invoke ShowRouletteSpinFrame, OFFSET rrGunUp invoke ShowRouletteSpinFrame, OFFSET rrGunUpLeft invoke ShowRouletteSpinFrame, OFFSET rrGunLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDownLeft invoke ShowRouletteSpinFrame, OFFSET rrGunDown invoke ShowRouletteSpinFrame, OFFSET rrGunDownRight invoke ShowRouletteSpinFrame, OFFSET rrGunRight invoke ShowRouletteSpinFrame, OFFSET rrGunUpRight invoke ShowOnlineRRStatus, role mov eax, rrTurn cmp eax, role jne online_rr_start_friend invoke PrintStr, OFFSET OnlineRRStartsYouText ret online_rr_start_friend: invoke PrintStr, OFFSET OnlineRRStartsFriendText ret AnimateOnlineRRStart ENDP ShowOnlineRRShot PROC role:DWORD cmp onlinePacket, 1 je online_rr_shot_bang call PlayRouletteDrySound invoke PrintStr, OFFSET rrClickText invoke Sleep, 850 ret online_rr_shot_bang: call PrintBang mov eax, onlinePacket+4 cmp eax, role jne online_rr_shot_win invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET OnlineRRLoseText call ResetColor ret online_rr_shot_win: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET OnlineRRWinText call ResetColor ret ShowOnlineRRShot ENDP OnlineRRSessionHost PROC call SetupRoulette mov eax, rrBullets mov onlinePacket, eax mov eax, rrTurn mov onlinePacket+4, eax invoke NetSendAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_rr_host_fail call PlayRouletteSpinSound invoke AnimateOnlineRRStart, 0 online_rr_host_loop: invoke ShowOnlineRRStatus, 0 cmp rrTurn, 0 je online_rr_host_own_turn invoke PrintStr, OFFSET OnlineRRWaitText invoke NetRecvAll, onlinePeerSock, OFFSET onlineAction, 4 test eax, eax jz online_rr_host_fail jmp online_rr_host_fire online_rr_host_own_turn: invoke PrintStr, OFFSET OnlineRRYourTurnText call ReadAnyKey invoke PrintStr, OFFSET nl online_rr_host_fire: mov onlinePacket, 0 call RouletteChamberLoaded cmp eax, 1 jne online_rr_host_event_ready mov onlinePacket, 1 online_rr_host_event_ready: mov eax, rrTurn mov onlinePacket+4, eax invoke NetSendAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_rr_host_fail invoke ShowOnlineRRShot, 0 cmp onlinePacket, 1 je online_rr_host_done call AdvanceRouletteChamber xor rrTurn, 1 jmp online_rr_host_loop online_rr_host_done: mov eax, 1 ret online_rr_host_fail: xor eax, eax ret OnlineRRSessionHost ENDP OnlineRRSessionClient PROC invoke NetRecvAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_rr_client_fail mov eax, onlinePacket mov rrBullets, eax mov eax, onlinePacket+4 mov rrTurn, eax call PlayRouletteSpinSound invoke AnimateOnlineRRStart, 1 online_rr_client_loop: invoke ShowOnlineRRStatus, 1 cmp rrTurn, 1 jne online_rr_client_wait invoke PrintStr, OFFSET OnlineRRYourTurnText call ReadAnyKey invoke PrintStr, OFFSET nl mov onlineAction, 1 invoke NetSendAll, onlinePeerSock, OFFSET onlineAction, 4 test eax, eax jz online_rr_client_fail jmp online_rr_client_receive online_rr_client_wait: invoke PrintStr, OFFSET OnlineRRWaitText online_rr_client_receive: invoke NetRecvAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_rr_client_fail mov eax, onlinePacket+4 mov rrTurn, eax invoke ShowOnlineRRShot, 1 cmp onlinePacket, 1 je online_rr_client_done xor rrTurn, 1 jmp online_rr_client_loop online_rr_client_done: mov eax, 1 ret online_rr_client_fail: xor eax, eax ret OnlineRRSessionClient ENDP GameOnlineCasino PROC online_casino_menu: call ClearView invoke PrintTitleColor, OFFSET onlineTitle invoke PrintStr, OFFSET onlineMenuText invoke PrintStr, OFFSET choiceText call ReadKey cmp al, '1' je online_casino_host_choose cmp al, '2' je online_casino_join cmp al, '0' je online_casino_done invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET badChoiceText call ResetColor invoke Sleep, 650 jmp online_casino_menu online_casino_host_choose: call ClearView invoke PrintTitleColor, OFFSET onlineTitle invoke PrintStr, OFFSET OnlineHostGameText invoke PrintStr, OFFSET choiceText call ReadKey cmp al, '1' je online_casino_host_dice cmp al, '2' je online_casino_host_rr cmp al, '0' je online_casino_menu invoke PrintStr, OFFSET badChoiceText invoke Sleep, 650 jmp online_casino_host_choose online_casino_host_dice: mov onlineGameMode, ONLINE_GAME_DICE jmp online_casino_host_connect online_casino_host_rr: mov onlineGameMode, ONLINE_GAME_RR online_casino_host_connect: call OnlineHostConnect test eax, eax jz online_casino_done mov onlinePacket, ONLINE_MAGIC mov eax, onlineGameMode mov onlinePacket+4, eax invoke NetSendAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_casino_session_error cmp onlineGameMode, ONLINE_GAME_DICE je online_casino_run_host_dice invoke PrintStr, OFFSET OnlineModeRRText call OnlineRRSessionHost jmp online_casino_session_done online_casino_run_host_dice: invoke PrintStr, OFFSET OnlineModeDiceText call OnlineDiceSessionHost jmp online_casino_session_done online_casino_join: call OnlineJoinConnect test eax, eax jz online_casino_done invoke NetRecvAll, onlinePeerSock, OFFSET onlinePacket, 8 test eax, eax jz online_casino_session_error cmp onlinePacket, ONLINE_MAGIC jne online_casino_protocol_error mov eax, onlinePacket+4 mov onlineGameMode, eax cmp eax, ONLINE_GAME_DICE je online_casino_run_client_dice cmp eax, ONLINE_GAME_RR je online_casino_run_client_rr jmp online_casino_protocol_error online_casino_run_client_dice: invoke PrintStr, OFFSET OnlineModeDiceText call OnlineDiceSessionClient jmp online_casino_session_done online_casino_run_client_rr: invoke PrintStr, OFFSET OnlineModeRRText call OnlineRRSessionClient online_casino_session_done: test eax, eax jz online_casino_session_error call OnlineCleanup call PauseConsole ret online_casino_protocol_error: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET OnlineProtocolText call ResetColor call OnlineCleanup call PauseConsole ret online_casino_session_error: call PrintOnlineError call OnlineCleanup call PauseConsole online_casino_done: ret GameOnlineCasino ENDP ; --- PrintCoinSide: вывод текста, цветов, картинок и элементов интерфейса --- PrintCoinSide PROC side:DWORD cmp side, 1 jne print_coin_tails invoke PrintStr, OFFSET coinHeadsText ret print_coin_tails: invoke PrintStr, OFFSET coinTailsText ret PrintCoinSide ENDP ; --- ShowCoinFlipFrame: звук, интро или покадровая анимация --- ShowCoinFlipFrame PROC uses eax, pFrame:DWORD call ClearView invoke PrintTitleColor, OFFSET coinTitle invoke PrintStr, OFFSET coinIntroText call PrintBank invoke PrintStr, OFFSET coinPickText invoke PrintCoinSide, coinPick invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET coinSpinText mov eax, pFrame invoke PrintStr, eax call ResetColor invoke Sleep, 170 ret ShowCoinFlipFrame ENDP ; --- AnimateCoinFlip: орел и решка: выбор стороны, звук и анимация монеты --- AnimateCoinFlip PROC invoke ShowCoinFlipFrame, OFFSET coinFrame1 invoke ShowCoinFlipFrame, OFFSET coinFrame2 invoke ShowCoinFlipFrame, OFFSET coinFrame3 invoke ShowCoinFlipFrame, OFFSET coinFrame4 invoke ShowCoinFlipFrame, OFFSET coinFrame5 invoke ShowCoinFlipFrame, OFFSET coinFrame6 invoke ShowCoinFlipFrame, OFFSET coinFrame7 invoke ShowCoinFlipFrame, OFFSET coinFrame8 invoke ShowCoinFlipFrame, OFFSET coinFrame9 invoke ShowCoinFlipFrame, OFFSET coinFrame10 invoke ShowCoinFlipFrame, OFFSET coinFrame11 invoke ShowCoinFlipFrame, OFFSET coinFrame12 invoke ShowCoinFlipFrame, OFFSET coinFrame13 invoke ShowCoinFlipFrame, OFFSET coinFrame14 ret AnimateCoinFlip ENDP ; --- GameCoin: орел и решка: выбор стороны, звук и анимация монеты --- GameCoin PROC coin_start: call ClearView invoke PrintTitleColor, OFFSET coinTitle invoke PrintStr, OFFSET coinIntroText call PromptBet coin_choose: call ClearView invoke PrintTitleColor, OFFSET coinTitle invoke PrintStr, OFFSET coinIntroText call PrintBank invoke PrintStr, OFFSET coinChoiceText call ReadKey cmp al, '1' je coin_pick_heads cmp al, '2' je coin_pick_tails invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp coin_choose coin_pick_heads: mov coinPick, 1 jmp coin_flip coin_pick_tails: mov coinPick, 2 coin_flip: invoke PrintStr, OFFSET coinPickText invoke PrintCoinSide, coinPick call PlayCoinSound call AnimateCoinFlip invoke RandomRange, 2 inc eax mov coinResult, eax invoke PrintStr, OFFSET coinResultText invoke PrintCoinSide, coinResult mov eax, coinPick cmp eax, coinResult je coin_win call PrintLoseEvent call PayLose jmp coin_again coin_win: call PrintWinEvent call PayWin coin_again: cmp tournamentMode, 1 je coin_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je coin_start cmp al, 'Y' je coin_start coin_tournament_return: ret GameCoin ENDP ; --- PrintRouletteColorName: вывод текста, цветов, картинок и элементов интерфейса --- PrintRouletteColorName PROC uses eax ebx, value:DWORD mov eax, value cmp eax, 0 jne roulette_color_not_zero invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET rouletteGreenName call ResetColor ret roulette_color_not_zero: movzx ebx, byte ptr [rouletteColors + eax] cmp ebx, 1 jne roulette_color_black invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET rouletteRedName call ResetColor ret roulette_color_black: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET rouletteBlackName call ResetColor ret PrintRouletteColorName ENDP ; --- PrintRouletteNumberColored: вывод текста, цветов, картинок и элементов интерфейса --- PrintRouletteNumberColored PROC uses eax ebx, value:DWORD mov eax, value cmp eax, 0 jne roulette_number_not_zero invoke SetColor, COLOR_MONEY jmp roulette_number_print roulette_number_not_zero: movzx ebx, byte ptr [rouletteColors + eax] cmp ebx, 1 jne roulette_number_black invoke SetColor, COLOR_BAD jmp roulette_number_print roulette_number_black: invoke SetColor, COLOR_CARD roulette_number_print: invoke PrintUInt, value call ResetColor ret PrintRouletteNumberColored ENDP ; --- PrintRoulettePocket: вывод текста, цветов, картинок и элементов интерфейса --- PrintRoulettePocket PROC uses eax, wheelIndex:DWORD invoke PrintStr, OFFSET roulettePocketLeft mov eax, wheelIndex mov eax, [rouletteWheel + eax * 4] push eax cmp eax, 10 jae roulette_pocket_no_pad invoke PrintStr, OFFSET rouletteNumSpace roulette_pocket_no_pad: pop eax invoke PrintRouletteNumberColored, eax invoke PrintStr, OFFSET roulettePocketRight ret PrintRoulettePocket ENDP ; --- PrintRoulettePocketOffset: вывод текста, цветов, картинок и элементов интерфейса --- PrintRoulettePocketOffset PROC uses eax, wheelOffset:DWORD mov eax, casinoRouletteSpinIndex add eax, wheelOffset roulette_offset_wrap: cmp eax, 37 jb roulette_offset_ready sub eax, 37 jmp roulette_offset_wrap roulette_offset_ready: invoke PrintRoulettePocket, eax ret PrintRoulettePocketOffset ENDP ; --- PrintRouletteTopRow: вывод текста, цветов, картинок и элементов интерфейса --- PrintRouletteTopRow PROC invoke PrintStr, OFFSET casinoRoulettePad invoke PrintRoulettePocketOffset, 31 invoke PrintRoulettePocketOffset, 32 invoke PrintRoulettePocketOffset, 33 invoke PrintRoulettePocketOffset, 34 invoke PrintRoulettePocketOffset, 35 invoke PrintRoulettePocketOffset, 36 invoke PrintRoulettePocketOffset, 0 invoke PrintRoulettePocketOffset, 1 invoke PrintRoulettePocketOffset, 2 invoke PrintRoulettePocketOffset, 3 invoke PrintRoulettePocketOffset, 4 invoke PrintRoulettePocketOffset, 5 invoke PrintRoulettePocketOffset, 6 invoke PrintStr, OFFSET nl ret PrintRouletteTopRow ENDP ; --- PrintRouletteBottomRow: вывод текста, цветов, картинок и элементов интерфейса --- PrintRouletteBottomRow PROC invoke PrintStr, OFFSET casinoRoulettePad invoke PrintRoulettePocketOffset, 24 invoke PrintRoulettePocketOffset, 23 invoke PrintRoulettePocketOffset, 22 invoke PrintRoulettePocketOffset, 21 invoke PrintRoulettePocketOffset, 20 invoke PrintRoulettePocketOffset, 19 invoke PrintRoulettePocketOffset, 18 invoke PrintRoulettePocketOffset, 17 invoke PrintRoulettePocketOffset, 16 invoke PrintRoulettePocketOffset, 15 invoke PrintRoulettePocketOffset, 14 invoke PrintRoulettePocketOffset, 13 invoke PrintStr, OFFSET nl ret PrintRouletteBottomRow ENDP ; --- PrintRouletteSideRow: вывод текста, цветов, картинок и элементов интерфейса --- PrintRouletteSideRow PROC leftOffset:DWORD, pGap:DWORD, rightOffset:DWORD invoke SetColor, COLOR_WOOD invoke PrintStr, OFFSET rouletteBigSidePad call ResetColor invoke PrintRoulettePocketOffset, leftOffset invoke SetColor, COLOR_TABLE invoke PrintStr, pGap call ResetColor invoke PrintRoulettePocketOffset, rightOffset invoke PrintStr, OFFSET nl ret PrintRouletteSideRow ENDP ; --- ShowCasinoRouletteFrame: звук, интро или покадровая анимация --- ShowCasinoRouletteFrame PROC call ClearView invoke PrintTitleColor, OFFSET casinoRouletteTitle invoke SetColor, COLOR_WOOD invoke PrintStr, OFFSET casinoRouletteWheelTop call ResetColor call PrintRouletteTopRow invoke PrintRouletteSideRow, 30, OFFSET rouletteBigSideGap1, 7 invoke PrintRouletteSideRow, 29, OFFSET rouletteBigSideGap2, 8 invoke PrintRouletteSideRow, 28, OFFSET rouletteBigSideGap3, 9 invoke PrintRouletteSideRow, 27, OFFSET rouletteBigSideGap4, 10 invoke PrintRouletteSideRow, 26, OFFSET rouletteBigSideGap5, 11 invoke PrintRouletteSideRow, 25, OFFSET rouletteBigSideGap6, 12 call PrintRouletteBottomRow invoke SetColor, COLOR_WOOD invoke PrintStr, OFFSET casinoRouletteWheelBottom call ResetColor invoke PrintStr, OFFSET casinoRouletteSpinText ret ShowCasinoRouletteFrame ENDP ; --- AnimateCasinoRouletteSpin: русская рулетка или казино-рулетка --- AnimateCasinoRouletteSpin PROC uses eax ebx edx invoke GetTickCount xor seed, eax invoke RandomRange, 37 mov casinoRouletteResultIndex, eax mov ebx, eax mov eax, [rouletteWheel + ebx * 4] mov casinoRouletteResult, eax invoke RandomRange, 18 add eax, 72 mov casinoRouletteSpinSteps, eax mov casinoRouletteSpinCounter, eax xor edx, edx mov ebx, 37 div ebx mov eax, casinoRouletteResultIndex add eax, 37 sub eax, edx cmp eax, 37 jb casino_roulette_start_ready sub eax, 37 casino_roulette_start_ready: mov casinoRouletteSpinIndex, eax casino_roulette_spin_loop: inc casinoRouletteSpinIndex cmp casinoRouletteSpinIndex, 37 jb casino_roulette_spin_index_ok mov casinoRouletteSpinIndex, 0 casino_roulette_spin_index_ok: call ShowCasinoRouletteFrame mov eax, casinoRouletteSpinCounter cmp eax, 12 jbe casino_roulette_sleep_slow cmp eax, 26 jbe casino_roulette_sleep_mid invoke Sleep, 45 jmp casino_roulette_after_sleep casino_roulette_sleep_mid: invoke Sleep, 95 jmp casino_roulette_after_sleep casino_roulette_sleep_slow: invoke Sleep, 170 casino_roulette_after_sleep: dec casinoRouletteSpinCounter cmp casinoRouletteSpinCounter, 0 jne casino_roulette_spin_loop mov ebx, casinoRouletteSpinIndex mov casinoRouletteResultIndex, ebx mov eax, [rouletteWheel + ebx * 4] mov casinoRouletteResult, eax ret AnimateCasinoRouletteSpin ENDP ; --- CasinoRouletteEvaluate: русская рулетка или казино-рулетка --- CasinoRouletteEvaluate PROC uses eax ebx edx invoke PrintStr, OFFSET casinoRouletteResultText invoke PrintRouletteNumberColored, casinoRouletteResult invoke PrintStr, OFFSET rouletteNumSpace invoke PrintRouletteColorName, casinoRouletteResult mov eax, casinoRouletteBetType cmp eax, 1 je casino_roulette_eval_number cmp eax, 2 je casino_roulette_eval_red cmp eax, 3 je casino_roulette_eval_black cmp eax, 4 je casino_roulette_eval_even cmp eax, 5 je casino_roulette_eval_odd cmp eax, 6 je casino_roulette_eval_dozen1 cmp eax, 7 je casino_roulette_eval_dozen2 cmp eax, 8 je casino_roulette_eval_dozen3 cmp eax, 9 je casino_roulette_eval_low cmp eax, 10 je casino_roulette_eval_high cmp eax, 11 je casino_roulette_eval_col1 cmp eax, 12 je casino_roulette_eval_col2 cmp eax, 13 je casino_roulette_eval_col3 jmp casino_roulette_lost casino_roulette_eval_number: mov eax, casinoRouletteResult cmp eax, casinoRouletteBetNumber jne casino_roulette_lost invoke UnlockAchievement, 800h, OFFSET achRouletteWinName invoke PrintStr, OFFSET casinoRouletteWinText invoke PaySlotMultiplier, 35 ret casino_roulette_eval_red: mov eax, casinoRouletteResult movzx ebx, byte ptr [rouletteColors + eax] cmp ebx, 1 je casino_roulette_won_even_money jmp casino_roulette_lost casino_roulette_eval_black: mov eax, casinoRouletteResult movzx ebx, byte ptr [rouletteColors + eax] cmp ebx, 2 je casino_roulette_won_even_money jmp casino_roulette_lost casino_roulette_eval_even: mov eax, casinoRouletteResult cmp eax, 0 je casino_roulette_lost test eax, 1 jz casino_roulette_won_even_money jmp casino_roulette_lost casino_roulette_eval_odd: mov eax, casinoRouletteResult cmp eax, 0 je casino_roulette_lost test eax, 1 jnz casino_roulette_won_even_money jmp casino_roulette_lost casino_roulette_eval_dozen1: mov eax, casinoRouletteResult cmp eax, 1 jb casino_roulette_lost cmp eax, 12 jbe casino_roulette_won_double jmp casino_roulette_lost casino_roulette_eval_dozen2: mov eax, casinoRouletteResult cmp eax, 13 jb casino_roulette_lost cmp eax, 24 jbe casino_roulette_won_double jmp casino_roulette_lost casino_roulette_eval_dozen3: mov eax, casinoRouletteResult cmp eax, 25 jb casino_roulette_lost cmp eax, 36 jbe casino_roulette_won_double jmp casino_roulette_lost casino_roulette_eval_low: mov eax, casinoRouletteResult cmp eax, 1 jb casino_roulette_lost cmp eax, 18 jbe casino_roulette_won_even_money jmp casino_roulette_lost casino_roulette_eval_high: mov eax, casinoRouletteResult cmp eax, 36 jbe casino_roulette_won_even_money jmp casino_roulette_lost casino_roulette_eval_col1: mov eax, casinoRouletteResult cmp eax, 0 je casino_roulette_lost dec eax xor edx, edx mov ebx, 3 div ebx cmp edx, 0 je casino_roulette_won_double jmp casino_roulette_lost casino_roulette_eval_col2: mov eax, casinoRouletteResult cmp eax, 0 je casino_roulette_lost dec eax xor edx, edx mov ebx, 3 div ebx cmp edx, 1 je casino_roulette_won_double jmp casino_roulette_lost casino_roulette_eval_col3: mov eax, casinoRouletteResult cmp eax, 0 je casino_roulette_lost dec eax xor edx, edx mov ebx, 3 div ebx cmp edx, 2 je casino_roulette_won_double jmp casino_roulette_lost casino_roulette_won_double: invoke UnlockAchievement, 800h, OFFSET achRouletteWinName invoke PrintStr, OFFSET casinoRouletteWinText invoke PaySlotMultiplier, 2 ret casino_roulette_won_even_money: invoke UnlockAchievement, 800h, OFFSET achRouletteWinName invoke PrintStr, OFFSET casinoRouletteWinText call PayWin ret casino_roulette_lost: invoke PrintStr, OFFSET casinoRouletteLoseText call PayLose ret CasinoRouletteEvaluate ENDP ; --- GameCasinoRoulette: русская рулетка или казино-рулетка --- GameCasinoRoulette PROC casino_roulette_start: call ClearView invoke PrintTitleColor, OFFSET casinoRouletteTitle invoke PrintStr, OFFSET casinoRouletteIntro call PromptBet casino_roulette_choose: call ClearView invoke PrintTitleColor, OFFSET casinoRouletteTitle invoke PrintStr, OFFSET casinoRouletteIntro call PrintBank invoke PrintStr, OFFSET casinoRouletteBetMenu call ReadUInt cmp eax, 1 je casino_roulette_choose_number cmp eax, 2 je casino_roulette_choose_red cmp eax, 3 je casino_roulette_choose_black cmp eax, 4 je casino_roulette_choose_even cmp eax, 5 je casino_roulette_choose_odd cmp eax, 6 je casino_roulette_choose_dozen1 cmp eax, 7 je casino_roulette_choose_dozen2 cmp eax, 8 je casino_roulette_choose_dozen3 cmp eax, 9 je casino_roulette_choose_low cmp eax, 10 je casino_roulette_choose_high cmp eax, 11 je casino_roulette_choose_col1 cmp eax, 12 je casino_roulette_choose_col2 cmp eax, 13 je casino_roulette_choose_col3 invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp casino_roulette_choose casino_roulette_choose_number: mov casinoRouletteBetType, 1 invoke PrintStr, OFFSET casinoRouletteNumberAsk call ReadUInt cmp eax, 36 ja casino_roulette_bad_number mov casinoRouletteBetNumber, eax jmp casino_roulette_spin casino_roulette_bad_number: invoke PrintStr, OFFSET casinoRouletteBadNumber call PauseConsole jmp casino_roulette_choose casino_roulette_choose_red: mov casinoRouletteBetType, 2 jmp casino_roulette_spin casino_roulette_choose_black: mov casinoRouletteBetType, 3 jmp casino_roulette_spin casino_roulette_choose_even: mov casinoRouletteBetType, 4 jmp casino_roulette_spin casino_roulette_choose_odd: mov casinoRouletteBetType, 5 jmp casino_roulette_spin casino_roulette_choose_dozen1: mov casinoRouletteBetType, 6 jmp casino_roulette_spin casino_roulette_choose_dozen2: mov casinoRouletteBetType, 7 jmp casino_roulette_spin casino_roulette_choose_dozen3: mov casinoRouletteBetType, 8 jmp casino_roulette_spin casino_roulette_choose_low: mov casinoRouletteBetType, 9 jmp casino_roulette_spin casino_roulette_choose_high: mov casinoRouletteBetType, 10 jmp casino_roulette_spin casino_roulette_choose_col1: mov casinoRouletteBetType, 11 jmp casino_roulette_spin casino_roulette_choose_col2: mov casinoRouletteBetType, 12 jmp casino_roulette_spin casino_roulette_choose_col3: mov casinoRouletteBetType, 13 casino_roulette_spin: call PlayCasinoRouletteSound call AnimateCasinoRouletteSpin call CasinoRouletteEvaluate casino_roulette_again: cmp tournamentMode, 1 je casino_roulette_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je casino_roulette_start cmp al, 'Y' je casino_roulette_start casino_roulette_tournament_return: ret GameCasinoRoulette ENDP ; --- SlotApplyWin: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotApplyWin PROC uses ebx ecx edx, pName:DWORD, multiplier:DWORD, maskValue:DWORD mov eax, pName cmp eax, OFFSET slotComboJackpot je slot_apply_jackpot mov eax, maskValue mov ebx, slotBlockMask mov ecx, eax and ecx, ebx cmp ecx, eax je slot_apply_skip or slotBlockMask, eax jmp slot_apply_record slot_apply_jackpot: mov slotJackpotHit, 1 mov eax, maskValue slot_apply_record: or slotWinMask, eax mov ebx, slotMatch mov eax, slotSymbolValues[ebx * 4] mov ebx, multiplier mul ebx mov edx, eax add slotBestMultiplier, edx mov ebx, slotComboCount cmp ebx, 32 jae slot_apply_no_store mov eax, pName mov slotComboNames[ebx * 4], eax mov slotComboMults[ebx * 4], edx inc slotComboCount slot_apply_no_store: mov eax, 1 ret slot_apply_skip: xor eax, eax ret SlotApplyWin ENDP ; --- SlotSame3: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotSame3 PROC uses ebx ecx edx, i1:DWORD, i2:DWORD, i3:DWORD mov ebx, i1 mov eax, slotGrid[ebx * 4] mov ecx, i2 cmp eax, slotGrid[ecx * 4] jne slot_same3_no mov edx, i3 cmp eax, slotGrid[edx * 4] jne slot_same3_no mov eax, 1 ret slot_same3_no: xor eax, eax ret SlotSame3 ENDP ; --- SlotSame4: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotSame4 PROC uses ebx ecx edx, i1:DWORD, i2:DWORD, i3:DWORD, i4:DWORD mov ebx, i1 mov eax, slotGrid[ebx * 4] mov ecx, i2 cmp eax, slotGrid[ecx * 4] jne slot_same4_no mov edx, i3 cmp eax, slotGrid[edx * 4] jne slot_same4_no mov ebx, i4 cmp eax, slotGrid[ebx * 4] jne slot_same4_no mov eax, 1 ret slot_same4_no: xor eax, eax ret SlotSame4 ENDP ; --- SlotSame5: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotSame5 PROC uses ebx ecx edx, i1:DWORD, i2:DWORD, i3:DWORD, i4:DWORD, i5:DWORD mov ebx, i1 mov eax, slotGrid[ebx * 4] mov ecx, i2 cmp eax, slotGrid[ecx * 4] jne slot_same5_no mov edx, i3 cmp eax, slotGrid[edx * 4] jne slot_same5_no mov ebx, i4 cmp eax, slotGrid[ebx * 4] jne slot_same5_no mov ecx, i5 cmp eax, slotGrid[ecx * 4] jne slot_same5_no mov eax, 1 ret slot_same5_no: xor eax, eax ret SlotSame5 ENDP ; --- SlotAllSame15: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotAllSame15 PROC uses ebx ecx mov eax, slotGrid mov ebx, 1 slot_all15_loop: cmp ebx, 15 jae slot_all15_yes mov ecx, slotGrid[ebx * 4] cmp eax, ecx jne slot_all15_no inc ebx jmp slot_all15_loop slot_all15_yes: mov eax, 1 ret slot_all15_no: xor eax, eax ret SlotAllSame15 ENDP ; --- SlotTry3: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotTry3 PROC uses ebx, pName:DWORD, multiplier:DWORD, maskValue:DWORD, i1:DWORD, i2:DWORD, i3:DWORD invoke SlotSame3, i1, i2, i3 cmp eax, 0 je slot_try3_no mov ebx, i1 mov eax, slotGrid[ebx * 4] mov slotMatch, eax invoke SlotApplyWin, pName, multiplier, maskValue ret slot_try3_no: xor eax, eax ret SlotTry3 ENDP ; --- SlotTry4: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotTry4 PROC uses ebx, pName:DWORD, multiplier:DWORD, maskValue:DWORD, i1:DWORD, i2:DWORD, i3:DWORD, i4:DWORD invoke SlotSame4, i1, i2, i3, i4 cmp eax, 0 je slot_try4_no mov ebx, i1 mov eax, slotGrid[ebx * 4] mov slotMatch, eax invoke SlotApplyWin, pName, multiplier, maskValue ret slot_try4_no: xor eax, eax ret SlotTry4 ENDP ; --- SlotTry5: слот-машины, барабаны, символы, выплаты и джекпоты --- SlotTry5 PROC uses ebx, pName:DWORD, multiplier:DWORD, maskValue:DWORD, i1:DWORD, i2:DWORD, i3:DWORD, i4:DWORD, i5:DWORD invoke SlotSame5, i1, i2, i3, i4, i5 cmp eax, 0 je slot_try5_no mov ebx, i1 mov eax, slotGrid[ebx * 4] mov slotMatch, eax invoke SlotApplyWin, pName, multiplier, maskValue ret slot_try5_no: xor eax, eax ret SlotTry5 ENDP ; --- EvaluateSlotCombos: слот-машины, барабаны, символы, выплаты и джекпоты --- EvaluateSlotCombos PROC mov slotWinMask, 0 mov slotBlockMask, 0 mov slotBestMultiplier, 0 mov slotComboNamePtr, 0 mov slotComboCount, 0 mov slotJackpotHit, 0 call SlotAllSame15 cmp eax, 0 je slot_eval_eye mov eax, slotGrid mov slotMatch, eax invoke SlotApplyWin, OFFSET slotComboJackpot, 10, 32767 slot_eval_eye: invoke SlotTry5, OFFSET slotComboEye, 8, 17553, 0, 4, 7, 10, 14 invoke SlotTry5, OFFSET slotComboSky, 7, 31, 0, 1, 2, 3, 4 invoke SlotTry5, OFFSET slotComboEarth, 7, 31744, 10, 11, 12, 13, 14 invoke SlotTry5, OFFSET slotComboUp, 4, 17732, 10, 6, 2, 8, 14 invoke SlotTry5, OFFSET slotComboDown, 4, 4433, 0, 6, 12, 8, 4 invoke SlotTry5, OFFSET slotComboHorXL, 3, 31, 0, 1, 2, 3, 4 invoke SlotTry5, OFFSET slotComboHorXL, 3, 992, 5, 6, 7, 8, 9 invoke SlotTry5, OFFSET slotComboHorXL, 3, 31744, 10, 11, 12, 13, 14 invoke SlotTry4, OFFSET slotComboHorL, 2, 15, 0, 1, 2, 3 invoke SlotTry4, OFFSET slotComboHorL, 2, 30, 1, 2, 3, 4 invoke SlotTry4, OFFSET slotComboHorL, 2, 480, 5, 6, 7, 8 invoke SlotTry4, OFFSET slotComboHorL, 2, 960, 6, 7, 8, 9 invoke SlotTry4, OFFSET slotComboHorL, 2, 15360, 10, 11, 12, 13 invoke SlotTry4, OFFSET slotComboHorL, 2, 30720, 11, 12, 13, 14 invoke SlotTry3, OFFSET slotComboVertM, 1, 1057, 0, 5, 10 invoke SlotTry3, OFFSET slotComboVertM, 1, 2114, 1, 6, 11 invoke SlotTry3, OFFSET slotComboVertM, 1, 4228, 2, 7, 12 invoke SlotTry3, OFFSET slotComboVertM, 1, 8456, 3, 8, 13 invoke SlotTry3, OFFSET slotComboVertM, 1, 16912, 4, 9, 14 invoke SlotTry3, OFFSET slotComboDiagM, 1, 4161, 0, 6, 12 invoke SlotTry3, OFFSET slotComboDiagM, 1, 8322, 1, 7, 13 invoke SlotTry3, OFFSET slotComboDiagM, 1, 16644, 2, 8, 14 invoke SlotTry3, OFFSET slotComboDiagM, 1, 1092, 10, 6, 2 invoke SlotTry3, OFFSET slotComboDiagM, 1, 2184, 11, 7, 3 invoke SlotTry3, OFFSET slotComboDiagM, 1, 4368, 12, 8, 4 invoke SlotTry3, OFFSET slotComboHorM, 1, 7, 0, 1, 2 invoke SlotTry3, OFFSET slotComboHorM, 1, 14, 1, 2, 3 invoke SlotTry3, OFFSET slotComboHorM, 1, 28, 2, 3, 4 invoke SlotTry3, OFFSET slotComboHorM, 1, 224, 5, 6, 7 invoke SlotTry3, OFFSET slotComboHorM, 1, 448, 6, 7, 8 invoke SlotTry3, OFFSET slotComboHorM, 1, 896, 7, 8, 9 invoke SlotTry3, OFFSET slotComboHorM, 1, 7168, 10, 11, 12 invoke SlotTry3, OFFSET slotComboHorM, 1, 14336, 11, 12, 13 invoke SlotTry3, OFFSET slotComboHorM, 1, 28672, 12, 13, 14 ret EvaluateSlotCombos ENDP ; --- AwardSlotWin: слот-машины, барабаны, символы, выплаты и джекпоты --- AwardSlotWin PROC uses ebx invoke UnlockAchievement, 80h, OFFSET achCloverPitName call PrintSlotWindow invoke PrintStr, OFFSET slotPair mov slotCurrentCell, 0 slot_award_combo_loop: mov eax, slotCurrentCell cmp eax, slotComboCount jae slot_award_combo_done invoke PrintStr, OFFSET slotComboText mov ebx, slotCurrentCell mov eax, slotComboNames[ebx * 4] invoke PrintStr, eax invoke PrintStr, OFFSET cardGap invoke PrintStr, OFFSET slotMultiplierText mov ebx, slotCurrentCell mov eax, slotComboMults[ebx * 4] invoke PrintUInt, eax invoke PrintStr, OFFSET nl inc slotCurrentCell jmp slot_award_combo_loop slot_award_combo_done: invoke PrintStr, OFFSET slotTotalMultiplierText invoke PrintUInt, slotBestMultiplier invoke PrintStr, OFFSET nl cmp slotJackpotHit, 1 jne slot_award_regular call PlayJackpotSound invoke Sleep, 650 call PlayHakariSound call PlayHakariDance call PrintSlotWindow slot_award_regular: invoke PaySlotMultiplier, slotBestMultiplier ret AwardSlotWin ENDP ; --- GameSlot: слот-машины, барабаны, символы, выплаты и джекпоты --- GameSlot PROC slot_start: call ClearView invoke PrintTitleColor, OFFSET slotTitle invoke PrintStr, OFFSET slotPayTableText call PromptBet call PlaySlotSound invoke Sleep, 400 invoke PrintStr, OFFSET slotPullText mov slotWinMask, 0 mov slotVisible, 0 call PrintSlotWindow invoke Sleep, 1400 invoke FillSlotColumn, 0 mov slotVisible, 1 call PrintSlotWindow invoke Sleep, 620 invoke FillSlotColumn, 1 mov slotVisible, 2 call PrintSlotWindow invoke Sleep, 620 invoke FillSlotColumn, 2 mov slotVisible, 3 call PrintSlotWindow invoke Sleep, 620 invoke FillSlotColumn, 3 mov slotVisible, 4 call PrintSlotWindow invoke Sleep, 620 invoke FillSlotColumn, 4 mov slotVisible, 5 call PrintSlotWindow invoke Sleep, 450 cmp cheatSlotJackpot, 1 jne slot_no_forced_jackpot mov cheatSlotJackpot, 0 mov ecx, 15 mov edi, OFFSET slotGrid slot_force_jackpot_loop: mov dword ptr [edi], 6 add edi, 4 loop slot_force_jackpot_loop call PrintSlotWindow invoke Sleep, 300 slot_no_forced_jackpot: call EvaluateSlotCombos cmp slotBestMultiplier, 0 jne slot_has_win invoke PrintStr, OFFSET slotEmpty call PayLose jmp ask_slot_again slot_has_win: call AwardSlotWin ask_slot_again: invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je slot_start cmp al, 'Y' je slot_start ret GameSlot ENDP ; --- PrintClassicSlotSymbol: вывод текста, цветов, картинок и элементов интерфейса --- PrintClassicSlotSymbol PROC uses eax, value:DWORD mov eax, value cmp eax, 0 je classic_symbol_red cmp eax, 1 je classic_symbol_yellow cmp eax, 2 je classic_symbol_green cmp eax, 5 je classic_symbol_cyan invoke SetColor, COLOR_WARN jmp classic_symbol_print classic_symbol_red: invoke SetColor, COLOR_BAD jmp classic_symbol_print classic_symbol_yellow: invoke SetColor, COLOR_WARN jmp classic_symbol_print classic_symbol_green: invoke SetColor, COLOR_MONEY jmp classic_symbol_print classic_symbol_cyan: invoke SetColor, COLOR_TITLE classic_symbol_print: mov eax, value invoke PrintStr, classicSlotSymbols[eax * 4] call ResetColor ret PrintClassicSlotSymbol ENDP ; --- PrintClassicSlotCell: вывод текста, цветов, картинок и элементов интерфейса --- PrintClassicSlotCell PROC uses eax, value:DWORD mov eax, value cmp eax, 1 je classic_slot_cell_bar invoke PrintStr, OFFSET slotWall invoke PrintStr, OFFSET slotPadTwo invoke PrintClassicSlotSymbol, value invoke PrintStr, OFFSET slotPadTwo ret classic_slot_cell_bar: invoke PrintStr, OFFSET slotWall invoke PrintStr, OFFSET slotPadOne invoke PrintClassicSlotSymbol, value invoke PrintStr, OFFSET slotPadOne ret PrintClassicSlotCell ENDP ; --- PrintClassicSlotBlankCell: вывод текста, цветов, картинок и элементов интерфейса --- PrintClassicSlotBlankCell PROC invoke PrintStr, OFFSET slotWall invoke PrintStr, OFFSET slotCellBlank ret PrintClassicSlotBlankCell ENDP ; --- PrintClassicSlotWindow: вывод текста, цветов, картинок и элементов интерфейса --- PrintClassicSlotWindow PROC uses eax ebx call ClearView invoke PrintTitleColor, OFFSET classicSlotTitle invoke PrintStr, OFFSET classicSlotBorder mov rowIndex, 0 classic_slot_window_row_loop: cmp rowIndex, 3 jae classic_slot_window_done mov ebx, rowIndex imul ebx, 3 cmp slotVisible, 1 jb classic_slot_blank_col1 invoke PrintClassicSlotCell, slotGrid[ebx * 4] jmp classic_slot_col2 classic_slot_blank_col1: call PrintClassicSlotBlankCell classic_slot_col2: cmp slotVisible, 2 jb classic_slot_blank_col2 mov eax, ebx inc eax invoke PrintClassicSlotCell, slotGrid[eax * 4] jmp classic_slot_col3 classic_slot_blank_col2: call PrintClassicSlotBlankCell classic_slot_col3: cmp slotVisible, 3 jb classic_slot_blank_col3 mov eax, ebx add eax, 2 invoke PrintClassicSlotCell, slotGrid[eax * 4] jmp classic_slot_row_end classic_slot_blank_col3: call PrintClassicSlotBlankCell classic_slot_row_end: invoke PrintStr, OFFSET slotWall invoke PrintStr, OFFSET nl cmp rowIndex, 1 jne classic_no_payline invoke PrintStr, OFFSET classicSlotPayline classic_no_payline: invoke PrintStr, OFFSET classicSlotBorder inc rowIndex jmp classic_slot_window_row_loop classic_slot_window_done: ret PrintClassicSlotWindow ENDP ; --- FillClassicSlotColumn: слот-машины, барабаны, символы, выплаты и джекпоты --- FillClassicSlotColumn PROC uses eax ebx, column:DWORD mov ebx, column invoke RandomRange, 6 mov slotGrid[ebx * 4], eax mov ebx, column add ebx, 3 invoke RandomRange, 6 mov slotGrid[ebx * 4], eax mov ebx, column add ebx, 7 invoke RandomRange, 6 mov slotGrid[ebx * 4], eax ret FillClassicSlotColumn ENDP ; --- DurakCardRank: карты, руки, очки и базовая карточная логика --- DurakCardRank PROC uses ecx edx, card:DWORD mov eax, card xor edx, edx mov ecx, 13 div ecx mov eax, edx ret DurakCardRank ENDP ; --- DurakCardSuit: карты, руки, очки и базовая карточная логика --- DurakCardSuit PROC uses ecx edx, card:DWORD mov eax, card xor edx, edx mov ecx, 13 div ecx ret DurakCardSuit ENDP ; --- DrawDurakCard: карты, руки, очки и базовая карточная логика --- DrawDurakCard PROC uses ebx ecx edx edi cmp durakDeckLeft, 0 ja draw_durak_random_start mov eax, 0FFFFFFFFh ret ; Сначала пробуем случайно, но не бесконечно: в конце партии иначе можно долго ждать одну карту. draw_durak_random_start: mov rowIndex, 120 draw_durak_try: invoke RandomRange, 52 mov ebx, eax xor edx, edx mov ecx, 13 div ecx cmp edx, 4 jb draw_durak_next_try mov edi, OFFSET deckUsed add edi, ebx cmp byte ptr [edi], 0 je draw_durak_take draw_durak_next_try: dec rowIndex cmp rowIndex, 0 jne draw_durak_try xor ebx, ebx draw_durak_scan_loop: cmp ebx, 52 jae draw_durak_none_left mov eax, ebx xor edx, edx mov ecx, 13 div ecx cmp edx, 4 jb draw_durak_scan_next mov edi, OFFSET deckUsed add edi, ebx cmp byte ptr [edi], 0 je draw_durak_take draw_durak_scan_next: inc ebx jmp draw_durak_scan_loop draw_durak_take: mov edi, OFFSET deckUsed add edi, ebx mov byte ptr [edi], 1 cmp durakDeckLeft, 0 jbe draw_durak_return_card dec durakDeckLeft draw_durak_return_card: mov eax, ebx ret draw_durak_none_left: mov durakDeckLeft, 0 mov eax, 0FFFFFFFFh ret DrawDurakCard ENDP ; --- PrintDurakCardName: вывод текста, цветов, картинок и элементов интерфейса --- PrintDurakCardName PROC uses eax ebx ecx edx, card:DWORD mov eax, card cmp eax, 0FFFFFFFFh jne print_durak_card_real invoke PrintStr, OFFSET durakUnbeatenText ret print_durak_card_real: xor edx, edx mov ecx, 13 div ecx mov ebx, eax mov eax, edx invoke PrintStr, ranks[eax * 4] invoke PrintSuit, ebx ret PrintDurakCardName ENDP ; --- AddDurakCard: карты, руки, очки и базовая карточная логика --- AddDurakCard PROC uses ebx ecx, pHand:DWORD, pCount:DWORD, card:DWORD mov ecx, pCount mov ebx, [ecx] cmp ebx, 40 jae add_durak_done mov eax, pHand mov ecx, card mov [eax + ebx * 4], ecx mov ecx, pCount inc dword ptr [ecx] add_durak_done: ret AddDurakCard ENDP ; --- RemoveDurakCard: карты, руки, очки и базовая карточная логика --- RemoveDurakCard PROC uses ebx ecx edx esi edi, pHand:DWORD, pCount:DWORD, index:DWORD mov esi, pHand mov edi, pCount mov ecx, [edi] mov ebx, index cmp ebx, ecx jae remove_durak_bad mov eax, [esi + ebx * 4] dec ecx mov [edi], ecx remove_durak_shift: cmp ebx, ecx jae remove_durak_done mov edx, [esi + ebx * 4 + 4] mov [esi + ebx * 4], edx inc ebx jmp remove_durak_shift remove_durak_done: ret remove_durak_bad: mov eax, 0FFFFFFFFh ret RemoveDurakCard ENDP ; --- CanDurakBeat: дурак: козырь, атака, защита, подкидывание и добор --- CanDurakBeat PROC uses ebx ecx edx esi edi, attackCard:DWORD, defenseCard:DWORD invoke DurakCardSuit, attackCard mov esi, eax invoke DurakCardRank, attackCard mov edi, eax invoke DurakCardSuit, defenseCard mov ebx, eax invoke DurakCardRank, defenseCard mov ecx, eax cmp ebx, esi jne can_durak_check_trump cmp ecx, edi ja can_durak_yes jmp can_durak_no can_durak_check_trump: cmp ebx, durakTrumpSuit jne can_durak_no cmp esi, durakTrumpSuit je can_durak_no can_durak_yes: mov eax, 1 ret can_durak_no: xor eax, eax ret CanDurakBeat ENDP ; --- ClearDurakTable: дурак: козырь, атака, защита, подкидывание и добор --- ClearDurakTable PROC uses ecx edi mov durakTableCnt, 0 mov ecx, 6 mov edi, OFFSET durakAttackCards clear_durak_attack_loop: mov dword ptr [edi], 0FFFFFFFFh add edi, 4 loop clear_durak_attack_loop mov ecx, 6 mov edi, OFFSET durakDefenseCards clear_durak_def_loop: mov dword ptr [edi], 0FFFFFFFFh add edi, 4 loop clear_durak_def_loop ret ClearDurakTable ENDP ; --- AddDurakAttack: дурак: козырь, атака, защита, подкидывание и добор --- AddDurakAttack PROC uses ebx mov ebx, durakTableCnt cmp ebx, 6 jae add_attack_done mov durakAttackCards[ebx * 4], eax mov durakDefenseCards[ebx * 4], 0FFFFFFFFh inc durakTableCnt add_attack_done: ret AddDurakAttack ENDP ; --- DurakTableHasDefense: дурак: козырь, атака, защита, подкидывание и добор --- DurakTableHasDefense PROC uses ebx mov rowIndex, 0 has_def_loop: mov eax, rowIndex cmp eax, durakTableCnt jae has_def_no mov ebx, eax cmp durakDefenseCards[ebx * 4], 0FFFFFFFFh jne has_def_yes inc rowIndex jmp has_def_loop has_def_yes: mov eax, 1 ret has_def_no: xor eax, eax ret DurakTableHasDefense ENDP ; --- DurakFirstUnbeaten: дурак: козырь, атака, защита, подкидывание и добор --- DurakFirstUnbeaten PROC uses ebx mov rowIndex, 0 first_unbeaten_loop: mov eax, rowIndex cmp eax, durakTableCnt jae first_unbeaten_none mov ebx, eax cmp durakDefenseCards[ebx * 4], 0FFFFFFFFh je first_unbeaten_found inc rowIndex jmp first_unbeaten_loop first_unbeaten_found: mov eax, rowIndex ret first_unbeaten_none: mov eax, 0FFFFFFFFh ret DurakFirstUnbeaten ENDP ; --- DurakAllDefended: дурак: козырь, атака, защита, подкидывание и добор --- DurakAllDefended PROC call DurakFirstUnbeaten cmp eax, 0FFFFFFFFh jne all_def_no mov eax, 1 ret all_def_no: xor eax, eax ret DurakAllDefended ENDP ; --- DurakRankOnTable: дурак: козырь, атака, защита, подкидывание и добор --- DurakRankOnTable PROC uses ebx ecx edx, card:DWORD invoke DurakCardRank, card mov ecx, eax mov rowIndex, 0 rank_on_table_loop: mov eax, rowIndex cmp eax, durakTableCnt jae rank_on_table_no mov ebx, eax invoke DurakCardRank, durakAttackCards[ebx * 4] cmp eax, ecx je rank_on_table_yes cmp durakDefenseCards[ebx * 4], 0FFFFFFFFh je rank_on_table_next invoke DurakCardRank, durakDefenseCards[ebx * 4] cmp eax, ecx je rank_on_table_yes rank_on_table_next: inc rowIndex jmp rank_on_table_loop rank_on_table_yes: mov eax, 1 ret rank_on_table_no: xor eax, eax ret DurakRankOnTable ENDP ; --- CollectDurakTable: аккаунты, файлы сохранений и загрузка профиля --- CollectDurakTable PROC uses ebx, pHand:DWORD, pCount:DWORD mov rowIndex, 0 collect_table_loop: mov eax, rowIndex cmp eax, durakTableCnt jae collect_table_done mov ebx, eax invoke AddDurakCard, pHand, pCount, durakAttackCards[ebx * 4] cmp durakDefenseCards[ebx * 4], 0FFFFFFFFh je collect_next invoke AddDurakCard, pHand, pCount, durakDefenseCards[ebx * 4] collect_next: inc rowIndex jmp collect_table_loop collect_table_done: call ClearDurakTable ret CollectDurakTable ENDP ; --- DrawDurakPlayer: дурак: козырь, атака, защита, подкидывание и добор --- DrawDurakPlayer PROC call PlayCardSound call DrawDurakCard cmp eax, 0FFFFFFFFh je draw_durak_player_done invoke AddDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, eax draw_durak_player_done: ret DrawDurakPlayer ENDP ; --- DrawDurakAI: дурак: козырь, атака, защита, подкидывание и добор --- DrawDurakAI PROC call PlayCardSound call DrawDurakCard cmp eax, 0FFFFFFFFh je draw_durak_ai_done invoke AddDurakCard, OFFSET durakAIHand, OFFSET durakAICnt, eax draw_durak_ai_done: ret DrawDurakAI ENDP ; --- RefillDurakHands: карты, руки, очки и базовая карточная логика --- RefillDurakHands PROC refill_player_loop: cmp durakPlayerCnt, 6 jae refill_ai_loop cmp durakDeckLeft, 0 jbe refill_ai_loop call DrawDurakPlayer jmp refill_player_loop refill_ai_loop: cmp durakAICnt, 6 jae refill_done cmp durakDeckLeft, 0 jbe refill_done call DrawDurakAI jmp refill_ai_loop refill_done: ret RefillDurakHands ENDP ; --- RefillDurakHandsAIFirst: карты, руки, очки и базовая карточная логика --- RefillDurakHandsAIFirst PROC refill_ai_first_loop: cmp durakAICnt, 6 jae refill_player_after_ai_loop cmp durakDeckLeft, 0 jbe refill_player_after_ai_loop call DrawDurakAI jmp refill_ai_first_loop refill_player_after_ai_loop: cmp durakPlayerCnt, 6 jae refill_ai_first_done cmp durakDeckLeft, 0 jbe refill_ai_first_done call DrawDurakPlayer jmp refill_player_after_ai_loop refill_ai_first_done: ret RefillDurakHandsAIFirst ENDP ; --- PrintDurakHand: вывод текста, цветов, картинок и элементов интерфейса --- PrintDurakHand PROC uses eax ebx, pHand:DWORD, count:DWORD mov rowIndex, 0 print_durak_hand_loop: mov eax, rowIndex cmp eax, count jae print_durak_hand_done inc eax invoke PrintUInt, eax invoke PrintStr, OFFSET dotSpaceText mov ebx, pHand mov eax, rowIndex invoke PrintDurakCardName, dword ptr [ebx + eax * 4] invoke PrintStr, OFFSET cardGap inc rowIndex jmp print_durak_hand_loop print_durak_hand_done: invoke PrintStr, OFFSET nl ret PrintDurakHand ENDP ; --- PrintDurakTable: вывод текста, цветов, картинок и элементов интерфейса --- PrintDurakTable PROC uses ebx cmp durakTableCnt, 0 je print_table_done invoke PrintStr, OFFSET durakTablePairsText invoke PrintHandRow21, OFFSET durakAttackCards, durakTableCnt, 1 mov rowIndex, 0 print_table_pairs_loop: mov eax, rowIndex cmp eax, durakTableCnt jae print_table_done inc eax invoke PrintUInt, eax invoke PrintStr, OFFSET dotSpaceText mov ebx, rowIndex invoke PrintDurakCardName, durakAttackCards[ebx * 4] invoke PrintStr, OFFSET durakSlashText invoke PrintDurakCardName, durakDefenseCards[ebx * 4] invoke PrintStr, OFFSET nl inc rowIndex jmp print_table_pairs_loop print_table_done: ret PrintDurakTable ENDP ; --- ShowDurakTable: дурак: козырь, атака, защита, подкидывание и добор --- ShowDurakTable PROC call ClearView invoke PrintTitleColor, OFFSET durakTitle invoke PrintStr, OFFSET durakDeckVisualText invoke PrintDurakCardName, durakTrumpCard invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET durakDeckText invoke PrintUInt, durakDeckLeft invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET durakAICardsText invoke PrintUInt, durakAICnt invoke PrintStr, OFFSET nl cmp durakAICnt, 10 ja show_ai_no_graphics invoke PrintStr, OFFSET durakAIFaceText invoke PrintHandRow21, OFFSET durakAIHand, durakAICnt, 0 show_ai_no_graphics: call PrintDurakTable invoke PrintStr, OFFSET durakYourHandText cmp durakPlayerCnt, 10 ja show_player_list_only invoke PrintHandRow21, OFFSET durakPlayerHand, durakPlayerCnt, 1 show_player_list_only: invoke PrintDurakHand, OFFSET durakPlayerHand, durakPlayerCnt ret ShowDurakTable ENDP ; --- FindAIDurakDefense: аккаунты, файлы сохранений и загрузка профиля --- FindAIDurakDefense PROC uses ebx ecx, tableIndex:DWORD mov rowIndex, 0 find_ai_defense_loop: mov eax, rowIndex cmp eax, durakAICnt jae find_ai_defense_no mov ebx, OFFSET durakAIHand mov ecx, [ebx + eax * 4] mov ebx, tableIndex invoke CanDurakBeat, durakAttackCards[ebx * 4], ecx cmp eax, 1 je find_ai_defense_yes inc rowIndex jmp find_ai_defense_loop find_ai_defense_yes: mov eax, rowIndex ret find_ai_defense_no: mov eax, 0FFFFFFFFh ret FindAIDurakDefense ENDP ; --- AIDefendAll: дурак: козырь, атака, защита, подкидывание и добор --- AIDefendAll PROC uses ebx mov durakLoopGuard, 0 ai_defend_loop: inc durakLoopGuard cmp durakLoopGuard, 20 ja ai_defend_fail call DurakFirstUnbeaten cmp eax, 0FFFFFFFFh je ai_defend_success mov ebx, eax invoke FindAIDurakDefense, ebx cmp eax, 0FFFFFFFFh je ai_defend_fail invoke RemoveDurakCard, OFFSET durakAIHand, OFFSET durakAICnt, eax mov durakDefenseCards[ebx * 4], eax jmp ai_defend_loop ai_defend_success: mov eax, 1 ret ai_defend_fail: xor eax, eax ret AIDefendAll ENDP ; --- FindAIThrowIn: аккаунты, файлы сохранений и загрузка профиля --- FindAIThrowIn PROC uses ebx ecx cmp durakTableCnt, 6 jae ai_throw_none mov eax, durakTableCnt cmp eax, durakPlayerCnt jae ai_throw_none mov rowIndex, 0 ai_throw_loop: mov eax, rowIndex cmp eax, durakAICnt jae ai_throw_none mov ebx, OFFSET durakAIHand mov ecx, [ebx + eax * 4] invoke DurakRankOnTable, ecx cmp eax, 1 je ai_throw_found inc rowIndex jmp ai_throw_loop ai_throw_found: mov eax, rowIndex ret ai_throw_none: mov eax, 0FFFFFFFFh ret FindAIThrowIn ENDP ; --- CheckDurakEnd: дурак: козырь, атака, защита, подкидывание и добор --- CheckDurakEnd PROC cmp durakDeckLeft, 0 ja durak_not_finished cmp durakPlayerCnt, 0 jne check_ai_empty cmp durakAICnt, 0 jne durak_player_won mov eax, 3 ret check_ai_empty: cmp durakAICnt, 0 jne durak_not_finished mov eax, 2 ret durak_player_won: mov eax, 1 ret durak_not_finished: xor eax, eax ret CheckDurakEnd ENDP ; --- SetupDurak: дурак: козырь, атака, защита, подкидывание и добор --- SetupDurak PROC uses ecx call ResetDeck mov durakPlayerCnt, 0 mov durakAICnt, 0 mov durakDeckLeft, 36 mov durakPlayerTurn, 1 mov durakSafeTurns, 0 call ClearDurakTable call DrawDurakCard mov durakTrumpCard, eax invoke DurakCardSuit, eax mov durakTrumpSuit, eax mov ecx, 6 setup_durak_deal: call DrawDurakPlayer call DrawDurakAI loop setup_durak_deal ret SetupDurak ENDP ; --- PlayerOpenAttackLoop: звук, интро или покадровая анимация --- PlayerOpenAttackLoop PROC uses ebx ecx player_open_attack_loop: mov eax, durakTableCnt cmp eax, 6 jae player_open_attack_done cmp eax, durakAICnt jae player_open_attack_done call ShowDurakTable invoke PrintStr, OFFSET durakThrowAsk call ReadUInt cmp eax, 0 je player_open_attack_done cmp eax, 1 jb player_open_attack_bad cmp eax, durakPlayerCnt ja player_open_attack_bad dec eax mov durakChoice, eax mov ebx, OFFSET durakPlayerHand mov ecx, [ebx + eax * 4] invoke DurakRankOnTable, ecx cmp eax, 1 jne player_open_attack_bad invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, durakChoice call AddDurakAttack jmp player_open_attack_loop player_open_attack_bad: invoke PrintStr, OFFSET durakBadMoveText invoke Sleep, 650 jmp player_open_attack_loop player_open_attack_done: ret PlayerOpenAttackLoop ENDP ; --- AIInitialThrowLoop: дурак: козырь, атака, защита, подкидывание и добор --- AIInitialThrowLoop PROC mov durakLoopGuard, 0 ai_initial_throw_loop: inc durakLoopGuard cmp durakLoopGuard, 20 ja ai_initial_throw_done call FindAIThrowIn cmp eax, 0FFFFFFFFh je ai_initial_throw_done invoke RemoveDurakCard, OFFSET durakAIHand, OFFSET durakAICnt, eax call AddDurakAttack jmp ai_initial_throw_loop ai_initial_throw_done: ret AIInitialThrowLoop ENDP ; --- PlayerThrowLoop: звук, интро или покадровая анимация --- PlayerThrowLoop PROC uses ebx ecx mov durakLoopGuard, 0 player_throw_loop: inc durakLoopGuard cmp durakLoopGuard, 30 ja player_throw_done call ShowDurakTable call AIDefendAll cmp eax, 1 je player_throw_after_defense invoke CollectDurakTable, OFFSET durakAIHand, OFFSET durakAICnt invoke PrintStr, OFFSET durakAITakeText mov durakPlayerTurn, 1 call RefillDurakHands call PauseConsole ret player_throw_after_defense: call ShowDurakTable invoke PrintStr, OFFSET durakThrowAsk call ReadUInt cmp eax, 0 je player_throw_done cmp eax, 1 jb player_throw_bad cmp eax, durakPlayerCnt ja player_throw_bad cmp durakTableCnt, 6 jae player_throw_bad dec eax mov durakChoice, eax mov ebx, OFFSET durakPlayerHand mov ecx, [ebx + eax * 4] invoke DurakRankOnTable, ecx cmp eax, 1 jne player_throw_bad invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, durakChoice call AddDurakAttack jmp player_throw_loop player_throw_bad: invoke PrintStr, OFFSET durakBadMoveText invoke Sleep, 650 jmp player_throw_loop player_throw_done: call ClearDurakTable mov durakPlayerTurn, 0 call RefillDurakHands ret PlayerThrowLoop ENDP ; --- PlayerDefendLoop: звук, интро или покадровая анимация --- PlayerDefendLoop PROC uses ebx ecx mov durakLoopGuard, 0 player_defend_loop: inc durakLoopGuard cmp durakLoopGuard, 30 ja player_take_table call DurakAllDefended cmp eax, 1 je player_defended_all call ShowDurakTable invoke PrintStr, OFFSET durakDefendAsk call ReadUInt cmp eax, 0 je player_take_table cmp eax, 1 jb player_def_bad cmp eax, durakPlayerCnt ja player_def_bad dec eax mov durakChoice, eax mov ebx, OFFSET durakPlayerHand mov ecx, [ebx + eax * 4] call DurakTableHasDefense cmp eax, 0 jne player_try_beat invoke DurakRankOnTable, ecx cmp eax, 1 jne player_try_beat mov eax, durakTableCnt cmp durakAICnt, eax jbe player_try_beat invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, durakChoice call AddDurakAttack invoke PrintStr, OFFSET durakTransferText call PauseConsole call PlayerThrowLoop ret player_try_beat: call DurakFirstUnbeaten mov ebx, eax mov ecx, OFFSET durakPlayerHand mov eax, durakChoice mov ecx, [ecx + eax * 4] invoke CanDurakBeat, durakAttackCards[ebx * 4], ecx cmp eax, 1 jne player_def_bad invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, durakChoice mov durakDefenseCards[ebx * 4], eax jmp player_defend_loop player_def_bad: invoke PrintStr, OFFSET durakBadMoveText invoke Sleep, 650 jmp player_defend_loop player_take_table: invoke CollectDurakTable, OFFSET durakPlayerHand, OFFSET durakPlayerCnt invoke PrintStr, OFFSET durakPlayerTakeText mov durakPlayerTurn, 0 call RefillDurakHandsAIFirst call PauseConsole ret player_defended_all: call FindAIThrowIn cmp eax, 0FFFFFFFFh je player_defense_done invoke RemoveDurakCard, OFFSET durakAIHand, OFFSET durakAICnt, eax call AddDurakAttack jmp player_defend_loop player_defense_done: invoke PrintStr, OFFSET durakPlayerDefendText call ClearDurakTable mov durakPlayerTurn, 1 call RefillDurakHandsAIFirst call PauseConsole ret PlayerDefendLoop ENDP ; --- GameDurak: дурак: козырь, атака, защита, подкидывание и добор --- GameDurak PROC durak_start: call ClearView invoke PrintTitleColor, OFFSET durakTitle call PromptBet call SetupDurak durak_round_loop: call CheckDurakEnd cmp eax, 1 je durak_finish_win cmp eax, 2 je durak_finish_lose cmp eax, 3 je durak_finish_draw inc durakSafeTurns cmp durakSafeTurns, 300 ja durak_finish_stuck call ClearDurakTable cmp durakPlayerTurn, 1 je durak_check_player_attack jmp durak_check_ai_attack durak_check_player_attack: cmp durakPlayerCnt, 0 jne durak_player_attack cmp durakDeckLeft, 0 jbe durak_round_loop call RefillDurakHands cmp durakPlayerCnt, 0 jne durak_player_attack jmp durak_finish_stuck durak_check_ai_attack: cmp durakAICnt, 0 jne durak_ai_attack cmp durakDeckLeft, 0 jbe durak_round_loop call RefillDurakHandsAIFirst cmp durakAICnt, 0 jne durak_ai_attack jmp durak_finish_stuck durak_player_attack: player_attack_choose: call ShowDurakTable invoke PrintStr, OFFSET durakAttackAsk call ReadUInt cmp eax, 1 jb player_attack_bad cmp eax, durakPlayerCnt ja player_attack_bad dec eax invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, eax call AddDurakAttack call PlayerOpenAttackLoop call PlayerThrowLoop jmp durak_round_loop player_attack_bad: invoke PrintStr, OFFSET durakBadMoveText invoke Sleep, 650 jmp player_attack_choose durak_ai_attack: cmp durakAICnt, 0 jne durak_ai_has_card call RefillDurakHandsAIFirst cmp durakAICnt, 0 je durak_round_loop durak_ai_has_card: invoke RemoveDurakCard, OFFSET durakAIHand, OFFSET durakAICnt, 0 call AddDurakAttack call AIInitialThrowLoop call PlayerDefendLoop jmp durak_round_loop durak_finish_win: invoke UnlockAchievement, 2000h, OFFSET achDurakWinName call ShowDurakTable invoke PrintStr, OFFSET durakWinText call PayWin jmp durak_again durak_finish_lose: call ShowDurakTable invoke PrintStr, OFFSET durakLoseText call PayLose jmp durak_again durak_finish_stuck: call ShowDurakTable invoke PrintStr, OFFSET durakStuckText call PayDraw jmp durak_again durak_finish_draw: call ShowDurakTable invoke PrintStr, OFFSET drawText call PayDraw durak_again: cmp tournamentMode, 1 je durak_tournament_return invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je durak_start cmp al, 'Y' je durak_start durak_tournament_return: ret GameDurak ENDP ; --- GameClassicSlot: слот-машины, барабаны, символы, выплаты и джекпоты --- GameClassicSlot PROC classic_slot_start: call ClearView invoke PrintTitleColor, OFFSET classicSlotTitle invoke PrintStr, OFFSET classicSlotPayTableText call PromptBet call PlaySlotSound invoke Sleep, 400 invoke PrintStr, OFFSET slotPullText mov slotWinMask, 0 mov slotVisible, 0 call PrintClassicSlotWindow invoke Sleep, 1600 invoke FillClassicSlotColumn, 0 mov slotVisible, 1 call PrintClassicSlotWindow invoke Sleep, 750 invoke FillClassicSlotColumn, 1 mov slotVisible, 2 call PrintClassicSlotWindow invoke Sleep, 750 invoke FillClassicSlotColumn, 2 mov slotVisible, 3 call PrintClassicSlotWindow invoke Sleep, 450 cmp cheatSlotJackpot, 1 jne classic_no_forced_jackpot mov cheatSlotJackpot, 0 mov dword ptr slotGrid[12], 0 mov dword ptr slotGrid[16], 0 mov dword ptr slotGrid[20], 0 call PrintClassicSlotWindow invoke Sleep, 300 classic_no_forced_jackpot: mov eax, slotGrid[12] mov slotA, eax mov eax, slotGrid[16] mov slotB, eax mov eax, slotGrid[20] mov slotC, eax mov eax, slotA cmp eax, slotB jne classic_slot_check_pair_1 mov eax, slotB cmp eax, slotC jne classic_slot_pair invoke UnlockAchievement, 100h, OFFSET achClassicSlotName call PlayJackpotSound invoke PrintStr, OFFSET classicSlotJackpot invoke Sleep, 650 call PlayHakariSound call PlayHakariDance call PrintClassicSlotWindow mov eax, slotA cmp eax, 0 je classic_slot_pay_777 cmp eax, 2 je classic_slot_pay_dollar cmp eax, 1 je classic_slot_pay_bar cmp eax, 5 je classic_slot_pay_aaa invoke PaySlotMultiplier, 3 jmp classic_ask_slot_again classic_slot_pay_777: invoke UnlockAchievement, 100h, OFFSET achClassicSlotName invoke PaySlotMultiplier, 10 jmp classic_ask_slot_again classic_slot_pay_dollar: invoke PaySlotMultiplier, 7 jmp classic_ask_slot_again classic_slot_pay_bar: invoke PaySlotMultiplier, 5 jmp classic_ask_slot_again classic_slot_pay_aaa: invoke PaySlotMultiplier, 4 jmp classic_ask_slot_again classic_slot_check_pair_1: mov eax, slotA cmp eax, slotC je classic_slot_pair mov eax, slotB cmp eax, slotC je classic_slot_pair invoke PrintStr, OFFSET classicSlotEmpty call PayLose jmp classic_ask_slot_again classic_slot_pair: invoke UnlockAchievement, 100h, OFFSET achClassicSlotName invoke PrintStr, OFFSET classicSlotPair invoke PaySlotMultiplier, 2 classic_ask_slot_again: invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je classic_slot_start cmp al, 'Y' je classic_slot_start ret GameClassicSlot ENDP ; --- ObserverDrawAI1: режим наблюдателя AI vs AI --- ObserverDrawAI1 PROC call DrawPlayer21Hand call CalcPlayerScore21 ret ObserverDrawAI1 ENDP ; --- ObserverDrawAI2: режим наблюдателя AI vs AI --- ObserverDrawAI2 PROC call DrawAI21Hand call CalcAIScore21 ret ObserverDrawAI2 ENDP ; --- ObserverShow21: карты, руки, очки и базовая карточная логика --- ObserverShow21 PROC call ClearView invoke PrintTitleColor, OFFSET observer21Title invoke PrintStr, OFFSET observerAI1CardsText invoke PrintHandRow21, OFFSET playerHand21, playerCnt21, 1 invoke PrintStr, OFFSET observerAI1Text invoke PrintUInt, playerTotal invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET observerAI2CardsText invoke PrintHandRow21, OFFSET aiHand21, aiCnt21, 1 invoke PrintStr, OFFSET observerAI2Text invoke PrintUInt, dealerTotal invoke PrintStr, OFFSET nl ret ObserverShow21 ENDP ; --- GameObserver21: карты, руки, очки и базовая карточная логика --- GameObserver21 PROC call ClearView invoke PrintTitleColor, OFFSET observer21Title call ResetDeck mov playerCnt21, 0 mov aiCnt21, 0 mov revealAI21, 1 call ObserverDrawAI1 call ObserverDrawAI1 call ObserverDrawAI2 call ObserverDrawAI2 observer21_loop: call ObserverShow21 invoke Sleep, 750 cmp playerTotal, 17 jae observer21_ai2 call ObserverDrawAI1 jmp observer21_loop observer21_ai2: cmp dealerTotal, 17 jae observer21_compare call ObserverDrawAI2 jmp observer21_loop observer21_compare: call ObserverShow21 mov eax, playerTotal cmp eax, 21 ja observer21_ai1_bust mov eax, dealerTotal cmp eax, 21 ja observer21_ai1_win mov eax, playerTotal cmp eax, dealerTotal ja observer21_ai1_win jb observer21_ai2_win invoke PrintStr, OFFSET observerDrawText jmp observer21_done observer21_ai1_bust: mov eax, dealerTotal cmp eax, 21 ja observer21_draw jmp observer21_ai2_win observer21_draw: invoke PrintStr, OFFSET observerDrawText jmp observer21_done observer21_ai1_win: invoke PrintStr, OFFSET observerWin1Text jmp observer21_done observer21_ai2_win: invoke PrintStr, OFFSET observerWin2Text observer21_done: call PauseConsole ret GameObserver21 ENDP ; --- ObserverPokerEvaluate: покер: оценка комбинаций, ставки, фолды и ИИ --- ObserverPokerEvaluate PROC invoke BuildPokerEvalHand, OFFSET playerHand21, OFFSET pokerPlayerEvalHand invoke EvaluatePokerN, OFFSET pokerPlayerEvalHand, pokerEvalCount mov pokerPlayerScore, eax invoke BuildPokerEvalHand, OFFSET aiHand21, OFFSET pokerAIEvalHand invoke EvaluatePokerN, OFFSET pokerAIEvalHand, pokerEvalCount mov pokerAIScore, eax ret ObserverPokerEvaluate ENDP ; --- ObserverShowPoker: покер: оценка комбинаций, ставки, фолды и ИИ --- ObserverShowPoker PROC call ClearView invoke PrintTitleColor, OFFSET observerPokerTitle call ShowPokerTable call ShowPokerMoney call ObserverPokerEvaluate invoke PrintStr, OFFSET pokerYourComboText invoke PrintPokerHandName, pokerPlayerScore invoke PrintStr, OFFSET pokerAIComboText invoke PrintPokerHandName, pokerAIScore ret ObserverShowPoker ENDP ; --- ObserverPokerDecision: покер: оценка комбинаций, ставки, фолды и ИИ --- ObserverPokerDecision PROC uses ebx edx call ObserverPokerEvaluate mov eax, pokerPlayerScore cmp eax, 9 ja observer_poker_ai2_check_fold invoke RandomRange, 4 cmp eax, 0 je observer_poker_ai1_fold observer_poker_ai2_check_fold: mov eax, pokerAIScore cmp eax, 9 ja observer_poker_raise_check invoke RandomRange, 4 cmp eax, 0 je observer_poker_ai2_fold observer_poker_raise_check: mov eax, pokerPlayerScore cmp eax, 1000 jb observer_poker_ai2_raise_check invoke RandomRange, 2 cmp eax, 0 jne observer_poker_ai2_raise_check invoke PrintStr, OFFSET observerAI1RaiseText add currentBet, 500 invoke Sleep, 450 mov eax, pokerAIScore cmp eax, pokerPlayerScore jae observer_poker_call_1 invoke RandomRange, 2 cmp eax, 0 je observer_poker_ai2_fold observer_poker_call_1: invoke PrintStr, OFFSET observerCallText observer_poker_ai2_raise_check: mov eax, pokerAIScore cmp eax, 1000 jb observer_poker_continue invoke RandomRange, 2 cmp eax, 0 jne observer_poker_continue invoke PrintStr, OFFSET observerAI2RaiseText add currentBet, 500 invoke Sleep, 450 mov eax, pokerPlayerScore cmp eax, pokerAIScore jae observer_poker_call_2 invoke RandomRange, 2 cmp eax, 0 je observer_poker_ai1_fold observer_poker_call_2: invoke PrintStr, OFFSET observerCallText observer_poker_continue: xor eax, eax ret observer_poker_ai1_fold: invoke PrintStr, OFFSET observerFold1Text mov eax, 2 ret observer_poker_ai2_fold: invoke PrintStr, OFFSET observerFold2Text mov eax, 1 ret ObserverPokerDecision ENDP ; --- GameObserverPoker: покер: оценка комбинаций, ставки, фолды и ИИ --- GameObserverPoker PROC call ClearView invoke PrintTitleColor, OFFSET observerPokerTitle call ResetDeck call ResetPokerHands mov revealAI21, 1 mov currentBet, 500 call DealPokerHands observer_poker_stage_loop: call ObserverShowPoker invoke Sleep, 700 cmp communityCnt, 5 jae observer_poker_showdown call ObserverPokerDecision cmp eax, 1 je observer_poker_ai1_wins cmp eax, 2 je observer_poker_ai2_wins invoke PrintStr, OFFSET pokerNextCardText invoke Sleep, 700 inc communityCnt jmp observer_poker_stage_loop observer_poker_showdown: call ObserverShowPoker mov eax, pokerPlayerScore cmp eax, pokerAIScore ja observer_poker_ai1_wins jb observer_poker_ai2_wins invoke PrintStr, OFFSET observerDrawText jmp observer_poker_done observer_poker_ai1_wins: invoke PrintStr, OFFSET observerWin1Text jmp observer_poker_done observer_poker_ai2_wins: invoke PrintStr, OFFSET observerWin2Text observer_poker_done: call PauseConsole ret GameObserverPoker ENDP ; --- FindPlayerDurakDefense: аккаунты, файлы сохранений и загрузка профиля --- FindPlayerDurakDefense PROC uses ebx ecx, tableIndex:DWORD mov rowIndex, 0 find_player_defense_loop: mov eax, rowIndex cmp eax, durakPlayerCnt jae find_player_defense_no mov ebx, OFFSET durakPlayerHand mov ecx, [ebx + eax * 4] mov ebx, tableIndex invoke CanDurakBeat, durakAttackCards[ebx * 4], ecx cmp eax, 1 je find_player_defense_yes inc rowIndex jmp find_player_defense_loop find_player_defense_yes: mov eax, rowIndex ret find_player_defense_no: mov eax, 0FFFFFFFFh ret FindPlayerDurakDefense ENDP ; --- PlayerAIDefendAll: звук, интро или покадровая анимация --- PlayerAIDefendAll PROC uses ebx player_ai_defend_loop: call DurakFirstUnbeaten cmp eax, 0FFFFFFFFh je player_ai_defend_success mov ebx, eax invoke FindPlayerDurakDefense, ebx cmp eax, 0FFFFFFFFh je player_ai_defend_fail invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, eax mov durakDefenseCards[ebx * 4], eax jmp player_ai_defend_loop player_ai_defend_success: mov eax, 1 ret player_ai_defend_fail: xor eax, eax ret PlayerAIDefendAll ENDP ; --- FindPlayerThrowIn: аккаунты, файлы сохранений и загрузка профиля --- FindPlayerThrowIn PROC uses ebx ecx cmp durakTableCnt, 6 jae player_ai_throw_none mov eax, durakTableCnt cmp eax, durakAICnt jae player_ai_throw_none mov rowIndex, 0 player_ai_throw_loop: mov eax, rowIndex cmp eax, durakPlayerCnt jae player_ai_throw_none mov ebx, OFFSET durakPlayerHand mov ecx, [ebx + eax * 4] invoke DurakRankOnTable, ecx cmp eax, 1 je player_ai_throw_found inc rowIndex jmp player_ai_throw_loop player_ai_throw_found: mov eax, rowIndex ret player_ai_throw_none: mov eax, 0FFFFFFFFh ret FindPlayerThrowIn ENDP ; --- PlayerAIInitialThrowLoop: звук, интро или покадровая анимация --- PlayerAIInitialThrowLoop PROC player_ai_initial_throw_loop: call FindPlayerThrowIn cmp eax, 0FFFFFFFFh je player_ai_initial_throw_done invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, eax call AddDurakAttack jmp player_ai_initial_throw_loop player_ai_initial_throw_done: ret PlayerAIInitialThrowLoop ENDP ; --- ShowDurakObserverTable: дурак: козырь, атака, защита, подкидывание и добор --- ShowDurakObserverTable PROC call ClearView invoke PrintTitleColor, OFFSET observerDurakTitle invoke PrintStr, OFFSET durakDeckVisualText invoke PrintDurakCardName, durakTrumpCard invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET durakDeckText invoke PrintUInt, durakDeckLeft invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET observerAI1CardsText invoke PrintHandRow21, OFFSET durakPlayerHand, durakPlayerCnt, 1 call PrintDurakTable invoke PrintStr, OFFSET observerAI2CardsText invoke PrintHandRow21, OFFSET durakAIHand, durakAICnt, 1 ret ShowDurakObserverTable ENDP ; --- GameObserverDurak: дурак: козырь, атака, защита, подкидывание и добор --- GameObserverDurak PROC call SetupDurak mov pokerReplaceIndex, 0 observer_durak_loop: inc pokerReplaceIndex cmp pokerReplaceIndex, 32 ja observer_durak_draw call CheckDurakEnd cmp eax, 1 je observer_durak_ai1_win cmp eax, 2 je observer_durak_ai2_win cmp eax, 3 je observer_durak_draw call ClearDurakTable cmp durakPlayerTurn, 1 je observer_durak_ai1_attack jmp observer_durak_ai2_attack observer_durak_ai1_attack: cmp durakPlayerCnt, 0 je observer_durak_ai1_win invoke RemoveDurakCard, OFFSET durakPlayerHand, OFFSET durakPlayerCnt, 0 call AddDurakAttack call PlayerAIInitialThrowLoop call ShowDurakObserverTable invoke Sleep, 750 call AIDefendAll cmp eax, 1 je observer_durak_ai2_defended invoke CollectDurakTable, OFFSET durakAIHand, OFFSET durakAICnt invoke PrintStr, OFFSET durakAITakeText mov durakPlayerTurn, 1 call RefillDurakHands invoke Sleep, 850 jmp observer_durak_loop observer_durak_ai2_defended: call ShowDurakObserverTable invoke Sleep, 750 call ClearDurakTable mov durakPlayerTurn, 0 call RefillDurakHands jmp observer_durak_loop observer_durak_ai2_attack: cmp durakAICnt, 0 je observer_durak_ai2_win invoke RemoveDurakCard, OFFSET durakAIHand, OFFSET durakAICnt, 0 call AddDurakAttack call AIInitialThrowLoop call ShowDurakObserverTable invoke Sleep, 750 call PlayerAIDefendAll cmp eax, 1 je observer_durak_ai1_defended invoke CollectDurakTable, OFFSET durakPlayerHand, OFFSET durakPlayerCnt invoke PrintStr, OFFSET durakPlayerTakeText mov durakPlayerTurn, 0 call RefillDurakHandsAIFirst invoke Sleep, 850 jmp observer_durak_loop observer_durak_ai1_defended: call ShowDurakObserverTable invoke Sleep, 750 call ClearDurakTable mov durakPlayerTurn, 1 call RefillDurakHandsAIFirst jmp observer_durak_loop observer_durak_ai1_win: call ShowDurakObserverTable invoke PrintStr, OFFSET observerWin1Text jmp observer_durak_done observer_durak_ai2_win: call ShowDurakObserverTable invoke PrintStr, OFFSET observerWin2Text jmp observer_durak_done observer_durak_draw: call ShowDurakObserverTable invoke PrintStr, OFFSET observerDrawText observer_durak_done: call PauseConsole ret GameObserverDurak ENDP ; --- GameObserverRoulette: русская рулетка или казино-рулетка --- GameObserverRoulette PROC call ClearView invoke PrintTitleColor, OFFSET observerRRTitle call PlayRouletteSpinSound call SetupRoulette call AnimateRouletteSpin observer_rr_loop: call ShowRouletteStatus cmp rrTurn, 0 je observer_rr_ai1_turn invoke PrintStr, OFFSET rrAITurnText invoke Sleep, 850 call RouletteChamberLoaded cmp eax, 1 je observer_rr_ai2_dead call PlayRouletteDrySound invoke PrintStr, OFFSET rrClickText invoke Sleep, 750 call AdvanceRouletteChamber mov rrTurn, 0 jmp observer_rr_loop observer_rr_ai1_turn: invoke PrintStr, OFFSET rrPlayerTurnText invoke Sleep, 850 call RouletteChamberLoaded cmp eax, 1 je observer_rr_ai1_dead call PlayRouletteDrySound invoke PrintStr, OFFSET rrClickText invoke Sleep, 750 call AdvanceRouletteChamber mov rrTurn, 1 jmp observer_rr_loop observer_rr_ai1_dead: call PrintBang invoke PrintStr, OFFSET observerShotAI1Text jmp observer_rr_done observer_rr_ai2_dead: call PrintBang invoke PrintStr, OFFSET observerShotAI2Text observer_rr_done: call PauseConsole ret GameObserverRoulette ENDP ; --- GameObserver: режим наблюдателя AI vs AI --- GameObserver PROC observer_menu_loop: call ClearView invoke PrintTitleColor, OFFSET observerTitle invoke PrintStr, OFFSET observerMenuText call ReadUInt cmp eax, 0 je observer_exit cmp eax, 1 je observer_run_rr cmp eax, 2 je observer_run_21 cmp eax, 3 je observer_run_poker cmp eax, 4 je observer_run_durak invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp observer_menu_loop observer_run_rr: invoke UnlockAchievement, 10000h, OFFSET achObserverName call GameObserverRoulette jmp observer_menu_loop observer_run_21: mov currentGameId, 1 invoke UnlockAchievement, 10000h, OFFSET achObserverName call GameObserver21 jmp observer_menu_loop observer_run_poker: mov currentGameId, 2 invoke UnlockAchievement, 10000h, OFFSET achObserverName call GameObserverPoker jmp observer_menu_loop observer_run_durak: mov currentGameId, 10 invoke UnlockAchievement, 10000h, OFFSET achObserverName call GameObserverDurak jmp observer_menu_loop observer_exit: ret GameObserver ENDP ; --- PrintShopBackName: вывод текста, цветов, картинок и элементов интерфейса --- PrintShopBackName PROC mov eax, shopBackStyle cmp eax, 1 je print_shop_back_blue cmp eax, 2 je print_shop_back_red cmp eax, 3 je print_shop_back_gold cmp eax, 4 je print_shop_back_skull cmp eax, 5 je print_shop_back_clover cmp eax, 6 je print_shop_back_arcane cmp eax, 7 je print_shop_back_noir cmp eax, 8 je print_shop_back_diamond cmp eax, 9 je print_shop_back_rider cmp eax, 10 je print_shop_back_bee cmp eax, 11 je print_shop_back_fan cmp eax, 12 je print_shop_back_web invoke PrintStr, OFFSET shopBackGray ret print_shop_back_blue: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopBackBlue call ResetColor ret print_shop_back_red: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopBackRed call ResetColor ret print_shop_back_gold: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopBackGold call ResetColor ret print_shop_back_skull: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopBackSkull call ResetColor ret print_shop_back_clover: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET shopBackClover call ResetColor ret print_shop_back_arcane: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopBackArcane call ResetColor ret print_shop_back_noir: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET shopBackNoir call ResetColor ret print_shop_back_diamond: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopBackDiamond call ResetColor ret print_shop_back_rider: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopBackRider call ResetColor ret print_shop_back_bee: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopBackBee call ResetColor ret print_shop_back_fan: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopBackFan call ResetColor ret print_shop_back_web: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET shopBackWeb call ResetColor ret PrintShopBackName ENDP ; --- PrintShopCharmName: вывод текста, цветов, картинок и элементов интерфейса --- PrintShopCharmName PROC mov eax, shopCharmLevel cmp eax, 1 je print_shop_charm_clover cmp eax, 2 je print_shop_charm_bell cmp eax, 3 je print_shop_charm_diamond cmp eax, 4 je print_shop_charm_skull cmp eax, 5 je print_shop_charm_web cmp eax, 6 je print_shop_charm_bee cmp eax, 7 je print_shop_charm_moon cmp eax, 8 je print_shop_charm_crown cmp eax, 9 je print_shop_charm_mirror cmp eax, 10 je print_shop_charm_dice cmp eax, 11 je print_shop_charm_blood cmp eax, 12 je print_shop_charm_hourglass cmp eax, 13 je print_shop_charm_horseshoe cmp eax, 14 je print_shop_charm_joker cmp eax, 15 je print_shop_charm_phoenix cmp eax, 16 je print_shop_charm_compass cmp eax, 17 je print_shop_charm_tooth cmp eax, 18 je print_shop_charm_eye cmp eax, 19 je print_shop_charm_key cmp eax, 20 je print_shop_charm_candle cmp eax, 21 je print_shop_charm_chip cmp eax, 22 je print_shop_charm_snake cmp eax, 23 je print_shop_charm_ace cmp eax, 24 je print_shop_charm_devil invoke PrintStr, OFFSET shopCharmNone ret print_shop_charm_clover: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET shopCharmClover call ResetColor jmp print_shop_charm_uses print_shop_charm_bell: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopCharmBell call ResetColor jmp print_shop_charm_uses print_shop_charm_diamond: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopCharmDiamond call ResetColor jmp print_shop_charm_uses print_shop_charm_skull: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopCharmSkull call ResetColor jmp print_shop_charm_uses print_shop_charm_web: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET shopCharmWeb call ResetColor jmp print_shop_charm_uses print_shop_charm_bee: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopCharmBee call ResetColor jmp print_shop_charm_uses print_shop_charm_moon: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopCharmMoon call ResetColor jmp print_shop_charm_uses print_shop_charm_crown: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopCharmCrown call ResetColor jmp print_shop_charm_uses print_shop_charm_mirror: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET shopCharmMirror call ResetColor jmp print_shop_charm_uses print_shop_charm_dice: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopCharmDice call ResetColor jmp print_shop_charm_uses print_shop_charm_blood: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopCharmBlood call ResetColor jmp print_shop_charm_uses print_shop_charm_hourglass: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopCharmHourglass call ResetColor jmp print_shop_charm_uses print_shop_charm_horseshoe: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET shopCharmHorseshoe call ResetColor jmp print_shop_charm_uses print_shop_charm_joker: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopCharmJoker call ResetColor jmp print_shop_charm_uses print_shop_charm_phoenix: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopCharmPhoenix call ResetColor jmp print_shop_charm_uses print_shop_charm_compass: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET shopCharmCompass call ResetColor jmp print_shop_charm_uses print_shop_charm_tooth: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopCharmTooth call ResetColor jmp print_shop_charm_uses print_shop_charm_eye: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopCharmEye call ResetColor jmp print_shop_charm_uses print_shop_charm_key: invoke SetColor, COLOR_CARD invoke PrintStr, OFFSET shopCharmKey call ResetColor jmp print_shop_charm_uses print_shop_charm_candle: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopCharmCandle call ResetColor jmp print_shop_charm_uses print_shop_charm_chip: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET shopCharmChip call ResetColor jmp print_shop_charm_uses print_shop_charm_snake: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET shopCharmSnake call ResetColor jmp print_shop_charm_uses print_shop_charm_ace: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET shopCharmAce call ResetColor jmp print_shop_charm_uses print_shop_charm_devil: invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET shopCharmDevil call ResetColor print_shop_charm_uses: invoke PrintStr, OFFSET shopCharmUsesText invoke PrintUInt, shopCharmUses invoke PrintStr, OFFSET nl ret PrintShopCharmName ENDP ; --- PrintShopStatus: вывод текста, цветов, картинок и элементов интерфейса --- PrintShopStatus PROC call PrintBank invoke PrintStr, OFFSET shopBackText call PrintShopBackName invoke PrintStr, OFFSET shopCharmText call PrintShopCharmName invoke PrintStr, OFFSET nl ret PrintShopStatus ENDP ; --- ShopBuyBack: магазин рубашек, талисманов и покупок --- ShopBuyBack PROC uses eax ebx, style:DWORD, cost:DWORD, maskValue:DWORD mov eax, shopBackOwned mov ebx, maskValue test eax, ebx jne shop_back_already_owned mov eax, cost cmp bankroll, eax jae shop_back_buy invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET tooBigBetText call ResetColor ret shop_back_buy: sub bankroll, eax mov eax, shopBackOwned or eax, ebx mov shopBackOwned, eax mov eax, style mov shopBackStyle, eax call SaveGame invoke UnlockAchievement, 10h, OFFSET achShopperName mov eax, shopBackOwned and eax, 1FFFh cmp eax, 1FFFh jne shop_back_collector_skip invoke UnlockAchievement, 4000h, OFFSET achBackCollectorName shop_back_collector_skip: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET shopBoughtText call ResetColor call PrintBank call CheckBankrupt ret shop_back_already_owned: mov eax, style mov shopBackStyle, eax call SaveGame invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET shopSelectedText call ResetColor ret ShopBuyBack ENDP ; --- ShopBuyCharm: покупка талисмана с разными зарядами --- ShopBuyCharm PROC uses eax, charmLevel:DWORD, cost:DWORD mov eax, cost cmp bankroll, eax jae shop_charm_buy invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET tooBigBetText call ResetColor ret shop_charm_buy: sub bankroll, eax mov eax, charmLevel mov shopCharmLevel, eax cmp eax, 5 je shop_charm_one_use cmp eax, 11 je shop_charm_one_use cmp eax, 14 je shop_charm_one_use cmp eax, 18 je shop_charm_one_use cmp eax, 20 je shop_charm_one_use cmp eax, 24 je shop_charm_one_use cmp eax, 4 je shop_charm_two_uses cmp eax, 8 je shop_charm_two_uses cmp eax, 12 je shop_charm_two_uses cmp eax, 15 je shop_charm_two_uses cmp eax, 22 je shop_charm_two_uses cmp eax, 7 je shop_charm_four_uses cmp eax, 9 je shop_charm_four_uses cmp eax, 21 je shop_charm_four_uses cmp eax, 6 je shop_charm_five_uses cmp eax, 17 je shop_charm_five_uses cmp eax, 23 je shop_charm_five_uses cmp eax, 10 je shop_charm_six_uses cmp eax, 19 je shop_charm_six_uses cmp eax, 13 je shop_charm_eight_uses mov shopCharmUses, 3 jmp shop_charm_store shop_charm_one_use: mov shopCharmUses, 1 jmp shop_charm_store shop_charm_two_uses: mov shopCharmUses, 2 jmp shop_charm_store shop_charm_four_uses: mov shopCharmUses, 4 jmp shop_charm_store shop_charm_five_uses: mov shopCharmUses, 5 jmp shop_charm_store shop_charm_six_uses: mov shopCharmUses, 6 jmp shop_charm_store shop_charm_eight_uses: mov shopCharmUses, 8 shop_charm_store: call SaveGame invoke UnlockAchievement, 10h, OFFSET achShopperName invoke UnlockAchievement, 8000h, OFFSET achCharmBuyerName invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET shopBoughtText call ResetColor call PrintBank call CheckBankrupt ret ShopBuyCharm ENDP ; --- ShowBestiaryPage: карточка талисмана в бестиарии --- ShowBestiaryPage PROC artPtr:DWORD, infoPtr:DWORD, colorValue:DWORD call ClearView invoke SetColor, colorValue invoke PrintStr, artPtr call ResetColor invoke PrintStr, infoPtr invoke PrintStr, OFFSET bestiaryBackText call ReadKey ret ShowBestiaryPage ENDP ; --- GameCharmBestiary: энциклопедия талисманов с ASCII-артами --- GameCharmBestiary PROC bestiary_loop: call ClearView invoke PrintTitleColor, OFFSET bestiaryTitle invoke PrintStr, OFFSET bestiaryMenuText call ReadUInt cmp eax, 0 je bestiary_exit cmp eax, 1 je bestiary_clover cmp eax, 2 je bestiary_bell cmp eax, 3 je bestiary_diamond cmp eax, 4 je bestiary_skull cmp eax, 5 je bestiary_web cmp eax, 6 je bestiary_bee cmp eax, 7 je bestiary_moon cmp eax, 8 je bestiary_crown cmp eax, 9 je bestiary_mirror cmp eax, 10 je bestiary_dice cmp eax, 11 je bestiary_blood cmp eax, 12 je bestiary_hourglass cmp eax, 13 je bestiary_horseshoe cmp eax, 14 je bestiary_joker cmp eax, 15 je bestiary_phoenix cmp eax, 16 je bestiary_compass cmp eax, 17 je bestiary_tooth cmp eax, 18 je bestiary_eye cmp eax, 19 je bestiary_key cmp eax, 20 je bestiary_candle cmp eax, 21 je bestiary_chip cmp eax, 22 je bestiary_snake cmp eax, 23 je bestiary_ace cmp eax, 24 je bestiary_devil invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp bestiary_loop bestiary_clover: invoke ShowBestiaryPage, OFFSET bestiaryCloverArt, OFFSET bestiaryCloverInfo, COLOR_MONEY jmp bestiary_loop bestiary_bell: invoke ShowBestiaryPage, OFFSET bestiaryBellArt, OFFSET bestiaryBellInfo, COLOR_WARN jmp bestiary_loop bestiary_diamond: invoke ShowBestiaryPage, OFFSET bestiaryDiamondArt, OFFSET bestiaryDiamondInfo, COLOR_TITLE jmp bestiary_loop bestiary_skull: invoke ShowBestiaryPage, OFFSET bestiarySkullArt, OFFSET bestiarySkullInfo, COLOR_BAD jmp bestiary_loop bestiary_web: invoke ShowBestiaryPage, OFFSET bestiaryWebArt, OFFSET bestiaryWebInfo, COLOR_CARD jmp bestiary_loop bestiary_bee: invoke ShowBestiaryPage, OFFSET bestiaryBeeArt, OFFSET bestiaryBeeInfo, COLOR_WARN jmp bestiary_loop bestiary_moon: invoke ShowBestiaryPage, OFFSET bestiaryMoonArt, OFFSET bestiaryMoonInfo, COLOR_TITLE jmp bestiary_loop bestiary_crown: invoke ShowBestiaryPage, OFFSET bestiaryCrownArt, OFFSET bestiaryCrownInfo, COLOR_WARN jmp bestiary_loop bestiary_mirror: invoke ShowBestiaryPage, OFFSET bestiaryMirrorArt, OFFSET bestiaryMirrorInfo, COLOR_CARD jmp bestiary_loop bestiary_dice: invoke ShowBestiaryPage, OFFSET bestiaryDiceArt, OFFSET bestiaryDiceInfo, COLOR_TITLE jmp bestiary_loop bestiary_blood: invoke ShowBestiaryPage, OFFSET bestiaryBloodArt, OFFSET bestiaryBloodInfo, COLOR_BAD jmp bestiary_loop bestiary_hourglass: invoke ShowBestiaryPage, OFFSET bestiaryHourglassArt, OFFSET bestiaryHourglassInfo, COLOR_WARN jmp bestiary_loop bestiary_horseshoe: invoke ShowBestiaryPage, OFFSET bestiaryHorseshoeArt, OFFSET bestiaryHorseshoeInfo, COLOR_MONEY jmp bestiary_loop bestiary_joker: invoke ShowBestiaryPage, OFFSET bestiaryJokerArt, OFFSET bestiaryJokerInfo, COLOR_BAD jmp bestiary_loop bestiary_phoenix: invoke ShowBestiaryPage, OFFSET bestiaryPhoenixArt, OFFSET bestiaryPhoenixInfo, COLOR_WARN jmp bestiary_loop bestiary_compass: invoke ShowBestiaryPage, OFFSET bestiaryCompassArt, OFFSET bestiaryCompassInfo, COLOR_CARD jmp bestiary_loop bestiary_tooth: invoke ShowBestiaryPage, OFFSET bestiaryToothArt, OFFSET bestiaryToothInfo, COLOR_WARN jmp bestiary_loop bestiary_eye: invoke ShowBestiaryPage, OFFSET bestiaryEyeArt, OFFSET bestiaryEyeInfo, COLOR_TITLE jmp bestiary_loop bestiary_key: invoke ShowBestiaryPage, OFFSET bestiaryKeyArt, OFFSET bestiaryKeyInfo, COLOR_CARD jmp bestiary_loop bestiary_candle: invoke ShowBestiaryPage, OFFSET bestiaryCandleArt, OFFSET bestiaryCandleInfo, COLOR_BAD jmp bestiary_loop bestiary_chip: invoke ShowBestiaryPage, OFFSET bestiaryChipArt, OFFSET bestiaryChipInfo, COLOR_MONEY jmp bestiary_loop bestiary_snake: invoke ShowBestiaryPage, OFFSET bestiarySnakeArt, OFFSET bestiarySnakeInfo, COLOR_MONEY jmp bestiary_loop bestiary_ace: invoke ShowBestiaryPage, OFFSET bestiaryAceArt, OFFSET bestiaryAceInfo, COLOR_TITLE jmp bestiary_loop bestiary_devil: invoke ShowBestiaryPage, OFFSET bestiaryDevilArt, OFFSET bestiaryDevilInfo, COLOR_BAD jmp bestiary_loop bestiary_exit: ret GameCharmBestiary ENDP ; --- GameShop: магазин рубашек, талисманов и покупок --- GameShop PROC shop_loop: call ClearView invoke PrintTitleColor, OFFSET shopTitle call PrintShopStatus invoke PrintStr, OFFSET shopMainMenuText call ReadUInt cmp eax, 0 je shop_exit cmp eax, 1 je shop_backs_menu cmp eax, 2 je shop_charms_menu cmp eax, 3 je shop_bestiary_menu invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp shop_loop shop_bestiary_menu: call GameCharmBestiary jmp shop_loop shop_backs_menu: call ClearView invoke PrintTitleColor, OFFSET shopBackTitle call PrintShopStatus invoke PrintStr, OFFSET shopBackMenuText call ReadUInt cmp eax, 0 je shop_loop cmp eax, 1 je shop_blue cmp eax, 2 je shop_red cmp eax, 3 je shop_gold cmp eax, 4 je shop_skull cmp eax, 5 je shop_clover_back cmp eax, 6 je shop_arcane cmp eax, 7 je shop_noir cmp eax, 8 je shop_diamond_back cmp eax, 9 je shop_rider cmp eax, 10 je shop_bee cmp eax, 11 je shop_fan cmp eax, 12 je shop_web invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp shop_backs_menu shop_charms_menu: call ClearView invoke PrintTitleColor, OFFSET shopCharmTitle call PrintShopStatus invoke PrintStr, OFFSET shopCharmMenuText call ReadUInt cmp eax, 0 je shop_loop cmp eax, 1 je buy_charm_clover cmp eax, 2 je buy_charm_bell cmp eax, 3 je buy_charm_diamond cmp eax, 4 je buy_charm_skull cmp eax, 5 je buy_charm_web cmp eax, 6 je buy_charm_bee_item cmp eax, 7 je buy_charm_moon cmp eax, 8 je buy_charm_crown cmp eax, 9 je buy_charm_mirror cmp eax, 10 je buy_charm_dice cmp eax, 11 je buy_charm_blood cmp eax, 12 je buy_charm_hourglass cmp eax, 13 je buy_charm_horseshoe cmp eax, 14 je buy_charm_joker cmp eax, 15 je buy_charm_phoenix cmp eax, 16 je buy_charm_compass cmp eax, 17 je buy_charm_tooth cmp eax, 18 je buy_charm_eye cmp eax, 19 je buy_charm_key cmp eax, 20 je buy_charm_candle cmp eax, 21 je buy_charm_chip cmp eax, 22 je buy_charm_snake cmp eax, 23 je buy_charm_ace cmp eax, 24 je buy_charm_devil invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp shop_charms_menu shop_blue: invoke ShopBuyBack, 1, 3000, 2 call PauseConsole jmp shop_backs_menu shop_red: invoke ShopBuyBack, 2, 3000, 4 call PauseConsole jmp shop_backs_menu shop_gold: invoke ShopBuyBack, 3, 10000, 8 call PauseConsole jmp shop_backs_menu shop_skull: invoke ShopBuyBack, 4, 12000, 10h call PauseConsole jmp shop_backs_menu shop_clover_back: invoke ShopBuyBack, 5, 15000, 20h call PauseConsole jmp shop_backs_menu shop_arcane: invoke ShopBuyBack, 6, 17000, 40h call PauseConsole jmp shop_backs_menu shop_noir: invoke ShopBuyBack, 7, 18000, 80h call PauseConsole jmp shop_backs_menu shop_diamond_back: invoke ShopBuyBack, 8, 20000, 100h call PauseConsole jmp shop_backs_menu shop_rider: invoke ShopBuyBack, 9, 22000, 200h call PauseConsole jmp shop_backs_menu shop_bee: invoke ShopBuyBack, 10, 22000, 400h call PauseConsole jmp shop_backs_menu shop_fan: invoke ShopBuyBack, 11, 23000, 800h call PauseConsole jmp shop_backs_menu shop_web: invoke ShopBuyBack, 12, 24000, 1000h call PauseConsole jmp shop_backs_menu buy_charm_clover: invoke ShopBuyCharm, 1, 12000 call PauseConsole jmp shop_charms_menu buy_charm_bell: invoke ShopBuyCharm, 2, 18000 call PauseConsole jmp shop_charms_menu buy_charm_diamond: invoke ShopBuyCharm, 3, 25000 call PauseConsole jmp shop_charms_menu buy_charm_skull: invoke ShopBuyCharm, 4, 32000 call PauseConsole jmp shop_charms_menu buy_charm_web: invoke ShopBuyCharm, 5, 40000 call PauseConsole jmp shop_charms_menu buy_charm_bee_item: invoke ShopBuyCharm, 6, 30000 call PauseConsole jmp shop_charms_menu buy_charm_moon: invoke ShopBuyCharm, 7, 36000 call PauseConsole jmp shop_charms_menu buy_charm_crown: invoke ShopBuyCharm, 8, 52000 call PauseConsole jmp shop_charms_menu buy_charm_mirror: invoke ShopBuyCharm, 9, 42000 call PauseConsole jmp shop_charms_menu buy_charm_dice: invoke ShopBuyCharm, 10, 35000 call PauseConsole jmp shop_charms_menu buy_charm_blood: invoke ShopBuyCharm, 11, 65000 call PauseConsole jmp shop_charms_menu buy_charm_hourglass: invoke ShopBuyCharm, 12, 48000 call PauseConsole jmp shop_charms_menu buy_charm_horseshoe: invoke ShopBuyCharm, 13, 39000 call PauseConsole jmp shop_charms_menu buy_charm_joker: invoke ShopBuyCharm, 14, 70000 call PauseConsole jmp shop_charms_menu buy_charm_phoenix: invoke ShopBuyCharm, 15, 56000 call PauseConsole jmp shop_charms_menu buy_charm_compass: invoke ShopBuyCharm, 16, 44000 call PauseConsole jmp shop_charms_menu buy_charm_tooth: invoke ShopBuyCharm, 17, 47000 call PauseConsole jmp shop_charms_menu buy_charm_eye: invoke ShopBuyCharm, 18, 60000 call PauseConsole jmp shop_charms_menu buy_charm_key: invoke ShopBuyCharm, 19, 41000 call PauseConsole jmp shop_charms_menu buy_charm_candle: invoke ShopBuyCharm, 20, 76000 call PauseConsole jmp shop_charms_menu buy_charm_chip: invoke ShopBuyCharm, 21, 50000 call PauseConsole jmp shop_charms_menu buy_charm_snake: invoke ShopBuyCharm, 22, 62000 call PauseConsole jmp shop_charms_menu buy_charm_ace: invoke ShopBuyCharm, 23, 53000 call PauseConsole jmp shop_charms_menu buy_charm_devil: invoke ShopBuyCharm, 24, 100000 call PauseConsole jmp shop_charms_menu shop_exit: ret GameShop ENDP ; --- CopyName: служебный блок игровой логики --- CopyName PROC uses eax ecx esi edi, pDst:DWORD, pSrc:DWORD mov edi, pDst mov esi, pSrc mov ecx, 63 copy_name_loop: mov al, [esi] cmp al, '.' je copy_name_stop mov [edi], al cmp al, 0 je copy_name_done inc esi inc edi loop copy_name_loop copy_name_stop: mov byte ptr [edi], 0 copy_name_done: ret CopyName ENDP ; --- ClearLeaderboards: статистика, достижения и таблицы лидеров --- ClearLeaderboards PROC uses eax ecx edi mov leaderBestBank, 0 mov leaderBestWins, 0 mov leaderBestLosses, 0 mov leaderValidCount, 0 mov ecx, 22 mov edi, OFFSET leaderBestGameWins clear_leader_counts: mov dword ptr [edi], 0 add edi, 4 loop clear_leader_counts mov ecx, 1600 mov edi, OFFSET leaderBestBankName clear_leader_names: mov byte ptr [edi], 0 inc edi loop clear_leader_names ret ClearLeaderboards ENDP ; --- LeaderboardUpdateGame: статистика, достижения и таблицы лидеров --- LeaderboardUpdateGame PROC uses eax ebx edx mov ebx, rowIndex mov eax, DWORD PTR [saveBuffer+104+ebx*4] cmp eax, leaderBestGameWins[ebx*4] jbe leaderboard_check_losses mov leaderBestGameWins[ebx*4], eax mov edx, ebx shl edx, 6 add edx, OFFSET leaderBestGameWinNames invoke CopyName, edx, leaderAccountPtr leaderboard_check_losses: mov eax, DWORD PTR [saveBuffer+148+ebx*4] cmp eax, leaderBestGameLosses[ebx*4] jbe leaderboard_game_done mov leaderBestGameLosses[ebx*4], eax mov edx, ebx shl edx, 6 add edx, OFFSET leaderBestGameLossNames invoke CopyName, edx, leaderAccountPtr leaderboard_game_done: ret LeaderboardUpdateGame ENDP ; --- LeaderboardReadAccount: аккаунты, файлы сохранений и загрузка профиля --- LeaderboardReadAccount PROC uses eax call BuildLeaderSavePath invoke CreateFileA, OFFSET leaderSavePath, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE jne leaderboard_file_opened cmp appDataReady, 1 jne leaderboard_read_done invoke CreateFileA, leaderAccountPtr, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je leaderboard_read_done leaderboard_file_opened: mov saveHandle, eax invoke ReadFile, saveHandle, ADDR saveBuffer, SAVE_FILE_SIZE, ADDR charsRead, 0 invoke CloseHandle, saveHandle cmp charsRead, 32 jb leaderboard_read_done mov eax, DWORD PTR [saveBuffer] cmp eax, SAVE_MAGIC jne leaderboard_read_done cmp charsRead, SAVE_FILE_SIZE jb leaderboard_signature_ok mov edx, DWORD PTR [saveBuffer+SAVE_SIGN_SIZE] call CalcSaveSignature cmp eax, edx jne leaderboard_read_done leaderboard_signature_ok: inc leaderValidCount mov eax, DWORD PTR [saveBuffer+4] cmp eax, leaderBestBank jbe leaderboard_check_total_wins mov leaderBestBank, eax invoke CopyName, OFFSET leaderBestBankName, leaderAccountPtr leaderboard_check_total_wins: mov eax, DWORD PTR [saveBuffer+12] cmp eax, leaderBestWins jbe leaderboard_check_total_losses mov leaderBestWins, eax invoke CopyName, OFFSET leaderBestWinsName, leaderAccountPtr leaderboard_check_total_losses: mov eax, DWORD PTR [saveBuffer+16] cmp eax, leaderBestLosses jbe leaderboard_check_games mov leaderBestLosses, eax invoke CopyName, OFFSET leaderBestLossName, leaderAccountPtr leaderboard_check_games: cmp charsRead, 236 jb leaderboard_read_done mov rowIndex, 0 leaderboard_game_loop: cmp rowIndex, 11 jae leaderboard_read_done call LeaderboardUpdateGame inc rowIndex jmp leaderboard_game_loop leaderboard_read_done: ret LeaderboardReadAccount ENDP ; --- BuildLeaderboards: статистика, достижения и таблицы лидеров --- BuildLeaderboards PROC uses eax call ClearLeaderboards call CollectAccounts mov leaderScanIndex, 0 leaderboard_account_loop: mov eax, leaderScanIndex cmp eax, accountCount jae leaderboard_build_done shl eax, 6 add eax, OFFSET accountList mov leaderAccountPtr, eax call LeaderboardReadAccount inc leaderScanIndex jmp leaderboard_account_loop leaderboard_build_done: ret BuildLeaderboards ENDP ; --- PrintLeaderPair: вывод текста, цветов, картинок и элементов интерфейса --- PrintLeaderPair PROC uses eax, pName:DWORD, value:DWORD mov eax, value cmp eax, 0 jne print_leader_pair_value invoke PrintStr, OFFSET leaderDashText ret print_leader_pair_value: invoke PrintStr, pName invoke PrintStr, OFFSET leaderOpenText invoke PrintUInt, value invoke PrintStr, OFFSET leaderCloseText ret PrintLeaderPair ENDP ; --- PrintLeaderGameLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintLeaderGameLine PROC uses eax ebx edx mov eax, rowIndex invoke PrintStr, statsGameNames[eax*4] invoke PrintStr, OFFSET leaderGameWinText mov ebx, rowIndex mov edx, ebx shl edx, 6 add edx, OFFSET leaderBestGameWinNames invoke PrintLeaderPair, edx, leaderBestGameWins[ebx*4] invoke PrintStr, OFFSET leaderGameLossText mov ebx, rowIndex mov edx, ebx shl edx, 6 add edx, OFFSET leaderBestGameLossNames invoke PrintLeaderPair, edx, leaderBestGameLosses[ebx*4] invoke PrintStr, OFFSET nl ret PrintLeaderGameLine ENDP ; --- PrintLeaderboards: вывод текста, цветов, картинок и элементов интерфейса --- PrintLeaderboards PROC call BuildLeaderboards invoke PrintTitleColor, OFFSET leaderTitle cmp leaderValidCount, 0 jne print_leaders_have_data invoke PrintStr, OFFSET leaderNoDataText ret print_leaders_have_data: invoke PrintStr, OFFSET leaderBankText invoke PrintStr, OFFSET leaderBestBankName invoke PrintStr, OFFSET leaderOpenText invoke PrintStr, OFFSET leaderMoneyPrefix invoke PrintUInt, leaderBestBank invoke PrintStr, OFFSET leaderCloseText invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET leaderWinsText invoke PrintLeaderPair, OFFSET leaderBestWinsName, leaderBestWins invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET leaderLossText invoke PrintLeaderPair, OFFSET leaderBestLossName, leaderBestLosses invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET leaderGameTitle mov rowIndex, 0 leader_print_game_loop: cmp rowIndex, 11 jae leader_print_done call PrintLeaderGameLine inc rowIndex jmp leader_print_game_loop leader_print_done: ret PrintLeaderboards ENDP ; --- PrintGameStatLine: вывод текста, цветов, картинок и элементов интерфейса --- PrintGameStatLine PROC uses eax ebx mov eax, rowIndex invoke PrintStr, statsGameNames[eax * 4] invoke PrintStr, OFFSET statsLinePlayed mov ebx, rowIndex invoke PrintUInt, gameStatsPlayed[ebx * 4] invoke PrintStr, OFFSET statsLineWins mov ebx, rowIndex invoke PrintUInt, gameStatsWon[ebx * 4] invoke PrintStr, OFFSET statsLineLoss mov ebx, rowIndex invoke PrintUInt, gameStatsLost[ebx * 4] invoke PrintStr, OFFSET statsLineDraw mov ebx, rowIndex invoke PrintUInt, gameStatsDraw[ebx * 4] invoke PrintStr, OFFSET nl ret PrintGameStatLine ENDP ; --- GameStatsByGame: статистика, достижения и таблицы лидеров --- GameStatsByGame PROC call ClearView invoke PrintTitleColor, OFFSET statsByGameTitle invoke PrintStr, OFFSET leaderCurrentTitle mov rowIndex, 0 stats_by_game_loop: cmp rowIndex, 11 jae stats_by_game_done call PrintGameStatLine inc rowIndex jmp stats_by_game_loop stats_by_game_done: call PrintLeaderboards call PauseConsole ret GameStatsByGame ENDP ; --- SkillCheckFlushKeys: Skill Check на крюке: шкала, попадания и промахи --- SkillCheckFlushKeys PROC invoke GetAsyncKeyState, VK_SPACE invoke GetAsyncKeyState, VK_RETURN invoke Sleep, 80 invoke GetAsyncKeyState, VK_SPACE invoke GetAsyncKeyState, VK_RETURN ret SkillCheckFlushKeys ENDP ; --- SkillCheckPollKey: Skill Check на крюке: шкала, попадания и промахи --- SkillCheckPollKey PROC invoke GetAsyncKeyState, VK_SPACE test ax, 0001h jne skill_key_pressed invoke GetAsyncKeyState, VK_RETURN test ax, 0001h jne skill_key_pressed xor eax, eax ret skill_key_pressed: mov eax, 1 ret SkillCheckPollKey ENDP ; --- SkillCheckDraw: Skill Check на крюке: шкала, попадания и промахи --- SkillCheckDraw PROC uses eax ebx edx call ClearView invoke PrintTitleColor, OFFSET skillTitle invoke PrintStr, OFFSET skillIntro invoke PrintStr, OFFSET skillStateText mov eax, skillMisses cmp eax, 0 je skill_draw_state_good cmp eax, 1 je skill_draw_state_warn invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET skillStateBad call ResetColor jmp skill_draw_state_done skill_draw_state_good: invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET skillStateGood call ResetColor jmp skill_draw_state_done skill_draw_state_warn: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET skillStateWarn call ResetColor skill_draw_state_done: invoke PrintStr, OFFSET skillProgressText invoke PrintUInt, skillHits invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET skillMissText invoke PrintUInt, skillMisses invoke PrintStr, OFFSET nl invoke PrintStr, OFFSET skillGaugeHint invoke PrintStr, OFFSET skillGaugeLeft mov skillGaugeIndex, 0 skill_draw_gauge_loop: mov eax, skillGaugeIndex cmp eax, 45 jae skill_draw_gauge_done cmp eax, skillNeedle je skill_draw_needle cmp eax, skillPerfectPos je skill_draw_perfect cmp eax, skillSuccessStart jb skill_draw_empty cmp eax, skillSuccessEnd ja skill_draw_empty invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET skillGaugeSuccess call ResetColor jmp skill_draw_next skill_draw_perfect: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET skillGaugePerfect call ResetColor jmp skill_draw_next skill_draw_needle: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET skillGaugeNeedle call ResetColor jmp skill_draw_next skill_draw_empty: invoke PrintStr, OFFSET skillGaugeEmpty skill_draw_next: inc skillGaugeIndex jmp skill_draw_gauge_loop skill_draw_gauge_done: invoke PrintStr, OFFSET skillGaugeRight invoke PrintStr, OFFSET skillGaugeLeft mov skillGaugeIndex, 0 skill_draw_gauge_loop2: mov eax, skillGaugeIndex cmp eax, 45 jae skill_draw_gauge_done2 cmp eax, skillNeedle je skill_draw_needle2 cmp eax, skillPerfectPos je skill_draw_perfect2 cmp eax, skillSuccessStart jb skill_draw_empty2 cmp eax, skillSuccessEnd ja skill_draw_empty2 invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET skillGaugeSuccess call ResetColor jmp skill_draw_next2 skill_draw_perfect2: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET skillGaugePerfect call ResetColor jmp skill_draw_next2 skill_draw_needle2: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET skillGaugeNeedle call ResetColor jmp skill_draw_next2 skill_draw_empty2: invoke PrintStr, OFFSET skillGaugeEmpty skill_draw_next2: inc skillGaugeIndex jmp skill_draw_gauge_loop2 skill_draw_gauge_done2: invoke PrintStr, OFFSET skillGaugeRight invoke PrintStr, OFFSET skillGaugeLeft mov skillGaugeIndex, 0 skill_draw_gauge_loop3: mov eax, skillGaugeIndex cmp eax, 45 jae skill_draw_gauge_done3 cmp eax, skillNeedle je skill_draw_needle3 cmp eax, skillPerfectPos je skill_draw_perfect3 cmp eax, skillSuccessStart jb skill_draw_empty3 cmp eax, skillSuccessEnd ja skill_draw_empty3 invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET skillGaugeSuccess call ResetColor jmp skill_draw_next3 skill_draw_perfect3: invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET skillGaugePerfect call ResetColor jmp skill_draw_next3 skill_draw_needle3: invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET skillGaugeNeedle call ResetColor jmp skill_draw_next3 skill_draw_empty3: invoke PrintStr, OFFSET skillGaugeEmpty skill_draw_next3: inc skillGaugeIndex jmp skill_draw_gauge_loop3 skill_draw_gauge_done3: invoke PrintStr, OFFSET skillGaugeRight ret SkillCheckDraw ENDP ; --- SkillCheckMoveNeedle: Skill Check на крюке: шкала, попадания и промахи --- SkillCheckMoveNeedle PROC uses eax mov eax, skillDir cmp eax, 0FFFFFFFFh je skill_move_left skill_move_right: mov eax, skillNeedle inc eax cmp eax, 44 jbe skill_move_store_right mov eax, 43 mov skillDir, 0FFFFFFFFh skill_move_store_right: mov skillNeedle, eax ret skill_move_left: mov eax, skillNeedle cmp eax, 0 ja skill_move_dec mov eax, 1 mov skillDir, 1 mov skillNeedle, eax ret skill_move_dec: dec eax mov skillNeedle, eax ret SkillCheckMoveNeedle ENDP ; --- SkillCheckEvaluate: Skill Check на крюке: шкала, попадания и промахи --- SkillCheckEvaluate PROC uses eax mov eax, skillNeedle cmp eax, skillPerfectPos je skill_eval_perfect cmp eax, skillSuccessStart jb skill_eval_fail cmp eax, skillSuccessEnd ja skill_eval_fail mov skillResult, 1 ret skill_eval_perfect: mov skillResult, 2 ret skill_eval_fail: mov skillResult, 0 ret SkillCheckEvaluate ENDP ; --- SkillCheckRound: Skill Check на крюке: шкала, попадания и промахи --- SkillCheckRound PROC uses eax ebx invoke RandomRange, 27 add eax, 8 mov skillSuccessStart, eax mov ebx, eax add ebx, 7 mov skillSuccessEnd, ebx invoke RandomRange, 6 add eax, skillSuccessStart inc eax mov skillPerfectPos, eax invoke RandomRange, 45 mov skillNeedle, eax invoke RandomRange, 2 cmp eax, 0 je skill_round_left mov skillDir, 1 jmp skill_round_begin skill_round_left: mov skillDir, 0FFFFFFFFh skill_round_begin: mov skillFrameCount, 0 mov skillResult, 0 mov eax, skillHits mov ebx, eax shl ebx, 2 add eax, ebx mov ebx, 45 sub ebx, eax mov eax, stressLevel shl eax, 2 sub ebx, eax cmp ebx, 18 jae skill_delay_ready mov ebx, 18 skill_delay_ready: mov skillDelay, ebx call SkillCheckFlushKeys skill_round_loop: call SkillCheckDraw mov eax, skillDelay invoke Sleep, eax call SkillCheckPollKey cmp eax, 1 je skill_round_pressed call SkillCheckMoveNeedle inc skillFrameCount cmp skillFrameCount, 120 jb skill_round_loop mov skillResult, 0 ret skill_round_pressed: call SkillCheckEvaluate ret SkillCheckRound ENDP ; --- GameSkillCheck: Skill Check на крюке: шкала, попадания и промахи --- GameSkillCheck PROC skill_game_start: call ClearView invoke PrintTitleColor, OFFSET skillTitle invoke PrintStr, OFFSET skillIntro call PromptBet call PlayDbDHookScene mov skillHits, 0 mov skillMisses, 0 mov skillPerfects, 0 skill_game_loop: call SkillCheckRound call SkillCheckDraw mov eax, skillResult cmp eax, 2 je skill_game_perfect cmp eax, 1 je skill_game_success skill_game_fail: inc skillMisses invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET skillFailText call ResetColor invoke Sleep, 850 cmp skillMisses, 3 jae skill_game_lost jmp skill_game_loop skill_game_success: inc skillHits invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET skillSuccessText call ResetColor invoke Sleep, 750 cmp skillHits, 5 jae skill_game_won jmp skill_game_loop skill_game_perfect: add skillHits, 2 inc skillPerfects invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET skillPerfectText call ResetColor invoke Sleep, 850 cmp skillHits, 5 jae skill_game_won jmp skill_game_loop skill_game_won: call StopDbDHookScene call SkillCheckDraw invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET skillEscapeText call ResetColor invoke PaySlotMultiplier, 2 invoke UnlockAchievement, 20000h, OFFSET achSkillCheckName call SaveGame jmp skill_game_again skill_game_lost: call StopDbDHookScene call SkillCheckDraw invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET skillDarkText call ResetColor call PayLose call SaveGame skill_game_again: cmp tournamentMode, 1 je skill_game_exit invoke PrintStr, OFFSET againText call ReadKey cmp al, 'y' je skill_game_start cmp al, 'Y' je skill_game_start skill_game_exit: ret GameSkillCheck ENDP ; --- GameAchievements: статистика, достижения и таблицы лидеров --- GameAchievements PROC call ClearView invoke PrintTitleColor, OFFSET achMenuTitle invoke PrintAchievementLine, 1, OFFSET achFirstWinName invoke PrintAchievementLine, 2, OFFSET achFirstLossName invoke PrintAchievementLine, 4, OFFSET achJackpotName invoke PrintAchievementLine, 8, OFFSET achHighRollerName invoke PrintAchievementLine, 10h, OFFSET achShopperName invoke PrintAchievementLine, 20h, OFFSET achCharmName invoke PrintAchievementLine, 40h, OFFSET achGoalName invoke PrintAchievementLine, 80h, OFFSET achCloverPitName invoke PrintAchievementLine, 100h, OFFSET achClassicSlotName invoke PrintAchievementLine, 200h, OFFSET achPokerRaiseName invoke PrintAchievementLine, 400h, OFFSET achPokerBluffName invoke PrintAchievementLine, 800h, OFFSET achRouletteWinName invoke PrintAchievementLine, 1000h, OFFSET achRussianWinName invoke PrintAchievementLine, 2000h, OFFSET achDurakWinName invoke PrintAchievementLine, 4000h, OFFSET achBackCollectorName invoke PrintAchievementLine, 8000h, OFFSET achCharmBuyerName invoke PrintAchievementLine, 10000h, OFFSET achObserverName invoke PrintAchievementLine, 20000h, OFFSET achSkillCheckName call PauseConsole ret GameAchievements ENDP ; --- GameTraining: служебный блок игровой логики --- GameTraining PROC call ClearView invoke PrintTitleColor, OFFSET trainingTitle invoke PrintStr, OFFSET trainingText call PauseConsole ret GameTraining ENDP ; --- ShowTournamentStage: турнир-башня и победная анимация финала --- ShowTournamentStage PROC call ClearView invoke PrintTitleColor, OFFSET tournamentTitle invoke PrintStr, OFFSET tournamentStageText invoke PrintUInt, tournamentStage invoke PrintStr, OFFSET nl invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET hellStageCurseText invoke RandomRange, 4 cmp eax, 0 je hell_stage_curse1 cmp eax, 1 je hell_stage_curse2 cmp eax, 2 je hell_stage_curse3 invoke PrintStr, OFFSET hellCurse4 jmp hell_stage_curse_done hell_stage_curse1: invoke PrintStr, OFFSET hellCurse1 jmp hell_stage_curse_done hell_stage_curse2: invoke PrintStr, OFFSET hellCurse2 jmp hell_stage_curse_done hell_stage_curse3: invoke PrintStr, OFFSET hellCurse3 hell_stage_curse_done: call ResetColor invoke PrintStr, OFFSET tournamentMusicHint call ReadKey cmp al, 'm' je tower_stage_change_music cmp al, 'M' jne tower_stage_done tower_stage_change_music: call PlayTowerRandomMusic tower_stage_done: ret ShowTournamentStage ENDP ; --- AnimateTournamentVictory: банк, ставки, стресс, подозрение и экономика казино --- AnimateTournamentVictory PROC call PlayVictorySound call ClearView invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET tournamentFire1 call ResetColor invoke Sleep, 360 call ClearView invoke SetColor, COLOR_TITLE invoke PrintStr, OFFSET tournamentFire2 call ResetColor invoke Sleep, 360 call ClearView invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET tournamentFire3 call ResetColor invoke Sleep, 420 call ClearView invoke SetColor, COLOR_WARN invoke PrintStr, OFFSET tournamentFire4 call ResetColor invoke Sleep, 520 ret AnimateTournamentVictory ENDP ; --- GameTournament: турнир-башня и победная анимация финала --- GameTournament PROC mov tournamentMode, 1 call ClearView invoke PrintTitleColor, OFFSET tournamentTitle invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET secretHellText call ResetColor invoke PrintStr, OFFSET tournamentIntro call PauseConsole call PlayTowerRandomMusic ; tower start mov tournamentStage, 1 call ShowTournamentStage mov currentGameId, 6 mov lastGameResult, 0 call GameCoin cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 2 call ShowTournamentStage mov currentGameId, 7 mov lastGameResult, 0 call GameDice cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 3 call ShowTournamentStage mov currentGameId, 5 mov lastGameResult, 0 call GameSkulls cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 4 call ShowTournamentStage mov currentGameId, 1 mov lastGameResult, 0 call Game21 cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 5 call ShowTournamentStage mov currentGameId, 2 mov lastGameResult, 0 call GamePoker cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 6 call ShowTournamentStage mov currentGameId, 4 mov lastGameResult, 0 call GameRoulette cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 7 call ShowTournamentStage mov currentGameId, 8 mov lastGameResult, 0 call GameCasinoRoulette cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 8 call ShowTournamentStage mov currentGameId, 10 mov lastGameResult, 0 call GameDurak cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 9 call ShowTournamentStage mov currentGameId, 11 mov lastGameResult, 0 call GameSkillCheck cmp lastGameResult, 2 je tournament_failed mov tournamentStage, 10 call ShowTournamentStage mov currentGameId, 0 mov lastGameResult, 0 call GameBuckshot cmp lastGameResult, 2 je tournament_failed call StopTowerMusic ; before tower victory call AnimateTournamentVictory invoke SetColor, COLOR_MONEY invoke PrintStr, OFFSET tournamentWinText call ResetColor mov currentBet, 66600 call PayWin call SaveGame mov tournamentMode, 0 call PauseConsole ret tournament_failed: call StopTowerMusic ; tower failed invoke SetColor, COLOR_BAD invoke PrintStr, OFFSET tournamentFailText call ResetColor mov tournamentMode, 0 call PauseConsole ret GameTournament ENDP ; --- GameUmamusume: Umamusume Pretty Derby Minigame --- GameUmamusume PROC uses ebx esi edi invoke PrintStr, OFFSET umaTitleText call PromptBet cmp eax, 0 jle uma_exit uma_select_horse: invoke PrintStr, OFFSET umaMenuText invoke PrintStr, OFFSET umaChoiceText call ReadBetInput cmp eax, 1 jl uma_invalid cmp eax, 5 jg uma_invalid mov umaChoice, eax jmp uma_start_race uma_invalid: invoke PrintStr, OFFSET badChoiceText jmp uma_select_horse uma_start_race: xor eax, eax mov umaPos[0], eax mov umaPos[4], eax mov umaPos[8], eax mov umaPos[12], eax mov umaPos[16], eax mov umaWinner, 0 uma_race_loop: invoke PrintStr, OFFSET clearLines invoke PrintStr, OFFSET umaTrackHeader ; Horse 1: Special Week (1-3) invoke RandomRange, 3 inc eax add umaPos[0], eax ; Horse 2: Silence Suzuka (1-4) invoke RandomRange, 4 inc eax add umaPos[4], eax ; Horse 3: Tokai Teio (1-3, boost if pos > 18) invoke RandomRange, 3 inc eax cmp umaPos[8], 18 jbe uma_t3_no_boost add eax, 2 uma_t3_no_boost: add umaPos[8], eax ; Horse 4: Gold Ship (0-6 wildcard) invoke RandomRange, 7 add umaPos[12], eax ; Horse 5: Mejiro McQueen (steady 2-4) invoke RandomRange, 3 add eax, 2 add umaPos[16], eax ; Render track mov ecx, 0 uma_render_lane: push ecx mov eax, [umaHorseNames + ecx*4] invoke PrintStr, eax mov ebx, [umaPos + ecx*4] cmp ebx, 0 jbe uma_render_head mov edi, ebx uma_print_step: push edi invoke PrintStr, OFFSET umaStepChar pop edi dec edi jnz uma_print_step uma_render_head: invoke PrintStr, OFFSET umaHeadChar invoke PrintStr, OFFSET umaFinishText pop ecx inc ecx cmp ecx, 5 jl uma_render_lane ; Check if finish reached (>= 35) mov eax, 0 uma_check_finish: cmp dword ptr [umaPos + eax*4], 35 jge uma_finish_reached inc eax cmp eax, 5 jl uma_check_finish invoke Sleep, 180 jmp uma_race_loop uma_finish_reached: mov ebx, 0 mov edi, 1 mov ecx, 0 uma_find_max: mov edx, [umaPos + ecx*4] cmp edx, ebx jle uma_next_max mov ebx, edx lea edi, [ecx + 1] uma_next_max: inc ecx cmp ecx, 5 jl uma_find_max mov umaWinner, edi invoke PrintStr, OFFSET umaWinAnnouncement mov eax, edi dec eax mov eax, [umaHorseNames + eax*4] invoke PrintStr, eax invoke PrintStr, OFFSET nl mov eax, umaChoice cmp eax, umaWinner jne uma_race_lost invoke PrintStr, OFFSET umaYouWinText mov ecx, umaChoice dec ecx mov eax, currentBet mov edx, [umaMultipliers + ecx*4] imul eax, edx push eax invoke PrintUInt, eax invoke PrintStr, OFFSET nl pop eax call PayWin call PrintWinEvent jmp uma_race_done uma_race_lost: invoke PrintStr, OFFSET umaYouLoseText call PayLose call PrintLoseEvent uma_race_done: call PauseConsole uma_exit: ret GameUmamusume ENDP ; --- GamePlayerTerminal: Игровой терминал (статистика, ачивки, квесты) --- titleTerminal db "=== ТЕРМИНАЛ ИГРОКА ===",13,10,0 textTerminalMenu db "1. Достижения",13,10,"2. Статистика по играм",13,10,"3. Ежедневные задания",13,10,"4. Главное меню и читы",13,10,"0. Назад в казино",13,10,0 GamePlayerTerminal PROC terminal_loop: call ClearView invoke PrintTitleColor, OFFSET titleTerminal invoke PrintStr, OFFSET textTerminalMenu invoke PrintStr, OFFSET choiceText call ReadKey cmp al, '1' je term_ach cmp al, '2' je term_stats cmp al, '3' je term_daily cmp al, '4' je term_classic_menu cmp al, '0' je term_exit cmp al, 1Bh je term_exit jmp terminal_loop term_ach: call GameAchievements jmp terminal_loop term_stats: call GameStatsByGame jmp terminal_loop term_daily: call GameDailyTasks jmp terminal_loop term_classic_menu: call MainMenu jmp terminal_loop term_exit: ret GamePlayerTerminal ENDP include casino3d.inc ; --- AutoLoadAccountFast: автозагрузка профиля без блокировки в CMD --- AutoLoadAccountFast PROC call ResetProfileDefaults call CollectAccounts cmp accountCount, 0 jbe autoload_exit mov selectedAccount, 1 call CopySelectedAccountName call LoadSave autoload_exit: ret AutoLoadAccountFast ENDP ; --- MainMenu: точка входа, главное меню и маршрутизация по играм --- MainMenu PROC menu_loop: call DailyCheckDate call CheckSecretEnding invoke PrintStr, OFFSET clearLines invoke PrintTitleColor, OFFSET titleText call PrintBank call PrintGoal call ShowStats invoke PrintStr, OFFSET menuText invoke PrintStr, OFFSET choiceText call ReadBetInput cmp eax, 0FFFFFFFFh je menu_loop cmp eax, 0FFFFFFFDh je menu_loop cmp eax, 1 je run_shop cmp eax, 2 je run_21 cmp eax, 3 je run_poker cmp eax, 4 je run_slot cmp eax, 5 je run_skulls cmp eax, 6 je run_roulette cmp eax, 7 je run_coin cmp eax, 8 je run_dice cmp eax, 9 je run_casino_roulette cmp eax, 10 je run_classic_slot cmp eax, 11 je run_durak cmp eax, 12 je run_skill_check cmp eax, 13 je run_buckshot cmp eax, 14 je run_observer cmp eax, 15 je run_training cmp eax, 16 je run_achievements cmp eax, 17 je run_stats_by_game cmp eax, 18 je run_daily cmp eax, 19 je run_settings cmp eax, 20 je run_online_dice cmp eax, 21 je run_umamusume cmp eax, 25 je run_casino_3d cmp eax, 666 je run_hell_tower cmp eax, 0 je exit_menu invoke PrintStr, OFFSET badChoiceText call PauseConsole jmp menu_loop run_21: mov currentGameId, 1 call Game21 jmp menu_loop run_poker: mov currentGameId, 2 call GamePoker jmp menu_loop run_slot: mov currentGameId, 3 call PlaySlotIntroSound call GameSlot jmp menu_loop run_skulls: mov currentGameId, 5 call GameSkulls jmp menu_loop run_coin: mov currentGameId, 6 call GameCoin jmp menu_loop run_dice: mov currentGameId, 7 call GameDice jmp menu_loop run_roulette: mov currentGameId, 4 call GameRoulette jmp menu_loop run_casino_roulette: mov currentGameId, 8 call GameCasinoRoulette jmp menu_loop run_classic_slot: mov currentGameId, 9 call PlaySlotIntroSound call GameClassicSlot jmp menu_loop run_durak: mov currentGameId, 10 call GameDurak jmp menu_loop run_training: mov currentGameId, 0 call GameTraining jmp menu_loop run_observer: mov currentGameId, 0 call GameObserver jmp menu_loop run_shop: mov currentGameId, 0 call GameShop jmp menu_loop run_achievements: mov currentGameId, 0 call GameAchievements jmp menu_loop run_stats_by_game: mov currentGameId, 0 call GameStatsByGame jmp menu_loop run_daily: mov currentGameId, 0 call GameDailyTasks jmp menu_loop run_settings: mov currentGameId, 0 call GameSettings jmp menu_loop run_online_dice: mov currentGameId, 0 call GameOnlineCasino jmp menu_loop run_umamusume: mov currentGameId, 0 call GameUmamusume jmp menu_loop run_casino_3d: call StartCasino3D jmp menu_loop run_hell_tower: mov currentGameId, 0 call GameTournament jmp menu_loop run_skill_check: mov tournamentMode, 0 mov currentGameId, 11 call GameSkillCheck jmp menu_loop run_buckshot: mov currentGameId, 0 call GameBuckshot jmp menu_loop exit_menu: ret MainMenu ENDP ; --- main: точка входа, главное меню и маршрутизация по играм --- main PROC call InitPaths3D invoke CreateMutexA, 0, 1, OFFSET mutexName3D mov mutex3D, eax invoke GetLastError cmp eax, 183 jne main_graphical invoke FindWindowA, OFFSET sz3DClassName, 0 test eax, eax jz main_exit push eax invoke ShowWindow, eax, 9 pop eax invoke SetForegroundWindow, eax jmp main_exit main_graphical: call LoadProgress3D call StartCasino3D main_exit: cmp mutex3D, 0 je @F invoke CloseHandle, mutex3D @@: invoke ExitProcess, 0 main ENDP END main