diff --git a/build/graphics/casino3d.inc b/build/graphics/casino3d.inc index 7a2a563..2165e88 100644 --- a/build/graphics/casino3d.inc +++ b/build/graphics/casino3d.inc @@ -167,17 +167,46 @@ dancerLuckBuff dd 0 flashTimer dd 0 flashMessage db 128 dup(0) -promptDancer db "[E] CABARET - TIP $100",0 -promptSlot1 db "[E] SLOTS 777",0 -promptSlot2 db "[E] SLOTS 777",0 -promptBlackjack db "[E] BLACKJACK / 21",0 -promptPoker db "POKER - UNDER CONSTRUCTION",0 -promptRoulette db "[E] ROULETTE",0 -promptShop db "[E] BOUTIQUE",0 -promptATM db "[E] CASHIER",0 -promptBackroom db "BACKROOM - UNDER CONSTRUCTION",0 -promptDurak db "DURAK - UNDER CONSTRUCTION",0 -promptHell db "TOWER - UNDER CONSTRUCTION",0 +promptDancer db "[E] ÊÀÁÀÐÅ - ×ÀÅÂÛÅ $100",0 +promptBlackjack db "[E] ÁËÝÊÄÆÅÊ (21)",0 +promptPoker db "[E] ÏÎÊÅÐ (TEXAS HOLD'EM)",0 +promptDurak db "[E] ÊÀÐÒÛ: ÏÎÄÊÈÄÍÎÉ ÄÓÐÀÊ",0 +promptCasinoRoulette db "[E] ÅÂÐÎÏÅÉÑÊÀß ÐÓËÅÒÊÀ",0 +promptClassicSlot db "[E] ÊËÀÑÑÈ×ÅÑÊÈÅ ÑËÎÒÛ 777",0 +promptCloverSlot db "[E] ÑËÎÒÛ CLOVERPIT (5x3)",0 +promptDice db "[E] ÈÃÐÀ  ÊÎÑÒÈ (CRAPS)",0 +promptSkulls db "[E] ÍÀϨÐÑÒÊÈ (×ÅÐÅÏÀ)",0 +promptCoin db "[E] ÌÎÍÅÒÊÀ (ÎШË/ÐÅØÊÀ)",0 +promptSkillCheck db "[E] ÒÐÅÍÈÐÎÂÊÀ ÐÅÀÊÖÈÈ",0 +promptBuckshot db "[E] BUCKSHOT ROULETTE",0 +promptRussianRoulette db "[E] ÐÓÑÑÊÀß ÐÓËÅÒÊÀ (VIP)",0 +promptOnlineRR db "[E] ÑÅÒÅÂÀß ÐÓËÅÒÊÀ (NET)",0 +promptUmamusume db "[E] ÑÊÀ×ÊÈ ÓÌÀÌÓÑÓÌÝ",0 +promptHellTower db "[E] ÁÀØÍß ÀÄÀ (10 ÝÒÀÆÅÉ)",0 +promptShop db "[E] ÁÓÒÈÊ È ÒÀËÈÑÌÀÍÛ",0 +promptATM db "[E] ÁÀÍÊÎÌÀÒ È ÁÀËÀÍÑ",0 +promptPlayerTerminal db "[E] ÒÅÐÌÈÍÀË: ÑÒÀÒÛ È À×ÈÂÊÈ",0 +promptObserver db "[E] ÐÅÆÈÌ ÍÀÁËÞÄÀÒÅËß (ÈÈ)",0 + +szTitleBlackjack db "[KAZIK 3D CASINO] - ÁËÝÊÄÆÅÊ (21)",0 +szTitlePoker db "[KAZIK 3D CASINO] - ÏÎÊÅÐ (TEXAS HOLD'EM)",0 +szTitleDurak db "[KAZIK 3D CASINO] - ÏÎÄÊÈÄÍÎÉ ÄÓÐÀÊ",0 +szTitleCasinoRoulette db "[KAZIK 3D CASINO] - ÅÂÐÎÏÅÉÑÊÀß ÐÓËÅÒÊÀ",0 +szTitleClassicSlot db "[KAZIK 3D CASINO] - ÊËÀÑÑÈ×ÅÑÊÈÅ ÑËÎÒÛ 777",0 +szTitleCloverSlot db "[KAZIK 3D CASINO] - ÑËÎÒ-ÌÀØÈÍÀ CLOVERPIT (5x3)",0 +szTitleDice db "[KAZIK 3D CASINO] - ÈÃÐÀ  ÊÎÑÒÈ (CRAPS)",0 +szTitleSkulls db "[KAZIK 3D CASINO] - ÍÀϨÐÑÒÊÈ",0 +szTitleCoin db "[KAZIK 3D CASINO] - ÌÎÍÅÒÊÀ (ÎШË/ÐÅØÊÀ)",0 +szTitleSkillCheck db "[KAZIK 3D CASINO] - ÏÐÎÂÅÐÊÀ ÐÅÀÊÖÈÈ",0 +szTitleBuckshot db "[KAZIK 3D CASINO] - BUCKSHOT ROULETTE",0 +szTitleRussianRoulette db "[KAZIK 3D CASINO] - ÐÓÑÑÊÀß ÐÓËÅÒÊÀ",0 +szTitleOnlineRR db "[KAZIK 3D CASINO] - ÑÅÒÅÂÀß ÐÓÑÑÊÀß ÐÓËÅÒÊÀ",0 +szTitleUmamusume db "[KAZIK 3D CASINO] - ÑÊÀ×ÊÈ ÓÌÀÌÓÑÓÌÝ",0 +szTitleHellTower db "[KAZIK 3D CASINO] - ÁÀØÍß ÀÄÀ (ÒÓÐÍÈÐ)",0 +szTitleShop db "[KAZIK 3D CASINO] - ÁÓÒÈÊ È ÒÀËÈÑÌÀÍÛ",0 +szTitleATM db "[KAZIK 3D CASINO] - ÁÀÍÊÎÌÀÒ",0 +szTitleTerminal db "[KAZIK 3D CASINO] - ÒÅÐÌÈÍÀË ÈÃÐÎÊÀ",0 +szTitleObserver db "[KAZIK 3D CASINO] - ÐÅÆÈÌ ÍÀÁËÞÄÀÒÅËß (ÈÈ)",0 msgDancerTipped db "Âû áðîñèëè $100 òàíöîâùèöå! ÓÄÀ×À ÀÊÒÈÂÈÐÎÂÀÍÀ!",0 msgNeedMoney db "Íåäîñòàòî÷íî äåíåã â êîøåëüêå!",0 @@ -186,7 +215,29 @@ targetHUDFormat db " luckHUDFormat db " ÓÄÀ×À: +",0 controlsHUD db "WASD/Ñòðåëêè: Õîäüáà | E: Äåéñòâèå | ESC: Ìåíþ",0 -NUM_SPRITES equ 13 +NUM_SPRITES equ 22 + +INTERACT_NONE equ 0 +INTERACT_BLACKJACK equ 1 +INTERACT_POKER equ 2 +INTERACT_SLOTS_777 equ 3 +INTERACT_ROULETTE equ 4 +INTERACT_SKULLS equ 5 +INTERACT_SHOP equ 6 +INTERACT_ATM equ 7 +INTERACT_DANCER equ 8 +INTERACT_HELL_TOWER equ 9 +INTERACT_DURAK equ 10 +INTERACT_BUCKSHOT equ 11 +INTERACT_COIN equ 12 +INTERACT_DICE equ 13 +INTERACT_SLOTS_CLOVER equ 14 +INTERACT_UMAMUSUME equ 15 +INTERACT_OBSERVER equ 16 +INTERACT_TERMINAL equ 17 +INTERACT_ONLINE_RR equ 18 +INTERACT_RUSSIAN_ROULETTE equ 19 +INTERACT_SKILL_CHECK equ 20 ALIGN 4 casinoSprites SpriteObject NUM_SPRITES dup(<>) sortedSprites dd NUM_SPRITES dup(0) @@ -2633,18 +2684,104 @@ interaction_done: ret CheckInteractions ENDP +; --- LaunchClassicGame: Îòêðûòèå îòäåëüíîãî îêíà äëÿ êëàññè÷åñêîé âåðñèè èãðû --- +LaunchClassicGame PROC uses ebx esi edi, pGameProc:DWORD, gameId:DWORD, pTitle:DWORD + LOCAL rc3D[16]:BYTE + LOCAL conWnd:DWORD + LOCAL conW:DWORD, conH:DWORD, conX:DWORD, conY:DWORD + + mov eax, gameId + mov currentGameId, eax + + invoke AllocConsole + test eax, eax + jz launch_ret + + invoke GetStdHandle, STD_OUTPUT_HANDLE + mov hOut, eax + invoke GetStdHandle, STD_INPUT_HANDLE + mov hIn, eax + + invoke SetConsoleCP, 1251 + invoke SetConsoleOutputCP, 1251 + + cmp pTitle, 0 + je @F + invoke SetConsoleTitleA, pTitle +@@: + call EnableAnsi + call ConfigureConsoleSize + + invoke GetConsoleWindow + mov conWnd, eax + test eax, eax + jz run_game_body + + cmp h3DWnd, 0 + je show_con_fallback + + lea eax, rc3D + invoke GetWindowRect, h3DWnd, eax + mov eax, dword ptr rc3D[0] + add eax, 40 + mov conX, eax + mov eax, dword ptr rc3D[4] + add eax, 40 + mov conY, eax + mov conW, 960 + mov conH, 680 + invoke SetWindowPos, conWnd, 0, conX, conY, conW, conH, 40h ; SWP_SHOWWINDOW + jmp set_con_focus + +show_con_fallback: + invoke ShowWindow, conWnd, 5 ; SW_SHOW +set_con_focus: + invoke SetForegroundWindow, conWnd + invoke SetFocus, conWnd + +run_game_body: + call pGameProc + + invoke FreeConsole + mov hOut, 0 + mov hIn, 0 + + cmp h3DWnd, 0 + je cleanup_game_input + invoke SetForegroundWindow, h3DWnd + invoke SetFocus, h3DWnd + +cleanup_game_input: + mov ecx, 256 + xor eax, eax + lea edi, keys3D + rep stosb + mov ecx, 256 + lea edi, pressedKeys3D + rep stosb + + invoke GetTickCount + mov previousTick3D, eax + mov frameStart3D, eax + mov deltaTime3D, 0 + + call SaveProgress3D + +launch_ret: + ret +LaunchClassicGame ENDP + Trigger3DInteraction PROC mov eax, interactTargetId test eax, eax - jz @F + jz trigger_done - cmp eax, 8 ; DANCER - jne check_target_slots + cmp eax, INTERACT_DANCER + jne check_target_bj cmp bankroll, 100 jl dancer_no_cash sub bankroll, 100 inc dancerLuckBuff - ; Tips are cosmetic and must not silently change game odds. invoke CopyString3D, OFFSET textTips3D, OFFSET flashMessage mov flashTimer, 100 invoke PlaySoundA, OFFSET soundJackpot, 0, 1 @@ -2654,42 +2791,124 @@ dancer_no_cash: mov flashTimer, 60 ret -check_target_slots: - cmp eax, 3 ; SLOTS - jne check_target_bj - mov engineMode, MODE_SLOTS - invoke PlaySoundA, OFFSET soundClick, 0, 1 +check_target_bj: + cmp eax, INTERACT_BLACKJACK + jne check_target_poker + invoke LaunchClassicGame, OFFSET Game21, 1, OFFSET szTitleBlackjack ret -check_target_bj: - cmp eax, 1 ; BLACKJACK +check_target_poker: + cmp eax, INTERACT_POKER + jne check_target_durak + invoke LaunchClassicGame, OFFSET GamePoker, 2, OFFSET szTitlePoker + ret + +check_target_durak: + cmp eax, INTERACT_DURAK + jne check_target_slots777 + invoke LaunchClassicGame, OFFSET GameDurak, 10, OFFSET szTitleDurak + ret + +check_target_slots777: + cmp eax, INTERACT_SLOTS_777 + jne check_target_slots_clover + invoke LaunchClassicGame, OFFSET GameClassicSlot, 9, OFFSET szTitleClassicSlot + ret + +check_target_slots_clover: + cmp eax, INTERACT_SLOTS_CLOVER jne check_target_roulette - mov engineMode, MODE_BLACKJACK - mov bjState, 0 + invoke LaunchClassicGame, OFFSET GameSlot, 3, OFFSET szTitleCloverSlot ret check_target_roulette: - cmp eax, 4 ; ROULETTE + cmp eax, INTERACT_ROULETTE + jne check_target_dice + invoke LaunchClassicGame, OFFSET GameCasinoRoulette, 8, OFFSET szTitleCasinoRoulette + ret + +check_target_dice: + cmp eax, INTERACT_DICE + jne check_target_skulls + invoke LaunchClassicGame, OFFSET GameDice, 7, OFFSET szTitleDice + ret + +check_target_skulls: + cmp eax, INTERACT_SKULLS + jne check_target_coin + invoke LaunchClassicGame, OFFSET GameSkulls, 5, OFFSET szTitleSkulls + ret + +check_target_coin: + cmp eax, INTERACT_COIN + jne check_target_skill + invoke LaunchClassicGame, OFFSET GameCoin, 6, OFFSET szTitleCoin + ret + +check_target_skill: + cmp eax, INTERACT_SKILL_CHECK + jne check_target_buckshot + invoke LaunchClassicGame, OFFSET GameSkillCheck, 11, OFFSET szTitleSkillCheck + ret + +check_target_buckshot: + cmp eax, INTERACT_BUCKSHOT + jne check_target_rr + invoke LaunchClassicGame, OFFSET GameBuckshot, 13, OFFSET szTitleBuckshot + ret + +check_target_rr: + cmp eax, INTERACT_RUSSIAN_ROULETTE + jne check_target_online_rr + invoke LaunchClassicGame, OFFSET GameRoulette, 4, OFFSET szTitleRussianRoulette + ret + +check_target_online_rr: + cmp eax, INTERACT_ONLINE_RR + jne check_target_umamusume + invoke LaunchClassicGame, OFFSET GameOnlineCasino, 20, OFFSET szTitleOnlineRR + ret + +check_target_umamusume: + cmp eax, INTERACT_UMAMUSUME + jne check_target_hell + invoke LaunchClassicGame, OFFSET GameUmamusume, 21, OFFSET szTitleUmamusume + ret + +check_target_hell: + cmp eax, INTERACT_HELL_TOWER jne check_target_shop - mov engineMode, MODE_ROULETTE - mov roulState, 0 + invoke LaunchClassicGame, OFFSET GameTournament, 666, OFFSET szTitleHellTower ret check_target_shop: - cmp eax, 6 ; SHOP + cmp eax, INTERACT_SHOP jne check_target_atm - mov engineMode, MODE_SHOP + invoke LaunchClassicGame, OFFSET GameShop, 0, OFFSET szTitleShop ret check_target_atm: - cmp eax, 7 ; ATM - jne target_unported + cmp eax, INTERACT_ATM + jne check_target_terminal mov engineMode, MODE_ATM ret + +check_target_terminal: + cmp eax, INTERACT_TERMINAL + jne check_target_observer + invoke LaunchClassicGame, OFFSET GamePlayerTerminal, 0, OFFSET szTitleTerminal + ret + +check_target_observer: + cmp eax, INTERACT_OBSERVER + jne target_unported + invoke LaunchClassicGame, OFFSET GameObserver, 14, OFFSET szTitleObserver + ret + target_unported: invoke CopyString3D, OFFSET textUnavailable3D, OFFSET flashMessage mov flashTimer, 150 -@@: +trigger_done: ret Trigger3DInteraction ENDP @@ -2721,7 +2940,7 @@ init_sprites_table: mov casinoSprites[0*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[0*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[0*SIZEOF SpriteObject].animSpeed, 5 - mov casinoSprites[0*SIZEOF SpriteObject].interactId, 8 + mov casinoSprites[0*SIZEOF SpriteObject].interactId, INTERACT_DANCER mov casinoSprites[0*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer ; Sprite 1: VIP Dancer 2 (Center Stage Star) @@ -2732,7 +2951,7 @@ init_sprites_table: mov casinoSprites[1*SIZEOF SpriteObject].curFrame, 2 mov casinoSprites[1*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[1*SIZEOF SpriteObject].animSpeed, 5 - mov casinoSprites[1*SIZEOF SpriteObject].interactId, 8 + mov casinoSprites[1*SIZEOF SpriteObject].interactId, INTERACT_DANCER mov casinoSprites[1*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer ; Sprite 2: VIP Dancer 3 (Stage Right) @@ -2743,21 +2962,21 @@ init_sprites_table: mov casinoSprites[2*SIZEOF SpriteObject].curFrame, 1 mov casinoSprites[2*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[2*SIZEOF SpriteObject].animSpeed, 5 - mov casinoSprites[2*SIZEOF SpriteObject].interactId, 8 + mov casinoSprites[2*SIZEOF SpriteObject].interactId, INTERACT_DANCER mov casinoSprites[2*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer - ; Sprite 3: Blackjack Table with Dealer (Front Center Left) + ; Sprite 3: VIP Blackjack (Front Center Left) mov casinoSprites[3*SIZEOF SpriteObject].posX, (12 * FP_1 + FP_HALF) - mov casinoSprites[3*SIZEOF SpriteObject].posY, (10 * FP_1) + mov casinoSprites[3*SIZEOF SpriteObject].posY, (8 * FP_1) mov casinoSprites[3*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[3*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[3*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[3*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[3*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[3*SIZEOF SpriteObject].interactId, 1 + mov casinoSprites[3*SIZEOF SpriteObject].interactId, INTERACT_BLACKJACK mov casinoSprites[3*SIZEOF SpriteObject].promptPtr, OFFSET promptBlackjack - ; Sprite 4: Roulette Table (Front Center) + ; Sprite 4: European Roulette Table (Front Center) mov casinoSprites[4*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) mov casinoSprites[4*SIZEOF SpriteObject].posY, (10 * FP_1) mov casinoSprites[4*SIZEOF SpriteObject].baseTexId, 31 @@ -2765,96 +2984,195 @@ init_sprites_table: mov casinoSprites[4*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[4*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[4*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[4*SIZEOF SpriteObject].interactId, 4 - mov casinoSprites[4*SIZEOF SpriteObject].promptPtr, OFFSET promptRoulette + mov casinoSprites[4*SIZEOF SpriteObject].interactId, INTERACT_ROULETTE + mov casinoSprites[4*SIZEOF SpriteObject].promptPtr, OFFSET promptCasinoRoulette - ; Sprite 5: Poker Table (Front Center Right) - mov casinoSprites[5*SIZEOF SpriteObject].posX, (21 * FP_1) - mov casinoSprites[5*SIZEOF SpriteObject].posY, (10 * FP_1) + ; Sprite 5: Texas Hold'em Poker Table (Front Center Right) + mov casinoSprites[5*SIZEOF SpriteObject].posX, (20 * FP_1 + FP_HALF) + mov casinoSprites[5*SIZEOF SpriteObject].posY, (8 * FP_1) mov casinoSprites[5*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[5*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[5*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[5*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[5*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[5*SIZEOF SpriteObject].interactId, 1 + mov casinoSprites[5*SIZEOF SpriteObject].interactId, INTERACT_POKER mov casinoSprites[5*SIZEOF SpriteObject].promptPtr, OFFSET promptPoker - ; Sprite 6: Slot Machine 1 (West Arcade) - mov casinoSprites[6*SIZEOF SpriteObject].posX, (6 * FP_1) + ; Sprite 6: Podkidnoy Durak Card Table + mov casinoSprites[6*SIZEOF SpriteObject].posX, (24 * FP_1 + FP_HALF) mov casinoSprites[6*SIZEOF SpriteObject].posY, (8 * FP_1) - mov casinoSprites[6*SIZEOF SpriteObject].baseTexId, 24 - mov casinoSprites[6*SIZEOF SpriteObject].frameCount, 3 + mov casinoSprites[6*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[6*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[6*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[6*SIZEOF SpriteObject].animTimer, 0 - mov casinoSprites[6*SIZEOF SpriteObject].animSpeed, 8 - mov casinoSprites[6*SIZEOF SpriteObject].interactId, 3 - mov casinoSprites[6*SIZEOF SpriteObject].promptPtr, OFFSET promptSlot1 + mov casinoSprites[6*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[6*SIZEOF SpriteObject].interactId, INTERACT_DURAK + mov casinoSprites[6*SIZEOF SpriteObject].promptPtr, OFFSET promptDurak - ; Sprite 7: Slot Machine 2 (CloverPit) + ; Sprite 7: Classic Slots 777 (West Arcade 1) mov casinoSprites[7*SIZEOF SpriteObject].posX, (6 * FP_1) - mov casinoSprites[7*SIZEOF SpriteObject].posY, (11 * FP_1) + mov casinoSprites[7*SIZEOF SpriteObject].posY, (8 * FP_1) mov casinoSprites[7*SIZEOF SpriteObject].baseTexId, 24 mov casinoSprites[7*SIZEOF SpriteObject].frameCount, 3 - mov casinoSprites[7*SIZEOF SpriteObject].curFrame, 1 + mov casinoSprites[7*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[7*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[7*SIZEOF SpriteObject].animSpeed, 8 - mov casinoSprites[7*SIZEOF SpriteObject].interactId, 3 - mov casinoSprites[7*SIZEOF SpriteObject].promptPtr, OFFSET promptSlot2 + mov casinoSprites[7*SIZEOF SpriteObject].interactId, INTERACT_SLOTS_777 + mov casinoSprites[7*SIZEOF SpriteObject].promptPtr, OFFSET promptClassicSlot - ; Sprite 8: Slot Machine 3 + ; Sprite 8: CloverPit Slots 5x3 (West Arcade 2) mov casinoSprites[8*SIZEOF SpriteObject].posX, (6 * FP_1) - mov casinoSprites[8*SIZEOF SpriteObject].posY, (14 * FP_1) + mov casinoSprites[8*SIZEOF SpriteObject].posY, (11 * FP_1) mov casinoSprites[8*SIZEOF SpriteObject].baseTexId, 24 mov casinoSprites[8*SIZEOF SpriteObject].frameCount, 3 - mov casinoSprites[8*SIZEOF SpriteObject].curFrame, 2 + mov casinoSprites[8*SIZEOF SpriteObject].curFrame, 1 mov casinoSprites[8*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[8*SIZEOF SpriteObject].animSpeed, 8 - mov casinoSprites[8*SIZEOF SpriteObject].interactId, 3 - mov casinoSprites[8*SIZEOF SpriteObject].promptPtr, OFFSET promptSlot1 + mov casinoSprites[8*SIZEOF SpriteObject].interactId, INTERACT_SLOTS_CLOVER + mov casinoSprites[8*SIZEOF SpriteObject].promptPtr, OFFSET promptCloverSlot - ; Sprite 9: Bartender / Bar Counter (East Wing) - mov casinoSprites[9*SIZEOF SpriteObject].posX, (26 * FP_1) - mov casinoSprites[9*SIZEOF SpriteObject].posY, (12 * FP_1) - mov casinoSprites[9*SIZEOF SpriteObject].baseTexId, 32 + ; Sprite 9: Craps & Dice Table (West Arcade 3) + mov casinoSprites[9*SIZEOF SpriteObject].posX, (6 * FP_1) + mov casinoSprites[9*SIZEOF SpriteObject].posY, (14 * FP_1) + mov casinoSprites[9*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[9*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[9*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[9*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[9*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[9*SIZEOF SpriteObject].interactId, 6 - mov casinoSprites[9*SIZEOF SpriteObject].promptPtr, OFFSET promptShop + mov casinoSprites[9*SIZEOF SpriteObject].interactId, INTERACT_DICE + mov casinoSprites[9*SIZEOF SpriteObject].promptPtr, OFFSET promptDice - ; Sprite 10: ATM Bank Terminal (East Wing) - mov casinoSprites[10*SIZEOF SpriteObject].posX, (26 * FP_1) - mov casinoSprites[10*SIZEOF SpriteObject].posY, (16 * FP_1) - mov casinoSprites[10*SIZEOF SpriteObject].baseTexId, 33 + ; Sprite 10: Skulls & Cups Table + mov casinoSprites[10*SIZEOF SpriteObject].posX, (10 * FP_1) + mov casinoSprites[10*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[10*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[10*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[10*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[10*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[10*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[10*SIZEOF SpriteObject].interactId, 7 - mov casinoSprites[10*SIZEOF SpriteObject].promptPtr, OFFSET promptATM + mov casinoSprites[10*SIZEOF SpriteObject].interactId, INTERACT_SKULLS + mov casinoSprites[10*SIZEOF SpriteObject].promptPtr, OFFSET promptSkulls - ; Sprite 11: Underground Table (South Wing) - mov casinoSprites[11*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) - mov casinoSprites[11*SIZEOF SpriteObject].posY, (24 * FP_1) - mov casinoSprites[11*SIZEOF SpriteObject].baseTexId, 34 + ; Sprite 11: Coin Toss Stand + mov casinoSprites[11*SIZEOF SpriteObject].posX, (14 * FP_1) + mov casinoSprites[11*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[11*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[11*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[11*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[11*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[11*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[11*SIZEOF SpriteObject].interactId, 5 - mov casinoSprites[11*SIZEOF SpriteObject].promptPtr, OFFSET promptBackroom + mov casinoSprites[11*SIZEOF SpriteObject].interactId, INTERACT_COIN + mov casinoSprites[11*SIZEOF SpriteObject].promptPtr, OFFSET promptCoin - ; Sprite 12: Secret Demon Portal (South Wing) - mov casinoSprites[12*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) - mov casinoSprites[12*SIZEOF SpriteObject].posY, (29 * FP_1) - mov casinoSprites[12*SIZEOF SpriteObject].baseTexId, 4 + ; Sprite 12: Skill Check Stand + mov casinoSprites[12*SIZEOF SpriteObject].posX, (18 * FP_1) + mov casinoSprites[12*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[12*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[12*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[12*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[12*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[12*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[12*SIZEOF SpriteObject].interactId, 9 - mov casinoSprites[12*SIZEOF SpriteObject].promptPtr, OFFSET promptHell + mov casinoSprites[12*SIZEOF SpriteObject].interactId, INTERACT_SKILL_CHECK + mov casinoSprites[12*SIZEOF SpriteObject].promptPtr, OFFSET promptSkillCheck + + ; Sprite 13: Umamusume Derby Lounge + mov casinoSprites[13*SIZEOF SpriteObject].posX, (22 * FP_1) + mov casinoSprites[13*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[13*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[13*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[13*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[13*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[13*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[13*SIZEOF SpriteObject].interactId, INTERACT_UMAMUSUME + mov casinoSprites[13*SIZEOF SpriteObject].promptPtr, OFFSET promptUmamusume + + ; Sprite 14: Boutique & Shop (East Wing) + mov casinoSprites[14*SIZEOF SpriteObject].posX, (26 * FP_1) + mov casinoSprites[14*SIZEOF SpriteObject].posY, (12 * FP_1) + mov casinoSprites[14*SIZEOF SpriteObject].baseTexId, 32 + mov casinoSprites[14*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[14*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[14*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[14*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[14*SIZEOF SpriteObject].interactId, INTERACT_SHOP + mov casinoSprites[14*SIZEOF SpriteObject].promptPtr, OFFSET promptShop + + ; Sprite 15: Cashier & ATM (East Wing) + mov casinoSprites[15*SIZEOF SpriteObject].posX, (26 * FP_1) + mov casinoSprites[15*SIZEOF SpriteObject].posY, (16 * FP_1) + mov casinoSprites[15*SIZEOF SpriteObject].baseTexId, 33 + mov casinoSprites[15*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[15*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[15*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[15*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[15*SIZEOF SpriteObject].interactId, INTERACT_ATM + mov casinoSprites[15*SIZEOF SpriteObject].promptPtr, OFFSET promptATM + + ; Sprite 16: Player Terminal (East Wing) + mov casinoSprites[16*SIZEOF SpriteObject].posX, (26 * FP_1) + mov casinoSprites[16*SIZEOF SpriteObject].posY, (20 * FP_1) + mov casinoSprites[16*SIZEOF SpriteObject].baseTexId, 33 + mov casinoSprites[16*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[16*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[16*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[16*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[16*SIZEOF SpriteObject].interactId, INTERACT_TERMINAL + mov casinoSprites[16*SIZEOF SpriteObject].promptPtr, OFFSET promptPlayerTerminal + + ; Sprite 17: Buckshot Roulette (South-West) + mov casinoSprites[17*SIZEOF SpriteObject].posX, (12 * FP_1) + mov casinoSprites[17*SIZEOF SpriteObject].posY, (22 * FP_1) + mov casinoSprites[17*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[17*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[17*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[17*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[17*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[17*SIZEOF SpriteObject].interactId, INTERACT_BUCKSHOT + mov casinoSprites[17*SIZEOF SpriteObject].promptPtr, OFFSET promptBuckshot + + ; Sprite 18: Observer Lounge (South-East) + mov casinoSprites[18*SIZEOF SpriteObject].posX, (20 * FP_1) + mov casinoSprites[18*SIZEOF SpriteObject].posY, (22 * FP_1) + mov casinoSprites[18*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[18*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[18*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[18*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[18*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[18*SIZEOF SpriteObject].interactId, INTERACT_OBSERVER + mov casinoSprites[18*SIZEOF SpriteObject].promptPtr, OFFSET promptObserver + + ; Sprite 19: Russian Roulette (Backroom Entrance) + mov casinoSprites[19*SIZEOF SpriteObject].posX, (16 * FP_1) + mov casinoSprites[19*SIZEOF SpriteObject].posY, (25 * FP_1) + mov casinoSprites[19*SIZEOF SpriteObject].baseTexId, 34 + mov casinoSprites[19*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[19*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[19*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[19*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[19*SIZEOF SpriteObject].interactId, INTERACT_RUSSIAN_ROULETTE + mov casinoSprites[19*SIZEOF SpriteObject].promptPtr, OFFSET promptRussianRoulette + + ; Sprite 20: Online Russian Roulette (Backroom Secret Terminal) + mov casinoSprites[20*SIZEOF SpriteObject].posX, (18 * FP_1) + mov casinoSprites[20*SIZEOF SpriteObject].posY, (25 * FP_1) + mov casinoSprites[20*SIZEOF SpriteObject].baseTexId, 34 + mov casinoSprites[20*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[20*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[20*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[20*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[20*SIZEOF SpriteObject].interactId, INTERACT_ONLINE_RR + mov casinoSprites[20*SIZEOF SpriteObject].promptPtr, OFFSET promptOnlineRR + + ; Sprite 21: Hell Tower Portal (South Wing Deep End) + mov casinoSprites[21*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) + mov casinoSprites[21*SIZEOF SpriteObject].posY, (29 * FP_1) + mov casinoSprites[21*SIZEOF SpriteObject].baseTexId, 4 + mov casinoSprites[21*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[21*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[21*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[21*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[21*SIZEOF SpriteObject].interactId, INTERACT_HELL_TOWER + mov casinoSprites[21*SIZEOF SpriteObject].promptPtr, OFFSET promptHellTower mov eax, 1 jmp init_return diff --git a/build/graphics/poker.asm b/build/graphics/poker.asm index 3b6eb62..39bdc15 100644 --- a/build/graphics/poker.asm +++ b/build/graphics/poker.asm @@ -72,6 +72,13 @@ 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 @@ -14925,6 +14932,46 @@ 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 diff --git a/build/graphics/poker.exe b/build/graphics/poker.exe index ae0ea43..8e7557b 100644 Binary files a/build/graphics/poker.exe and b/build/graphics/poker.exe differ diff --git a/casino3d.inc b/casino3d.inc index 7a2a563..2165e88 100644 --- a/casino3d.inc +++ b/casino3d.inc @@ -167,17 +167,46 @@ dancerLuckBuff dd 0 flashTimer dd 0 flashMessage db 128 dup(0) -promptDancer db "[E] CABARET - TIP $100",0 -promptSlot1 db "[E] SLOTS 777",0 -promptSlot2 db "[E] SLOTS 777",0 -promptBlackjack db "[E] BLACKJACK / 21",0 -promptPoker db "POKER - UNDER CONSTRUCTION",0 -promptRoulette db "[E] ROULETTE",0 -promptShop db "[E] BOUTIQUE",0 -promptATM db "[E] CASHIER",0 -promptBackroom db "BACKROOM - UNDER CONSTRUCTION",0 -promptDurak db "DURAK - UNDER CONSTRUCTION",0 -promptHell db "TOWER - UNDER CONSTRUCTION",0 +promptDancer db "[E] ÊÀÁÀÐÅ - ×ÀÅÂÛÅ $100",0 +promptBlackjack db "[E] ÁËÝÊÄÆÅÊ (21)",0 +promptPoker db "[E] ÏÎÊÅÐ (TEXAS HOLD'EM)",0 +promptDurak db "[E] ÊÀÐÒÛ: ÏÎÄÊÈÄÍÎÉ ÄÓÐÀÊ",0 +promptCasinoRoulette db "[E] ÅÂÐÎÏÅÉÑÊÀß ÐÓËÅÒÊÀ",0 +promptClassicSlot db "[E] ÊËÀÑÑÈ×ÅÑÊÈÅ ÑËÎÒÛ 777",0 +promptCloverSlot db "[E] ÑËÎÒÛ CLOVERPIT (5x3)",0 +promptDice db "[E] ÈÃÐÀ  ÊÎÑÒÈ (CRAPS)",0 +promptSkulls db "[E] ÍÀϨÐÑÒÊÈ (×ÅÐÅÏÀ)",0 +promptCoin db "[E] ÌÎÍÅÒÊÀ (ÎШË/ÐÅØÊÀ)",0 +promptSkillCheck db "[E] ÒÐÅÍÈÐÎÂÊÀ ÐÅÀÊÖÈÈ",0 +promptBuckshot db "[E] BUCKSHOT ROULETTE",0 +promptRussianRoulette db "[E] ÐÓÑÑÊÀß ÐÓËÅÒÊÀ (VIP)",0 +promptOnlineRR db "[E] ÑÅÒÅÂÀß ÐÓËÅÒÊÀ (NET)",0 +promptUmamusume db "[E] ÑÊÀ×ÊÈ ÓÌÀÌÓÑÓÌÝ",0 +promptHellTower db "[E] ÁÀØÍß ÀÄÀ (10 ÝÒÀÆÅÉ)",0 +promptShop db "[E] ÁÓÒÈÊ È ÒÀËÈÑÌÀÍÛ",0 +promptATM db "[E] ÁÀÍÊÎÌÀÒ È ÁÀËÀÍÑ",0 +promptPlayerTerminal db "[E] ÒÅÐÌÈÍÀË: ÑÒÀÒÛ È À×ÈÂÊÈ",0 +promptObserver db "[E] ÐÅÆÈÌ ÍÀÁËÞÄÀÒÅËß (ÈÈ)",0 + +szTitleBlackjack db "[KAZIK 3D CASINO] - ÁËÝÊÄÆÅÊ (21)",0 +szTitlePoker db "[KAZIK 3D CASINO] - ÏÎÊÅÐ (TEXAS HOLD'EM)",0 +szTitleDurak db "[KAZIK 3D CASINO] - ÏÎÄÊÈÄÍÎÉ ÄÓÐÀÊ",0 +szTitleCasinoRoulette db "[KAZIK 3D CASINO] - ÅÂÐÎÏÅÉÑÊÀß ÐÓËÅÒÊÀ",0 +szTitleClassicSlot db "[KAZIK 3D CASINO] - ÊËÀÑÑÈ×ÅÑÊÈÅ ÑËÎÒÛ 777",0 +szTitleCloverSlot db "[KAZIK 3D CASINO] - ÑËÎÒ-ÌÀØÈÍÀ CLOVERPIT (5x3)",0 +szTitleDice db "[KAZIK 3D CASINO] - ÈÃÐÀ  ÊÎÑÒÈ (CRAPS)",0 +szTitleSkulls db "[KAZIK 3D CASINO] - ÍÀϨÐÑÒÊÈ",0 +szTitleCoin db "[KAZIK 3D CASINO] - ÌÎÍÅÒÊÀ (ÎШË/ÐÅØÊÀ)",0 +szTitleSkillCheck db "[KAZIK 3D CASINO] - ÏÐÎÂÅÐÊÀ ÐÅÀÊÖÈÈ",0 +szTitleBuckshot db "[KAZIK 3D CASINO] - BUCKSHOT ROULETTE",0 +szTitleRussianRoulette db "[KAZIK 3D CASINO] - ÐÓÑÑÊÀß ÐÓËÅÒÊÀ",0 +szTitleOnlineRR db "[KAZIK 3D CASINO] - ÑÅÒÅÂÀß ÐÓÑÑÊÀß ÐÓËÅÒÊÀ",0 +szTitleUmamusume db "[KAZIK 3D CASINO] - ÑÊÀ×ÊÈ ÓÌÀÌÓÑÓÌÝ",0 +szTitleHellTower db "[KAZIK 3D CASINO] - ÁÀØÍß ÀÄÀ (ÒÓÐÍÈÐ)",0 +szTitleShop db "[KAZIK 3D CASINO] - ÁÓÒÈÊ È ÒÀËÈÑÌÀÍÛ",0 +szTitleATM db "[KAZIK 3D CASINO] - ÁÀÍÊÎÌÀÒ",0 +szTitleTerminal db "[KAZIK 3D CASINO] - ÒÅÐÌÈÍÀË ÈÃÐÎÊÀ",0 +szTitleObserver db "[KAZIK 3D CASINO] - ÐÅÆÈÌ ÍÀÁËÞÄÀÒÅËß (ÈÈ)",0 msgDancerTipped db "Âû áðîñèëè $100 òàíöîâùèöå! ÓÄÀ×À ÀÊÒÈÂÈÐÎÂÀÍÀ!",0 msgNeedMoney db "Íåäîñòàòî÷íî äåíåã â êîøåëüêå!",0 @@ -186,7 +215,29 @@ targetHUDFormat db " luckHUDFormat db " ÓÄÀ×À: +",0 controlsHUD db "WASD/Ñòðåëêè: Õîäüáà | E: Äåéñòâèå | ESC: Ìåíþ",0 -NUM_SPRITES equ 13 +NUM_SPRITES equ 22 + +INTERACT_NONE equ 0 +INTERACT_BLACKJACK equ 1 +INTERACT_POKER equ 2 +INTERACT_SLOTS_777 equ 3 +INTERACT_ROULETTE equ 4 +INTERACT_SKULLS equ 5 +INTERACT_SHOP equ 6 +INTERACT_ATM equ 7 +INTERACT_DANCER equ 8 +INTERACT_HELL_TOWER equ 9 +INTERACT_DURAK equ 10 +INTERACT_BUCKSHOT equ 11 +INTERACT_COIN equ 12 +INTERACT_DICE equ 13 +INTERACT_SLOTS_CLOVER equ 14 +INTERACT_UMAMUSUME equ 15 +INTERACT_OBSERVER equ 16 +INTERACT_TERMINAL equ 17 +INTERACT_ONLINE_RR equ 18 +INTERACT_RUSSIAN_ROULETTE equ 19 +INTERACT_SKILL_CHECK equ 20 ALIGN 4 casinoSprites SpriteObject NUM_SPRITES dup(<>) sortedSprites dd NUM_SPRITES dup(0) @@ -2633,18 +2684,104 @@ interaction_done: ret CheckInteractions ENDP +; --- LaunchClassicGame: Îòêðûòèå îòäåëüíîãî îêíà äëÿ êëàññè÷åñêîé âåðñèè èãðû --- +LaunchClassicGame PROC uses ebx esi edi, pGameProc:DWORD, gameId:DWORD, pTitle:DWORD + LOCAL rc3D[16]:BYTE + LOCAL conWnd:DWORD + LOCAL conW:DWORD, conH:DWORD, conX:DWORD, conY:DWORD + + mov eax, gameId + mov currentGameId, eax + + invoke AllocConsole + test eax, eax + jz launch_ret + + invoke GetStdHandle, STD_OUTPUT_HANDLE + mov hOut, eax + invoke GetStdHandle, STD_INPUT_HANDLE + mov hIn, eax + + invoke SetConsoleCP, 1251 + invoke SetConsoleOutputCP, 1251 + + cmp pTitle, 0 + je @F + invoke SetConsoleTitleA, pTitle +@@: + call EnableAnsi + call ConfigureConsoleSize + + invoke GetConsoleWindow + mov conWnd, eax + test eax, eax + jz run_game_body + + cmp h3DWnd, 0 + je show_con_fallback + + lea eax, rc3D + invoke GetWindowRect, h3DWnd, eax + mov eax, dword ptr rc3D[0] + add eax, 40 + mov conX, eax + mov eax, dword ptr rc3D[4] + add eax, 40 + mov conY, eax + mov conW, 960 + mov conH, 680 + invoke SetWindowPos, conWnd, 0, conX, conY, conW, conH, 40h ; SWP_SHOWWINDOW + jmp set_con_focus + +show_con_fallback: + invoke ShowWindow, conWnd, 5 ; SW_SHOW +set_con_focus: + invoke SetForegroundWindow, conWnd + invoke SetFocus, conWnd + +run_game_body: + call pGameProc + + invoke FreeConsole + mov hOut, 0 + mov hIn, 0 + + cmp h3DWnd, 0 + je cleanup_game_input + invoke SetForegroundWindow, h3DWnd + invoke SetFocus, h3DWnd + +cleanup_game_input: + mov ecx, 256 + xor eax, eax + lea edi, keys3D + rep stosb + mov ecx, 256 + lea edi, pressedKeys3D + rep stosb + + invoke GetTickCount + mov previousTick3D, eax + mov frameStart3D, eax + mov deltaTime3D, 0 + + call SaveProgress3D + +launch_ret: + ret +LaunchClassicGame ENDP + Trigger3DInteraction PROC mov eax, interactTargetId test eax, eax - jz @F + jz trigger_done - cmp eax, 8 ; DANCER - jne check_target_slots + cmp eax, INTERACT_DANCER + jne check_target_bj cmp bankroll, 100 jl dancer_no_cash sub bankroll, 100 inc dancerLuckBuff - ; Tips are cosmetic and must not silently change game odds. invoke CopyString3D, OFFSET textTips3D, OFFSET flashMessage mov flashTimer, 100 invoke PlaySoundA, OFFSET soundJackpot, 0, 1 @@ -2654,42 +2791,124 @@ dancer_no_cash: mov flashTimer, 60 ret -check_target_slots: - cmp eax, 3 ; SLOTS - jne check_target_bj - mov engineMode, MODE_SLOTS - invoke PlaySoundA, OFFSET soundClick, 0, 1 +check_target_bj: + cmp eax, INTERACT_BLACKJACK + jne check_target_poker + invoke LaunchClassicGame, OFFSET Game21, 1, OFFSET szTitleBlackjack ret -check_target_bj: - cmp eax, 1 ; BLACKJACK +check_target_poker: + cmp eax, INTERACT_POKER + jne check_target_durak + invoke LaunchClassicGame, OFFSET GamePoker, 2, OFFSET szTitlePoker + ret + +check_target_durak: + cmp eax, INTERACT_DURAK + jne check_target_slots777 + invoke LaunchClassicGame, OFFSET GameDurak, 10, OFFSET szTitleDurak + ret + +check_target_slots777: + cmp eax, INTERACT_SLOTS_777 + jne check_target_slots_clover + invoke LaunchClassicGame, OFFSET GameClassicSlot, 9, OFFSET szTitleClassicSlot + ret + +check_target_slots_clover: + cmp eax, INTERACT_SLOTS_CLOVER jne check_target_roulette - mov engineMode, MODE_BLACKJACK - mov bjState, 0 + invoke LaunchClassicGame, OFFSET GameSlot, 3, OFFSET szTitleCloverSlot ret check_target_roulette: - cmp eax, 4 ; ROULETTE + cmp eax, INTERACT_ROULETTE + jne check_target_dice + invoke LaunchClassicGame, OFFSET GameCasinoRoulette, 8, OFFSET szTitleCasinoRoulette + ret + +check_target_dice: + cmp eax, INTERACT_DICE + jne check_target_skulls + invoke LaunchClassicGame, OFFSET GameDice, 7, OFFSET szTitleDice + ret + +check_target_skulls: + cmp eax, INTERACT_SKULLS + jne check_target_coin + invoke LaunchClassicGame, OFFSET GameSkulls, 5, OFFSET szTitleSkulls + ret + +check_target_coin: + cmp eax, INTERACT_COIN + jne check_target_skill + invoke LaunchClassicGame, OFFSET GameCoin, 6, OFFSET szTitleCoin + ret + +check_target_skill: + cmp eax, INTERACT_SKILL_CHECK + jne check_target_buckshot + invoke LaunchClassicGame, OFFSET GameSkillCheck, 11, OFFSET szTitleSkillCheck + ret + +check_target_buckshot: + cmp eax, INTERACT_BUCKSHOT + jne check_target_rr + invoke LaunchClassicGame, OFFSET GameBuckshot, 13, OFFSET szTitleBuckshot + ret + +check_target_rr: + cmp eax, INTERACT_RUSSIAN_ROULETTE + jne check_target_online_rr + invoke LaunchClassicGame, OFFSET GameRoulette, 4, OFFSET szTitleRussianRoulette + ret + +check_target_online_rr: + cmp eax, INTERACT_ONLINE_RR + jne check_target_umamusume + invoke LaunchClassicGame, OFFSET GameOnlineCasino, 20, OFFSET szTitleOnlineRR + ret + +check_target_umamusume: + cmp eax, INTERACT_UMAMUSUME + jne check_target_hell + invoke LaunchClassicGame, OFFSET GameUmamusume, 21, OFFSET szTitleUmamusume + ret + +check_target_hell: + cmp eax, INTERACT_HELL_TOWER jne check_target_shop - mov engineMode, MODE_ROULETTE - mov roulState, 0 + invoke LaunchClassicGame, OFFSET GameTournament, 666, OFFSET szTitleHellTower ret check_target_shop: - cmp eax, 6 ; SHOP + cmp eax, INTERACT_SHOP jne check_target_atm - mov engineMode, MODE_SHOP + invoke LaunchClassicGame, OFFSET GameShop, 0, OFFSET szTitleShop ret check_target_atm: - cmp eax, 7 ; ATM - jne target_unported + cmp eax, INTERACT_ATM + jne check_target_terminal mov engineMode, MODE_ATM ret + +check_target_terminal: + cmp eax, INTERACT_TERMINAL + jne check_target_observer + invoke LaunchClassicGame, OFFSET GamePlayerTerminal, 0, OFFSET szTitleTerminal + ret + +check_target_observer: + cmp eax, INTERACT_OBSERVER + jne target_unported + invoke LaunchClassicGame, OFFSET GameObserver, 14, OFFSET szTitleObserver + ret + target_unported: invoke CopyString3D, OFFSET textUnavailable3D, OFFSET flashMessage mov flashTimer, 150 -@@: +trigger_done: ret Trigger3DInteraction ENDP @@ -2721,7 +2940,7 @@ init_sprites_table: mov casinoSprites[0*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[0*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[0*SIZEOF SpriteObject].animSpeed, 5 - mov casinoSprites[0*SIZEOF SpriteObject].interactId, 8 + mov casinoSprites[0*SIZEOF SpriteObject].interactId, INTERACT_DANCER mov casinoSprites[0*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer ; Sprite 1: VIP Dancer 2 (Center Stage Star) @@ -2732,7 +2951,7 @@ init_sprites_table: mov casinoSprites[1*SIZEOF SpriteObject].curFrame, 2 mov casinoSprites[1*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[1*SIZEOF SpriteObject].animSpeed, 5 - mov casinoSprites[1*SIZEOF SpriteObject].interactId, 8 + mov casinoSprites[1*SIZEOF SpriteObject].interactId, INTERACT_DANCER mov casinoSprites[1*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer ; Sprite 2: VIP Dancer 3 (Stage Right) @@ -2743,21 +2962,21 @@ init_sprites_table: mov casinoSprites[2*SIZEOF SpriteObject].curFrame, 1 mov casinoSprites[2*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[2*SIZEOF SpriteObject].animSpeed, 5 - mov casinoSprites[2*SIZEOF SpriteObject].interactId, 8 + mov casinoSprites[2*SIZEOF SpriteObject].interactId, INTERACT_DANCER mov casinoSprites[2*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer - ; Sprite 3: Blackjack Table with Dealer (Front Center Left) + ; Sprite 3: VIP Blackjack (Front Center Left) mov casinoSprites[3*SIZEOF SpriteObject].posX, (12 * FP_1 + FP_HALF) - mov casinoSprites[3*SIZEOF SpriteObject].posY, (10 * FP_1) + mov casinoSprites[3*SIZEOF SpriteObject].posY, (8 * FP_1) mov casinoSprites[3*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[3*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[3*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[3*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[3*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[3*SIZEOF SpriteObject].interactId, 1 + mov casinoSprites[3*SIZEOF SpriteObject].interactId, INTERACT_BLACKJACK mov casinoSprites[3*SIZEOF SpriteObject].promptPtr, OFFSET promptBlackjack - ; Sprite 4: Roulette Table (Front Center) + ; Sprite 4: European Roulette Table (Front Center) mov casinoSprites[4*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) mov casinoSprites[4*SIZEOF SpriteObject].posY, (10 * FP_1) mov casinoSprites[4*SIZEOF SpriteObject].baseTexId, 31 @@ -2765,96 +2984,195 @@ init_sprites_table: mov casinoSprites[4*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[4*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[4*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[4*SIZEOF SpriteObject].interactId, 4 - mov casinoSprites[4*SIZEOF SpriteObject].promptPtr, OFFSET promptRoulette + mov casinoSprites[4*SIZEOF SpriteObject].interactId, INTERACT_ROULETTE + mov casinoSprites[4*SIZEOF SpriteObject].promptPtr, OFFSET promptCasinoRoulette - ; Sprite 5: Poker Table (Front Center Right) - mov casinoSprites[5*SIZEOF SpriteObject].posX, (21 * FP_1) - mov casinoSprites[5*SIZEOF SpriteObject].posY, (10 * FP_1) + ; Sprite 5: Texas Hold'em Poker Table (Front Center Right) + mov casinoSprites[5*SIZEOF SpriteObject].posX, (20 * FP_1 + FP_HALF) + mov casinoSprites[5*SIZEOF SpriteObject].posY, (8 * FP_1) mov casinoSprites[5*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[5*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[5*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[5*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[5*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[5*SIZEOF SpriteObject].interactId, 1 + mov casinoSprites[5*SIZEOF SpriteObject].interactId, INTERACT_POKER mov casinoSprites[5*SIZEOF SpriteObject].promptPtr, OFFSET promptPoker - ; Sprite 6: Slot Machine 1 (West Arcade) - mov casinoSprites[6*SIZEOF SpriteObject].posX, (6 * FP_1) + ; Sprite 6: Podkidnoy Durak Card Table + mov casinoSprites[6*SIZEOF SpriteObject].posX, (24 * FP_1 + FP_HALF) mov casinoSprites[6*SIZEOF SpriteObject].posY, (8 * FP_1) - mov casinoSprites[6*SIZEOF SpriteObject].baseTexId, 24 - mov casinoSprites[6*SIZEOF SpriteObject].frameCount, 3 + mov casinoSprites[6*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[6*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[6*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[6*SIZEOF SpriteObject].animTimer, 0 - mov casinoSprites[6*SIZEOF SpriteObject].animSpeed, 8 - mov casinoSprites[6*SIZEOF SpriteObject].interactId, 3 - mov casinoSprites[6*SIZEOF SpriteObject].promptPtr, OFFSET promptSlot1 + mov casinoSprites[6*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[6*SIZEOF SpriteObject].interactId, INTERACT_DURAK + mov casinoSprites[6*SIZEOF SpriteObject].promptPtr, OFFSET promptDurak - ; Sprite 7: Slot Machine 2 (CloverPit) + ; Sprite 7: Classic Slots 777 (West Arcade 1) mov casinoSprites[7*SIZEOF SpriteObject].posX, (6 * FP_1) - mov casinoSprites[7*SIZEOF SpriteObject].posY, (11 * FP_1) + mov casinoSprites[7*SIZEOF SpriteObject].posY, (8 * FP_1) mov casinoSprites[7*SIZEOF SpriteObject].baseTexId, 24 mov casinoSprites[7*SIZEOF SpriteObject].frameCount, 3 - mov casinoSprites[7*SIZEOF SpriteObject].curFrame, 1 + mov casinoSprites[7*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[7*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[7*SIZEOF SpriteObject].animSpeed, 8 - mov casinoSprites[7*SIZEOF SpriteObject].interactId, 3 - mov casinoSprites[7*SIZEOF SpriteObject].promptPtr, OFFSET promptSlot2 + mov casinoSprites[7*SIZEOF SpriteObject].interactId, INTERACT_SLOTS_777 + mov casinoSprites[7*SIZEOF SpriteObject].promptPtr, OFFSET promptClassicSlot - ; Sprite 8: Slot Machine 3 + ; Sprite 8: CloverPit Slots 5x3 (West Arcade 2) mov casinoSprites[8*SIZEOF SpriteObject].posX, (6 * FP_1) - mov casinoSprites[8*SIZEOF SpriteObject].posY, (14 * FP_1) + mov casinoSprites[8*SIZEOF SpriteObject].posY, (11 * FP_1) mov casinoSprites[8*SIZEOF SpriteObject].baseTexId, 24 mov casinoSprites[8*SIZEOF SpriteObject].frameCount, 3 - mov casinoSprites[8*SIZEOF SpriteObject].curFrame, 2 + mov casinoSprites[8*SIZEOF SpriteObject].curFrame, 1 mov casinoSprites[8*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[8*SIZEOF SpriteObject].animSpeed, 8 - mov casinoSprites[8*SIZEOF SpriteObject].interactId, 3 - mov casinoSprites[8*SIZEOF SpriteObject].promptPtr, OFFSET promptSlot1 + mov casinoSprites[8*SIZEOF SpriteObject].interactId, INTERACT_SLOTS_CLOVER + mov casinoSprites[8*SIZEOF SpriteObject].promptPtr, OFFSET promptCloverSlot - ; Sprite 9: Bartender / Bar Counter (East Wing) - mov casinoSprites[9*SIZEOF SpriteObject].posX, (26 * FP_1) - mov casinoSprites[9*SIZEOF SpriteObject].posY, (12 * FP_1) - mov casinoSprites[9*SIZEOF SpriteObject].baseTexId, 32 + ; Sprite 9: Craps & Dice Table (West Arcade 3) + mov casinoSprites[9*SIZEOF SpriteObject].posX, (6 * FP_1) + mov casinoSprites[9*SIZEOF SpriteObject].posY, (14 * FP_1) + mov casinoSprites[9*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[9*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[9*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[9*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[9*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[9*SIZEOF SpriteObject].interactId, 6 - mov casinoSprites[9*SIZEOF SpriteObject].promptPtr, OFFSET promptShop + mov casinoSprites[9*SIZEOF SpriteObject].interactId, INTERACT_DICE + mov casinoSprites[9*SIZEOF SpriteObject].promptPtr, OFFSET promptDice - ; Sprite 10: ATM Bank Terminal (East Wing) - mov casinoSprites[10*SIZEOF SpriteObject].posX, (26 * FP_1) - mov casinoSprites[10*SIZEOF SpriteObject].posY, (16 * FP_1) - mov casinoSprites[10*SIZEOF SpriteObject].baseTexId, 33 + ; Sprite 10: Skulls & Cups Table + mov casinoSprites[10*SIZEOF SpriteObject].posX, (10 * FP_1) + mov casinoSprites[10*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[10*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[10*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[10*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[10*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[10*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[10*SIZEOF SpriteObject].interactId, 7 - mov casinoSprites[10*SIZEOF SpriteObject].promptPtr, OFFSET promptATM + mov casinoSprites[10*SIZEOF SpriteObject].interactId, INTERACT_SKULLS + mov casinoSprites[10*SIZEOF SpriteObject].promptPtr, OFFSET promptSkulls - ; Sprite 11: Underground Table (South Wing) - mov casinoSprites[11*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) - mov casinoSprites[11*SIZEOF SpriteObject].posY, (24 * FP_1) - mov casinoSprites[11*SIZEOF SpriteObject].baseTexId, 34 + ; Sprite 11: Coin Toss Stand + mov casinoSprites[11*SIZEOF SpriteObject].posX, (14 * FP_1) + mov casinoSprites[11*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[11*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[11*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[11*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[11*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[11*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[11*SIZEOF SpriteObject].interactId, 5 - mov casinoSprites[11*SIZEOF SpriteObject].promptPtr, OFFSET promptBackroom + mov casinoSprites[11*SIZEOF SpriteObject].interactId, INTERACT_COIN + mov casinoSprites[11*SIZEOF SpriteObject].promptPtr, OFFSET promptCoin - ; Sprite 12: Secret Demon Portal (South Wing) - mov casinoSprites[12*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) - mov casinoSprites[12*SIZEOF SpriteObject].posY, (29 * FP_1) - mov casinoSprites[12*SIZEOF SpriteObject].baseTexId, 4 + ; Sprite 12: Skill Check Stand + mov casinoSprites[12*SIZEOF SpriteObject].posX, (18 * FP_1) + mov casinoSprites[12*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[12*SIZEOF SpriteObject].baseTexId, 30 mov casinoSprites[12*SIZEOF SpriteObject].frameCount, 1 mov casinoSprites[12*SIZEOF SpriteObject].curFrame, 0 mov casinoSprites[12*SIZEOF SpriteObject].animTimer, 0 mov casinoSprites[12*SIZEOF SpriteObject].animSpeed, 1 - mov casinoSprites[12*SIZEOF SpriteObject].interactId, 9 - mov casinoSprites[12*SIZEOF SpriteObject].promptPtr, OFFSET promptHell + mov casinoSprites[12*SIZEOF SpriteObject].interactId, INTERACT_SKILL_CHECK + mov casinoSprites[12*SIZEOF SpriteObject].promptPtr, OFFSET promptSkillCheck + + ; Sprite 13: Umamusume Derby Lounge + mov casinoSprites[13*SIZEOF SpriteObject].posX, (22 * FP_1) + mov casinoSprites[13*SIZEOF SpriteObject].posY, (15 * FP_1) + mov casinoSprites[13*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[13*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[13*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[13*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[13*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[13*SIZEOF SpriteObject].interactId, INTERACT_UMAMUSUME + mov casinoSprites[13*SIZEOF SpriteObject].promptPtr, OFFSET promptUmamusume + + ; Sprite 14: Boutique & Shop (East Wing) + mov casinoSprites[14*SIZEOF SpriteObject].posX, (26 * FP_1) + mov casinoSprites[14*SIZEOF SpriteObject].posY, (12 * FP_1) + mov casinoSprites[14*SIZEOF SpriteObject].baseTexId, 32 + mov casinoSprites[14*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[14*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[14*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[14*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[14*SIZEOF SpriteObject].interactId, INTERACT_SHOP + mov casinoSprites[14*SIZEOF SpriteObject].promptPtr, OFFSET promptShop + + ; Sprite 15: Cashier & ATM (East Wing) + mov casinoSprites[15*SIZEOF SpriteObject].posX, (26 * FP_1) + mov casinoSprites[15*SIZEOF SpriteObject].posY, (16 * FP_1) + mov casinoSprites[15*SIZEOF SpriteObject].baseTexId, 33 + mov casinoSprites[15*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[15*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[15*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[15*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[15*SIZEOF SpriteObject].interactId, INTERACT_ATM + mov casinoSprites[15*SIZEOF SpriteObject].promptPtr, OFFSET promptATM + + ; Sprite 16: Player Terminal (East Wing) + mov casinoSprites[16*SIZEOF SpriteObject].posX, (26 * FP_1) + mov casinoSprites[16*SIZEOF SpriteObject].posY, (20 * FP_1) + mov casinoSprites[16*SIZEOF SpriteObject].baseTexId, 33 + mov casinoSprites[16*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[16*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[16*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[16*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[16*SIZEOF SpriteObject].interactId, INTERACT_TERMINAL + mov casinoSprites[16*SIZEOF SpriteObject].promptPtr, OFFSET promptPlayerTerminal + + ; Sprite 17: Buckshot Roulette (South-West) + mov casinoSprites[17*SIZEOF SpriteObject].posX, (12 * FP_1) + mov casinoSprites[17*SIZEOF SpriteObject].posY, (22 * FP_1) + mov casinoSprites[17*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[17*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[17*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[17*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[17*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[17*SIZEOF SpriteObject].interactId, INTERACT_BUCKSHOT + mov casinoSprites[17*SIZEOF SpriteObject].promptPtr, OFFSET promptBuckshot + + ; Sprite 18: Observer Lounge (South-East) + mov casinoSprites[18*SIZEOF SpriteObject].posX, (20 * FP_1) + mov casinoSprites[18*SIZEOF SpriteObject].posY, (22 * FP_1) + mov casinoSprites[18*SIZEOF SpriteObject].baseTexId, 30 + mov casinoSprites[18*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[18*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[18*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[18*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[18*SIZEOF SpriteObject].interactId, INTERACT_OBSERVER + mov casinoSprites[18*SIZEOF SpriteObject].promptPtr, OFFSET promptObserver + + ; Sprite 19: Russian Roulette (Backroom Entrance) + mov casinoSprites[19*SIZEOF SpriteObject].posX, (16 * FP_1) + mov casinoSprites[19*SIZEOF SpriteObject].posY, (25 * FP_1) + mov casinoSprites[19*SIZEOF SpriteObject].baseTexId, 34 + mov casinoSprites[19*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[19*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[19*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[19*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[19*SIZEOF SpriteObject].interactId, INTERACT_RUSSIAN_ROULETTE + mov casinoSprites[19*SIZEOF SpriteObject].promptPtr, OFFSET promptRussianRoulette + + ; Sprite 20: Online Russian Roulette (Backroom Secret Terminal) + mov casinoSprites[20*SIZEOF SpriteObject].posX, (18 * FP_1) + mov casinoSprites[20*SIZEOF SpriteObject].posY, (25 * FP_1) + mov casinoSprites[20*SIZEOF SpriteObject].baseTexId, 34 + mov casinoSprites[20*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[20*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[20*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[20*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[20*SIZEOF SpriteObject].interactId, INTERACT_ONLINE_RR + mov casinoSprites[20*SIZEOF SpriteObject].promptPtr, OFFSET promptOnlineRR + + ; Sprite 21: Hell Tower Portal (South Wing Deep End) + mov casinoSprites[21*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF) + mov casinoSprites[21*SIZEOF SpriteObject].posY, (29 * FP_1) + mov casinoSprites[21*SIZEOF SpriteObject].baseTexId, 4 + mov casinoSprites[21*SIZEOF SpriteObject].frameCount, 1 + mov casinoSprites[21*SIZEOF SpriteObject].curFrame, 0 + mov casinoSprites[21*SIZEOF SpriteObject].animTimer, 0 + mov casinoSprites[21*SIZEOF SpriteObject].animSpeed, 1 + mov casinoSprites[21*SIZEOF SpriteObject].interactId, INTERACT_HELL_TOWER + mov casinoSprites[21*SIZEOF SpriteObject].promptPtr, OFFSET promptHellTower mov eax, 1 jmp init_return diff --git a/poker.asm b/poker.asm index 3b6eb62..39bdc15 100644 --- a/poker.asm +++ b/poker.asm @@ -72,6 +72,13 @@ 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 @@ -14925,6 +14932,46 @@ 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 diff --git a/poker.exe b/poker.exe index cef22cb..8e7557b 100644 Binary files a/poker.exe and b/poker.exe differ