KAZIK/tools/generate_unified_casino3d.py

2350 lines
60 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# Generator for casino3d.inc (CP1251)
import sys
content = r'''
; ==============================================================================
; CASINO 2.5D ENGINE - MASM32 SOFTWARE RAYCASTER (CP1251)
; Unified with Full Console Casino Games via RunConsoleGameFrom3D
; ==============================================================================
includelib gdi32.lib
includelib winmm.lib
CreateWindowExA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
RegisterClassExA PROTO :DWORD
DefWindowProcA PROTO :DWORD,:DWORD,:DWORD,:DWORD
ShowWindow PROTO :DWORD,:DWORD
UpdateWindow PROTO :DWORD
GetDC PROTO :DWORD
ReleaseDC PROTO :DWORD,:DWORD
StretchDIBits PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
PeekMessageA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
TranslateMessage PROTO :DWORD
DispatchMessageA PROTO :DWORD
PostQuitMessage PROTO :DWORD
DestroyWindow PROTO :DWORD
SetWindowTextA PROTO :DWORD,:DWORD
SetForegroundWindow PROTO :DWORD
GetConsoleWindow PROTO
GetSystemMetrics PROTO :DWORD
CreateFileA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
CloseHandle PROTO :DWORD
GetAsyncKeyState PROTO :DWORD
PlaySoundA PROTO :DWORD,:DWORD,:DWORD
GetModuleFileNameA PROTO :DWORD,:DWORD,:DWORD
Sleep PROTO :DWORD
C3D_POINT STRUCT
x dd ?
y dd ?
C3D_POINT ENDS
C3D_MSG STRUCT
hwnd dd ?
message dd ?
wParam dd ?
lParam dd ?
time dd ?
pt C3D_POINT <>
C3D_MSG ENDS
C3D_WNDCLASSEX STRUCT
cbSize dd ?
style dd ?
lpfnWndProc dd ?
cbClsExtra dd ?
cbWndExtra dd ?
hInstance dd ?
hIcon dd ?
hCursor dd ?
hbrBackground dd ?
lpszMenuName dd ?
lpszClassName dd ?
hIconSm dd ?
C3D_WNDCLASSEX ENDS
C3D_BITMAPINFOHEADER STRUCT
biSize dd ?
biWidth dd ?
biHeight dd ?
biPlanes dw ?
biBitCount dw ?
biCompression dd ?
biSizeImage dd ?
biXPelsPerMeter dd ?
biYPelsPerMeter dd ?
biClrUsed dd ?
biClrImportant dd ?
C3D_BITMAPINFOHEADER ENDS
C3D_BITMAPINFO STRUCT
bmiHeader C3D_BITMAPINFOHEADER <>
bmiColors dd ?
C3D_BITMAPINFO ENDS
SpriteObject STRUCT
posX dd ?
posY dd ?
baseTexId dd ?
frameCount dd ?
curFrame dd ?
animTimer dd ?
animSpeed dd ?
interactId dd ?
promptPtr dd ?
distSq dd ?
SpriteObject ENDS
SCREEN_W equ 640
SCREEN_H equ 480
HALF_W equ 320
HALF_H equ 240
SCREEN_SIZE equ (SCREEN_W * SCREEN_H)
WIN_SCALE equ 1
WINDOW_W equ (SCREEN_W * WIN_SCALE)
WINDOW_H equ (SCREEN_H * WIN_SCALE)
FP_SHIFT equ 16
FP_1 equ 65536
FP_HALF equ 32768
MODE_WALK equ 0
NUM_SPRITES equ 28
CS_HREDRAW equ 2
CS_VREDRAW equ 1
PM_REMOVE equ 1
WM_QUIT equ 12h
WM_CLOSE equ 10h
WM_DESTROY equ 2
WS_OVERLAPPEDWINDOW equ 00CF0000h
WS_VISIBLE equ 10000000h
DIB_RGB_COLORS equ 0
SRCCOPY equ 00CC0020h
GENERIC_READ equ 80000000h
FILE_ATTRIBUTE_NORMAL equ 80h
OPEN_EXISTING equ 3
INVALID_FILE_HANDLE equ -1
include casino3d_data.inc
include font8x8.inc
include src_graphics\platform_data.inc
.data
ALIGN 4
h3DInst dd 0
h3DWnd dd 0
h3DDC dd 0
engineMode dd MODE_WALK
rngSeed3D dd 12345678h
bmi3D C3D_BITMAPINFO <>
msg3D C3D_MSG <>
wc3D C3D_WNDCLASSEX <>
sz3DClassName db "Casino3DRetroClass",0
sz3DWindowTitle db "Assembler Casino - 2.5D Lobby",0
szTexturesRelPath db "assets\textures\casino3d-hd.bin",0
szTexturesFullPath db 260 dup(0)
soundCoin db "assets\audio\b05e1ac8be34248.wav",0
soundJackpot db "assets\audio\hakari_dance.wav",0
soundClick db "assets\audio\toy-gun-revolver-close-chamber-spin_f1ruc5nd.wav",0
playerX dd (16 * FP_1 + FP_HALF)
playerY dd (16 * FP_1 + FP_HALF)
playerAngle dd 384
playerDirX dd 0
playerDirY dd 0
playerPlaneX dd 0
playerPlaneY dd 0
casinoSprites SpriteObject NUM_SPRITES dup(<>)
sortedSprites dd NUM_SPRITES dup(0)
interactTargetId dd 0
interactPromptPtr dd 0
dancerLuckBuff dd 0
flashTimer dd 0
flashMessage db 128 dup(0)
; Russian CP1251 Interaction Prompts
promptDancer1 db "[E] Кабаре: Чаевые $100 (+Бафф удачи)",0
promptDancer2 db "[E] Главная сцена: Чаевые $100 (+Удача)",0
promptDancer3 db "[E] VIP-Кабаре: Чаевые $100 (+Бафф удачи)",0
promptBlackjack db "[E] Стол: 21 / Блэкджек",0
promptPoker db "[E] Стол: Покер (Техасский Холдем)",0
promptCasinoRoul db "[E] Стол: Казино-Рулетка (Европейская)",0
promptRoulette db "[E] Стол: Классическая Рулетка",0
promptSlot777 db "[E] Автомат: Слоты 777 (Классика)",0
promptSlotClover db "[E] Автомат: CloverPit (Слоты 5х3)",0
promptSlotClassic db "[E] Автомат: Джекпот 777",0
promptUmamusume db "[E] Аркада: Скачки Umamusume Derby",0
promptSkillCheck db "[E] Аркада: DBD Skill Check (Крюк)",0
promptATM db "[E] Кассир / Банкомат (Смена профиля)",0
promptShop db "[E] VIP-Бутик: Рубашки карт и талисманы",0
promptOnline db "[E] Терминал: Онлайн Казино (Radmin VPN)",0
promptAchieve db "[E] Зал Славы: Достижения и награды",0
promptStats db "[E] Табло: Статистика по всем играм",0
promptDurak db "[E] Подпольный стол: Игра в Дурака",0
promptBuckshot db "[E] Подпольный стол: Buckshot Roulette",0
promptRussRoul db "[E] Подпольный стол: Русская Рулетка",0
promptDice db "[E] Стол: Кости (Craps)",0
promptSkulls db "[E] Стол: Черепа и Шарик",0
promptCoin db "[E] Стол: Монетка (Орел / Решка)",0
promptTraining db "[E] Стол: Режим тренировки",0
promptObserver db "[E] Стол: Наблюдатель (ИИ против ИИ)",0
promptDaily db "[E] Доска: Ежедневные задания",0
promptSettings db "[E] Терминал: Настройки игры",0
promptHell db "[E] Портал: Адская Башня (Этаж 666)",0
msgDancerTipped db "Вы дали $100 чаевых! Удача казино на вашей стороне!",0
msgNeedMoney db "Недостаточно фишек в банке!",0
msgGameReturned db "Вы вернулись в зал казино. Баланс сохранен!",0
; HUD and Pause Texts (CP1251)
textBankHUD db "БАНК: $",0
textPlayerHUD db "ИГРОК: ",0
textControlsHUD db "W/S: ВПЕРЕД/НАЗАД A/D: ПОВОРОТ E: ДЕЙСТВИЕ",0
textWindowKeysHUD db "F11: ЭКРАН ESC: МЕНЮ",0
textPauseTitle db "=== КАЗИНО НА ПАУЗЕ ===",0
textPauseResume db "ESC - ПРОДОЛЖИТЬ ИГРУ",0
textPauseMenu db "M - ГЛАВНОЕ МЕНЮ (КОНСОЛЬ)",0
textPauseQuit db "Q - СОХРАНИТЬ И ВЫЙТИ",0
ALIGN 4
screenBuffer dd SCREEN_SIZE dup(?)
ALIGN 4
zBuffer dd SCREEN_W dup(?)
ALIGN 4
texturesBuffer dd (48 * 128 * 128) dup(?)
hudNumBuffer db 32 dup(?)
.code
; --- 3D Window Procedure ---
Casino3DWndProc PROC hwnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
invoke WindowEvents3D, hwnd, uMsg, wParam, lParam
ret
Casino3DWndProc ENDP
; --- PRNG ---
RandomRange3D PROC maxVal:DWORD
push edx
push ecx
mov eax, rngSeed3D
imul eax, 1103515245
add eax, 12345
mov rngSeed3D, eax
shr eax, 16
and eax, 7FFFh
xor edx, edx
mov ecx, maxVal
test ecx, ecx
jz rr3d_zero
div ecx
mov eax, edx
rr3d_zero:
pop ecx
pop edx
ret
RandomRange3D ENDP
; --- Helper: Copy String ---
CopyString3D PROC src:DWORD, dst:DWORD
push esi
push edi
mov esi, src
mov edi, dst
cs3d_loop:
mov al, [esi]
mov [edi], al
test al, al
jz cs3d_done
inc esi
inc edi
jmp cs3d_loop
cs3d_done:
pop edi
pop esi
ret
CopyString3D ENDP
; --- Format Unsigned Integer to String ---
FormatNumber PROC num:DWORD, buf:DWORD
push ebx
push ecx
push edx
push edi
mov eax, num
mov edi, buf
test eax, eax
jnz fn_start
mov BYTE PTR [edi], '0'
mov BYTE PTR [edi+1], 0
pop edi
pop edx
pop ecx
pop ebx
ret
fn_start:
xor ecx, ecx
fn_div_loop:
test eax, eax
jz fn_write_loop
xor edx, edx
mov ebx, 10
div ebx
add dl, '0'
push edx
inc ecx
jmp fn_div_loop
fn_write_loop:
test ecx, ecx
jz fn_done
pop edx
mov [edi], dl
inc edi
dec ecx
jmp fn_write_loop
fn_done:
mov BYTE PTR [edi], 0
pop edi
pop edx
pop ecx
pop ebx
ret
FormatNumber ENDP
; --- Fast 2D Drawing Primitives (Scaled 2x to 640x480) ---
DrawBox PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
DrawPixel PROC x:DWORD, y:DWORD, color:DWORD
invoke DrawBox, x, y, 1, 1, color
ret
DrawPixel ENDP
DrawBox PROC x:DWORD, y:DWORD, w:DWORD, h:DWORD, color:DWORD
shl x, 1
shl y, 1
shl w, 1
shl h, 1
push ebx
push esi
push edi
mov eax, x
cmp eax, SCREEN_W
jge box_done
mov ecx, y
cmp ecx, SCREEN_H
jge box_done
mov esi, w
mov edi, h
mov eax, x
add eax, esi
cmp eax, SCREEN_W
jle @F
mov eax, SCREEN_W
sub eax, x
mov esi, eax
@@:
mov eax, y
add eax, edi
cmp eax, SCREEN_H
jle @F
mov eax, SCREEN_H
sub eax, y
mov edi, eax
@@:
test esi, esi
jle box_done
test edi, edi
jle box_done
mov edx, color
mov ecx, y
box_y_loop:
mov ebx, ecx
imul ebx, SCREEN_W
add ebx, x
push ecx
push edi
mov ecx, esi
lea edi, [screenBuffer + ebx*4]
mov eax, edx
rep stosd
pop edi
pop ecx
inc ecx
dec edi
jnz box_y_loop
box_done:
pop edi
pop esi
pop ebx
ret
DrawBox ENDP
DrawBoxBorder PROC uses ebx x:DWORD, y:DWORD, w:DWORD, h:DWORD, fillColor:DWORD, borderColor:DWORD, bWidth:DWORD
invoke DrawBox, x, y, w, h, borderColor
mov eax, x
add eax, bWidth
mov ecx, y
add ecx, bWidth
mov edx, w
mov ebx, bWidth
shl ebx, 1
sub edx, ebx
mov ebx, h
sub ebx, bWidth
sub ebx, bWidth
invoke DrawBox, eax, ecx, edx, ebx, fillColor
ret
DrawBoxBorder ENDP
DrawCircle PROC cxVal:DWORD, cyVal:DWORD, radius:DWORD, color:DWORD
local x:DWORD
local y:DWORD
local r2:DWORD
local dist2:DWORD
push ebx
push esi
push edi
mov eax, radius
imul eax, eax
mov r2, eax
mov eax, radius
neg eax
mov y, eax
circ_y:
mov eax, y
cmp eax, radius
jg circ_done
mov eax, radius
neg eax
mov x, eax
circ_x:
mov eax, x
cmp eax, radius
jg circ_next_y
mov eax, x
imul eax, eax
mov ebx, y
imul ebx, ebx
add eax, ebx
cmp eax, r2
jg circ_next_x
mov eax, cxVal
add eax, x
mov ecx, cyVal
add ecx, y
invoke DrawPixel, eax, ecx, color
circ_next_x:
inc x
jmp circ_x
circ_next_y:
inc y
jmp circ_y
circ_done:
pop edi
pop esi
pop ebx
ret
DrawCircle ENDP
DrawChar8x8 PROC uses ebx esi edi x:DWORD, y:DWORD, chVal:DWORD, color:DWORD
local column:DWORD
mov eax, chVal
and eax, 255
lea esi, [font8x8 + eax*8]
xor edi, edi
glyph_row:
movzx ebx, BYTE PTR [esi+edi]
mov column, 0
glyph_col:
test ebx, 80h
jz glyph_next
mov eax, x
add eax, column
mov edx, y
add edx, edi
invoke DrawPixel, eax, edx, color
glyph_next:
shl ebx, 1
inc column
cmp column, 8
jl glyph_col
inc edi
cmp edi, 8
jl glyph_row
ret
DrawChar8x8 ENDP
DrawString8x8 PROC x:DWORD, y:DWORD, strPtr:DWORD, color:DWORD
push ebx
push esi
mov esi, strPtr
mov ebx, x
str_loop:
movzx eax, BYTE PTR [esi]
test al, al
jz str_done
invoke DrawChar8x8, ebx, y, eax, color
add ebx, 8
inc esi
jmp str_loop
str_done:
pop esi
pop ebx
ret
DrawString8x8 ENDP
; --- Render 3D Ceiling and Floor ---
RenderCeilingAndFloor PROC uses ebx esi edi
local floorRow:DWORD
local pDist:DWORD
local fStepX:DWORD
local fStepY:DWORD
local fX:DWORD
local fY:DWORD
local shade:DWORD
local cShade:DWORD
mov edi, HALF_H
floor_scanlines:
cmp edi, SCREEN_H
jge floor_done
mov floorRow, edi
mov eax, edi
sub eax, HALF_H
inc eax
mov ecx, eax
mov eax, HALF_H * FP_1
cdq
idiv ecx
mov pDist, eax
mov edx, pDist
shr edx, 13
mov eax, 255
sub eax, edx
cmp eax, 35
jge @F
mov eax, 35
@@:
mov shade, eax
mov edx, eax
sub edx, 25
cmp edx, 20
jge @F
mov edx, 20
@@:
mov cShade, edx
mov eax, playerPlaneX
shl eax, 1
imul pDist
shrd eax, edx, 16
cdq
mov ecx, SCREEN_W
idiv ecx
mov fStepX, eax
mov eax, playerPlaneY
shl eax, 1
imul pDist
shrd eax, edx, 16
cdq
mov ecx, SCREEN_W
idiv ecx
mov fStepY, eax
mov eax, playerDirX
sub eax, playerPlaneX
imul pDist
shrd eax, edx, 16
add eax, playerX
mov fX, eax
mov eax, playerDirY
sub eax, playerPlaneY
imul pDist
shrd eax, edx, 16
add eax, playerY
mov fY, eax
xor esi, esi
col_floor_loop:
cmp esi, SCREEN_W
jge next_floor_row
; Floor Texture: Carpet (Slot 0 in casino3d-hd.bin)
mov eax, fX
shr eax, 9
and eax, 127
mov edx, fY
shr edx, 9
and edx, 127
shl edx, 7
add edx, eax
mov eax, [texturesBuffer + (0 * 128 * 128 * 4) + edx*4]
; Shade Floor RGB
mov ebx, shade
movzx ecx, al
imul ecx, ebx
shr ecx, 8
push ecx
movzx ecx, ah
imul ecx, ebx
shr ecx, 8
shl ecx, 8
shr eax, 16
movzx eax, al
imul eax, ebx
shr eax, 8
shl eax, 16
or eax, ecx
pop ecx
or eax, ecx
mov ecx, floorRow
imul ecx, SCREEN_W
add ecx, esi
mov [screenBuffer + ecx*4], eax
; Ceiling Texture: Recessed Lights (Slot 5)
mov eax, fX
shr eax, 10
and eax, 127
mov edx, fY
shr edx, 10
and edx, 127
shl edx, 7
add edx, eax
mov eax, [texturesBuffer + (5 * 128 * 128 * 4) + edx*4]
mov ebx, cShade
movzx ecx, al
imul ecx, ebx
shr ecx, 8
push ecx
movzx ecx, ah
imul ecx, ebx
shr ecx, 8
shl ecx, 8
shr eax, 16
movzx eax, al
imul eax, ebx
shr eax, 8
shl eax, 16
or eax, ecx
pop ecx
or eax, ecx
mov ecx, SCREEN_H - 1
sub ecx, floorRow
imul ecx, SCREEN_W
add ecx, esi
mov [screenBuffer + ecx*4], eax
mov eax, fStepX
add fX, eax
mov eax, fStepY
add fY, eax
inc esi
jmp col_floor_loop
next_floor_row:
inc edi
jmp floor_scanlines
floor_done:
ret
RenderCeilingAndFloor ENDP
; --- Render 3D Walls ---
RenderWalls PROC
local col:DWORD
local camX:DWORD
local rayDirX:DWORD
local rayDirY:DWORD
local mapX:DWORD
local mapY:DWORD
local deltaDistX:DWORD
local deltaDistY:DWORD
local stepX:DWORD
local stepY:DWORD
local sideDistX:DWORD
local sideDistY:DWORD
local side:DWORD
local perpWallDist:DWORD
local lineH:DWORD
local drawStart:DWORD
local drawEnd:DWORD
local wallHit:DWORD
local texX:DWORD
local texId:DWORD
local shade:DWORD
push ebx
push esi
push edi
mov eax, playerAngle
and eax, 511
mov ebx, [tableCos + eax*4]
mov playerDirX, ebx
mov ebx, [tableSin + eax*4]
mov playerDirY, ebx
mov eax, ebx
imul eax, -66
cdq
mov ecx, 100
idiv ecx
mov playerPlaneX, eax
mov eax, playerDirX
imul eax, 66
cdq
idiv ecx
mov playerPlaneY, eax
mov col, 0
col_loop:
cmp col, SCREEN_W
jge walls_done
mov eax, col
shl eax, 1
sub eax, SCREEN_W
imul eax, FP_1
cdq
mov ecx, SCREEN_W
idiv ecx
mov camX, eax
mov eax, playerPlaneX
imul camX
shrd eax, edx, 16
add eax, playerDirX
mov rayDirX, eax
mov eax, playerPlaneY
imul camX
shrd eax, edx, 16
add eax, playerDirY
mov rayDirY, eax
mov eax, playerX
sar eax, 16
mov mapX, eax
mov eax, playerY
sar eax, 16
mov mapY, eax
mov eax, rayDirX
test eax, eax
jnz calc_delta_x
mov deltaDistX, 7FFFFFFFh
jmp calc_delta_y
calc_delta_x:
test eax, eax
jns @F
neg eax
@@:
mov ebx, eax
xor eax, eax
mov edx, 1
idiv ebx
mov deltaDistX, eax
calc_delta_y:
mov eax, rayDirY
test eax, eax
jnz calc_delta_y_act
mov deltaDistY, 7FFFFFFFh
jmp calc_steps
calc_delta_y_act:
test eax, eax
jns @F
neg eax
@@:
mov ebx, eax
xor eax, eax
mov edx, 1
idiv ebx
mov deltaDistY, eax
calc_steps:
cmp rayDirX, 0
jge step_x_pos
mov stepX, -1
mov eax, playerX
mov edx, mapX
shl edx, 16
sub eax, edx
imul deltaDistX
shrd eax, edx, 16
mov sideDistX, eax
jmp check_step_y
step_x_pos:
mov stepX, 1
mov eax, mapX
inc eax
shl eax, 16
sub eax, playerX
imul deltaDistX
shrd eax, edx, 16
mov sideDistX, eax
check_step_y:
cmp rayDirY, 0
jge step_y_pos
mov stepY, -1
mov eax, playerY
mov edx, mapY
shl edx, 16
sub eax, edx
imul deltaDistY
shrd eax, edx, 16
mov sideDistY, eax
jmp dda_start
step_y_pos:
mov stepY, 1
mov eax, mapY
inc eax
shl eax, 16
sub eax, playerY
imul deltaDistY
shrd eax, edx, 16
mov sideDistY, eax
dda_start:
xor ecx, ecx
dda_step_loop:
inc ecx
cmp ecx, 64
jge hit_wall
mov eax, sideDistX
cmp eax, sideDistY
jge step_in_y
mov eax, deltaDistX
add sideDistX, eax
mov eax, stepX
add mapX, eax
mov side, 0
jmp check_tile
step_in_y:
mov eax, deltaDistY
add sideDistY, eax
mov eax, stepY
add mapY, eax
mov side, 1
check_tile:
cmp mapX, 0
jl hit_wall
cmp mapX, MAP_WIDTH
jge hit_wall
cmp mapY, 0
jl hit_wall
cmp mapY, MAP_HEIGHT
jge hit_wall
mov eax, mapY
shl eax, 5
add eax, mapX
movzx eax, BYTE PTR [casinoMap + eax]
test eax, eax
jnz hit_wall
jmp dda_step_loop
hit_wall:
cmp side, 0
jne perp_y
mov eax, sideDistX
sub eax, deltaDistX
mov perpWallDist, eax
jmp perp_done
perp_y:
mov eax, sideDistY
sub eax, deltaDistY
mov perpWallDist, eax
perp_done:
cmp perpWallDist, 2048
jge @F
mov perpWallDist, 2048
@@:
mov eax, col
mov edx, perpWallDist
mov [zBuffer + eax*4], edx
mov eax, SCREEN_H
imul eax, FP_1
cdq
idiv perpWallDist
mov lineH, eax
mov eax, lineH
shr eax, 1
mov ecx, HALF_H
sub ecx, eax
mov drawStart, ecx
mov eax, lineH
shr eax, 1
mov ecx, HALF_H
add ecx, eax
mov drawEnd, ecx
cmp side, 0
jne hit_side_y
mov eax, perpWallDist
imul rayDirY
shrd eax, edx, 16
add eax, playerY
mov wallHit, eax
jmp calc_tex_x
hit_side_y:
mov eax, perpWallDist
imul rayDirX
shrd eax, edx, 16
add eax, playerX
mov wallHit, eax
calc_tex_x:
mov eax, wallHit
and eax, 0FFFFh
imul eax, 128
shr eax, 16
mov texX, eax
cmp side, 0
jne check_flip_y
cmp rayDirX, 0
jle get_tex_id
mov eax, 127
sub eax, texX
mov texX, eax
jmp get_tex_id
check_flip_y:
cmp rayDirY, 0
jge get_tex_id
mov eax, 127
sub eax, texX
mov texX, eax
get_tex_id:
mov eax, mapY
shl eax, 5
add eax, mapX
movzx eax, BYTE PTR [casinoMap + eax]
test eax, eax
jnz @F
mov eax, 1
@@:
mov texId, eax
mov edx, perpWallDist
shr edx, 12
mov eax, 255
sub eax, edx
cmp eax, 40
jge @F
mov eax, 40
@@:
cmp side, 1
jne @F
imul eax, 180
shr eax, 8
@@:
mov shade, eax
cmp drawStart, 0
jge @F
mov drawStart, 0
@@:
cmp drawEnd, SCREEN_H
jl @F
mov drawEnd, SCREEN_H - 1
@@:
mov edi, drawStart
mov esi, lineH
test esi, esi
jnz render_wall_pixels
mov esi, 1
render_wall_pixels:
cmp edi, drawEnd
jge next_wall_col
mov eax, edi
shl eax, 1
sub eax, SCREEN_H
add eax, lineH
imul eax, 128
cdq
mov ecx, lineH
shl ecx, 1
idiv ecx
and eax, 127
mov edx, eax
shl edx, 7
add edx, texX
mov eax, texId
imul eax, (128 * 128 * 4)
add eax, OFFSET texturesBuffer
mov eax, [eax + edx*4]
mov ebx, shade
movzx ecx, al
imul ecx, ebx
shr ecx, 8
push ecx
movzx ecx, ah
imul ecx, ebx
shr ecx, 8
shl ecx, 8
shr eax, 16
movzx eax, al
imul eax, ebx
shr eax, 8
shl eax, 16
or eax, ecx
pop ecx
or eax, ecx
mov ecx, edi
imul ecx, SCREEN_W
add ecx, col
mov [screenBuffer + ecx*4], eax
inc edi
jmp render_wall_pixels
next_wall_col:
inc col
jmp col_loop
walls_done:
pop edi
pop esi
pop ebx
ret
RenderWalls ENDP
; --- Render 3D Sprites with Depth Sorting ---
RenderSprites PROC
local sprIdx:DWORD
local relX:DWORD
local relY:DWORD
local invDet:DWORD
local transX:DWORD
local transY:DWORD
local sprScreenX:DWORD
local sprH:DWORD
local sprW:DWORD
local drawStartY:DWORD
local drawEndY:DWORD
local drawStartX:DWORD
local drawEndX:DWORD
local stripe:DWORD
local texX:DWORD
local texY:DWORD
local shade:DWORD
local texSlot:DWORD
push ebx
push esi
push edi
xor esi, esi
calc_dist_loop:
cmp esi, NUM_SPRITES
jge sort_sprites
mov eax, esi
imul eax, SIZEOF SpriteObject
mov edx, [casinoSprites + eax].posX
sub edx, playerX
sar edx, 8
imul edx, edx
mov ebx, edx
mov edx, [casinoSprites + eax].posY
sub edx, playerY
sar edx, 8
imul edx, edx
add ebx, edx
mov [casinoSprites + eax].distSq, ebx
mov [sortedSprites + esi*4], esi
inc esi
jmp calc_dist_loop
sort_sprites:
xor esi, esi
sort_outer:
cmp esi, NUM_SPRITES - 1
jge draw_sorted_sprites
mov edi, esi
inc edi
sort_inner:
cmp edi, NUM_SPRITES
jge sort_next_outer
mov eax, [sortedSprites + esi*4]
imul eax, SIZEOF SpriteObject
mov eax, [casinoSprites + eax].distSq
mov ebx, [sortedSprites + edi*4]
imul ebx, SIZEOF SpriteObject
mov ebx, [casinoSprites + ebx].distSq
cmp eax, ebx
jge sort_no_swap
mov eax, [sortedSprites + esi*4]
mov edx, [sortedSprites + edi*4]
mov [sortedSprites + esi*4], edx
mov [sortedSprites + edi*4], eax
sort_no_swap:
inc edi
jmp sort_inner
sort_next_outer:
inc esi
jmp sort_outer
draw_sorted_sprites:
xor esi, esi
spr_draw_loop:
cmp esi, NUM_SPRITES
jge sprites_done
mov sprIdx, esi
mov eax, [sortedSprites + esi*4]
imul eax, SIZEOF SpriteObject
mov edi, eax
mov eax, [casinoSprites + edi].posX
sub eax, playerX
mov relX, eax
mov eax, [casinoSprites + edi].posY
sub eax, playerY
mov relY, eax
mov eax, playerPlaneX
imul playerDirY
shrd eax, edx, 16
mov ebx, eax
mov eax, playerPlaneY
imul playerDirX
shrd eax, edx, 16
sub ebx, eax
test ebx, ebx
jnz @F
mov ebx, 1
@@:
mov invDet, ebx
mov eax, playerDirY
imul relX
shrd eax, edx, 16
mov ebx, eax
mov eax, playerDirX
imul relY
shrd eax, edx, 16
sub ebx, eax
mov eax, ebx
shl eax, 16
cdq
idiv invDet
mov transX, eax
mov eax, playerPlaneX
neg eax
imul relY
shrd eax, edx, 16
mov ebx, eax
mov eax, playerPlaneY
imul relX
shrd eax, edx, 16
add ebx, eax
mov eax, ebx
shl eax, 16
cdq
idiv invDet
mov transY, eax
cmp transY, 2048
jle next_sprite_iter
mov eax, HALF_W
mov edx, transX
shl edx, 8
cdq
idiv transY
add eax, HALF_W
mov sprScreenX, eax
mov eax, SCREEN_H
imul eax, FP_1
cdq
idiv transY
mov sprH, eax
mov drawStartY, HALF_H
mov eax, sprH
shr eax, 1
sub drawStartY, eax
cmp drawStartY, 0
jge @F
mov drawStartY, 0
@@:
mov drawEndY, HALF_H
mov eax, sprH
shr eax, 1
add drawEndY, eax
cmp drawEndY, SCREEN_H
jl @F
mov drawEndY, SCREEN_H - 1
@@:
mov eax, sprH
mov sprW, eax
mov eax, sprScreenX
mov drawStartX, eax
mov eax, sprW
shr eax, 1
sub drawStartX, eax
cmp drawStartX, 0
jge @F
mov drawStartX, 0
@@:
mov eax, sprScreenX
mov drawEndX, eax
mov eax, sprW
shr eax, 1
add drawEndX, eax
cmp drawEndX, SCREEN_W
jl @F
mov drawEndX, SCREEN_W - 1
@@:
mov edx, transY
shr edx, 12
mov eax, 255
sub eax, edx
cmp eax, 40
jge @F
mov eax, 40
@@:
mov shade, eax
mov eax, [casinoSprites + edi].baseTexId
add eax, [casinoSprites + edi].curFrame
mov texSlot, eax
mov eax, [casinoSprites + edi].frameCount
cmp eax, 1
jle skip_anim
mov eax, [casinoSprites + edi].animTimer
inc eax
mov [casinoSprites + edi].animTimer, eax
cmp eax, [casinoSprites + edi].animSpeed
jl skip_anim
mov [casinoSprites + edi].animTimer, 0
mov eax, [casinoSprites + edi].curFrame
inc eax
cmp eax, [casinoSprites + edi].frameCount
jl @F
xor eax, eax
@@:
mov [casinoSprites + edi].curFrame, eax
skip_anim:
mov ecx, drawStartX
mov stripe, ecx
stripe_loop:
mov ecx, stripe
cmp ecx, drawEndX
jge next_sprite_iter
mov eax, ecx
shl eax, 1
sub eax, sprScreenX
shl eax, 1
add eax, sprW
imul eax, 128
cdq
mov ebx, sprW
shl ebx, 1
test ebx, ebx
jnz @F
mov ebx, 1
@@:
idiv ebx
mov texX, eax
and texX, 127
cmp transY, 0
jle next_stripe
mov eax, stripe
cmp eax, 0
jl next_stripe
cmp eax, SCREEN_W
jge next_stripe
mov edx, [zBuffer + eax*4]
cmp transY, edx
jge next_stripe
mov edi, drawStartY
spr_pixel_loop:
cmp edi, drawEndY
jge next_stripe
mov eax, edi
shl eax, 1
sub eax, SCREEN_H
add eax, sprH
imul eax, 128
cdq
mov ebx, sprH
shl ebx, 1
test ebx, ebx
jnz @F
mov ebx, 1
@@:
idiv ebx
mov texY, eax
and texY, 127
mov edx, texY
shl edx, 7
add edx, texX
mov eax, texSlot
imul eax, (128 * 128 * 4)
add eax, OFFSET texturesBuffer
mov eax, [eax + edx*4]
; Alpha/Chroma Key Check (Magenta 0x00FF00FF and transparent black)
cmp eax, 00FF00FFh
je next_spr_y
test eax, eax
jz next_spr_y
mov ebx, shade
movzx ecx, al
imul ecx, ebx
shr ecx, 8
push ecx
movzx ecx, ah
imul ecx, ebx
shr ecx, 8
shl ecx, 8
shr eax, 16
movzx eax, al
imul eax, ebx
shr eax, 8
shl eax, 16
or eax, ecx
pop ecx
or eax, ecx
mov ecx, edi
imul ecx, SCREEN_W
add ecx, stripe
mov [screenBuffer + ecx*4], eax
next_spr_y:
inc edi
jmp spr_pixel_loop
next_stripe:
inc stripe
jmp stripe_loop
next_sprite_iter:
mov esi, sprIdx
inc esi
jmp spr_draw_loop
sprites_done:
pop edi
pop esi
pop ebx
ret
RenderSprites ENDP
; --- Render HUD (Russian CP1251) ---
RenderHUD PROC uses ebx esi edi
; Top Bar
invoke DrawBox, 0, 0, 320, 16, 0014191Dh
invoke DrawString8x8, 8, 4, OFFSET textBankHUD, 00D8BC6Ah
invoke FormatNumber, bankroll, OFFSET hudNumBuffer
invoke DrawString8x8, 56, 4, OFFSET hudNumBuffer, 00FFFFFFh
; Player Name
invoke DrawString8x8, 128, 4, OFFSET textPlayerHUD, 00D8BC6Ah
invoke DrawString8x8, 172, 4, OFFSET saveFileName, 0000D7FFh
; Screen Keys
invoke DrawString8x8, 252, 4, OFFSET textWindowKeysHUD, 00A8B6BBh
; Bottom Control Bar
invoke DrawBox, 0, 226, 320, 14, 0014191Dh
invoke DrawString8x8, 8, 230, OFFSET textControlsHUD, 00A8B6BBh
; Center Crosshair Dot
invoke DrawBox, 159, 118, 2, 5, 00E7DFC8h
invoke DrawBox, 157, 120, 6, 1, 00E7DFC8h
; Target Interaction Prompt (when close to a table/machine)
cmp interactPromptPtr, 0
je @F
invoke DrawBoxBorder, 4, 196, 312, 22, 0014191Dh, 00D8BC6Ah, 1
invoke DrawString8x8, 10, 203, interactPromptPtr, 00F5E2B0h
@@:
; Flash Notification Message
cmp flashTimer, 0
je hud_finished
dec flashTimer
invoke DrawBox, 4, 22, 312, 16, 0014191Dh
invoke DrawString8x8, 10, 26, OFFSET flashMessage, 00FFFFFFh
hud_finished:
ret
RenderHUD ENDP
; --- Render Radar Minimap ---
RenderMinimap PROC uses ebx esi edi
local radarX:DWORD
local radarY:DWORD
local radarSize:DWORD
mov radarX, 320 - 52
mov radarY, 20
mov radarSize, 48
invoke DrawBoxBorder, radarX, radarY, radarSize, radarSize, 00101510h, 0000D7FFh, 1
; Draw all 28 Sprites on radar
xor esi, esi
radar_spr_loop:
cmp esi, NUM_SPRITES
jge draw_player_radar
mov eax, esi
imul eax, SIZEOF SpriteObject
mov eax, [casinoSprites + eax].posX
sar eax, 16
imul eax, radarSize
shr eax, 5
add eax, radarX
mov ebx, eax
mov eax, esi
imul eax, SIZEOF SpriteObject
mov eax, [casinoSprites + eax].posY
sar eax, 16
imul eax, radarSize
shr eax, 5
add eax, radarY
invoke DrawPixel, ebx, eax, 00FFAA00h
inc esi
jmp radar_spr_loop
draw_player_radar:
mov eax, playerX
sar eax, 16
imul eax, radarSize
shr eax, 5
add eax, radarX
mov ebx, eax
mov eax, playerY
sar eax, 16
imul eax, radarSize
shr eax, 5
add eax, radarY
invoke DrawPixel, ebx, eax, 0000FF00h
ret
RenderMinimap ENDP
; --- Player Movement & Input ---
HandlePlayerInput PROC uses ebx esi edi
local nextX:DWORD
local nextY:DWORD
local speed:DWORD
mov speed, 131072
mov eax, deltaTime3D
imul eax, speed
mov ecx, 16
cdq
idiv ecx
mov speed, eax
; Turning A / D
xor eax, eax
cmp keys3D[41h], 0 ; A
jne @F
cmp keys3D[25h], 0 ; Left Arrow
je check_turn_right
@@:
mov eax, 6
sub playerAngle, eax
and playerAngle, 511
jmp input_forward
check_turn_right:
cmp keys3D[44h], 0 ; D
jne @F
cmp keys3D[27h], 0 ; Right Arrow
je input_forward
@@:
mov eax, 6
add playerAngle, eax
and playerAngle, 511
input_forward:
call UpdateCamera3D
xor edi, edi
cmp keys3D[57h], 0 ; W
jne input_go_forward
cmp keys3D[26h], 0 ; Up Arrow
je input_back
input_go_forward:
inc edi
input_back:
cmp keys3D[53h], 0 ; S
jne input_go_back
cmp keys3D[28h], 0 ; Down Arrow
je input_move
input_go_back:
dec edi
input_move:
test edi, edi
jz input_action
imul edi, speed
mov eax, playerDirX
imul edi
shrd eax, edx, 16
add eax, playerX
mov nextX, eax
mov eax, playerDirY
imul edi
shrd eax, edx, 16
add eax, playerY
mov nextY, eax
invoke CanWalk3D, nextX, playerY
test eax, eax
jz @F
mov eax, nextX
mov playerX, eax
@@:
invoke CanWalk3D, playerX, nextY
test eax, eax
jz input_action
mov eax, nextY
mov playerY, eax
input_action:
; Key E (0x45) or Space (0x20)
invoke Pressed3D, 45h
test eax, eax
jnz do_action
invoke Pressed3D, 20h
test eax, eax
jz @F
do_action:
call Trigger3DInteraction
@@:
ret
HandlePlayerInput ENDP
; --- Check Nearest Interactive Object ---
CheckInteractions PROC uses ebx esi edi
local nearest:DWORD
mov nearest, 360000 ; Detection radius squared (~2.4 tiles)
mov interactTargetId, 0
mov interactPromptPtr, 0
xor esi, esi
interaction_scan:
cmp esi, NUM_SPRITES
jge interaction_done
mov eax, esi
imul eax, SIZEOF SpriteObject
mov edi, eax
cmp [casinoSprites+edi].interactId, 0
je interaction_next
mov eax, [casinoSprites+edi].posX
sub eax, playerX
sar eax, 8
mov ebx, eax
imul ebx, ebx
mov eax, [casinoSprites+edi].posY
sub eax, playerY
sar eax, 8
imul eax, eax
add ebx, eax
cmp ebx, nearest
jae interaction_next
mov nearest, ebx
mov eax, [casinoSprites+edi].interactId
mov interactTargetId, eax
mov eax, [casinoSprites+edi].promptPtr
mov interactPromptPtr, eax
interaction_next:
inc esi
jmp interaction_scan
interaction_done:
ret
CheckInteractions ENDP
; --- Seamless Bridge: Launch Console Game from 3D ---
RunConsoleGameFrom3D PROC uses ebx esi edi gameProc:DWORD, gameId:DWORD
mov eax, gameId
mov currentGameId, eax
; Hide 3D window
cmp h3DWnd, 0
je @F
invoke ShowWindow, h3DWnd, SW_HIDE
@@:
; Show and maximize console window
cmp hCasinoConsole, 0
je run_call_target
invoke ShowWindow, hCasinoConsole, SW_MAXIMIZE
invoke SetForegroundWindow, hCasinoConsole
run_call_target:
; Run the target game procedure
mov eax, gameProc
call eax
; Save progress
call SaveGame
; Hide console window again
cmp hCasinoConsole, 0
je restore_3d_view
invoke ShowWindow, hCasinoConsole, SW_HIDE
restore_3d_view:
; Restore 3D window
cmp h3DWnd, 0
je flush_input_keys
invoke ShowWindow, h3DWnd, SW_SHOW
invoke SetForegroundWindow, h3DWnd
flush_input_keys:
lea edi, keys3D
xor eax, eax
mov ecx, 64
rep stosd
lea edi, pressedKeys3D
xor eax, eax
mov ecx, 64
rep stosd
invoke CopyString3D, OFFSET msgGameReturned, OFFSET flashMessage
mov flashTimer, 120
ret
RunConsoleGameFrom3D ENDP
; --- Trigger Interaction based on Target ID ---
Trigger3DInteraction PROC uses ebx esi edi
mov eax, interactTargetId
test eax, eax
jz trigger_exit
; 1: Blackjack / 21
cmp eax, 1
jne @F
invoke RunConsoleGameFrom3D, OFFSET Game21, 1
ret
@@:
; 2: Poker (Texas Hold'em)
cmp eax, 2
jne @F
invoke RunConsoleGameFrom3D, OFFSET GamePoker, 2
ret
@@:
; 3: Slots 777 (Classic)
cmp eax, 3
jne @F
call PlaySlotIntroSound
invoke RunConsoleGameFrom3D, OFFSET GameClassicSlot, 9
ret
@@:
; 4: Slots CloverPit (5x3)
cmp eax, 4
jne @F
call PlaySlotIntroSound
invoke RunConsoleGameFrom3D, OFFSET GameSlot, 3
ret
@@:
; 5: Casino European Roulette
cmp eax, 5
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameCasinoRoulette, 8
ret
@@:
; 6: Classic Roulette
cmp eax, 6
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameRoulette, 4
ret
@@:
; 7: Durak (Дурак)
cmp eax, 7
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameDurak, 10
ret
@@:
; 8: Buckshot Roulette
cmp eax, 8
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameBuckshot, 0
ret
@@:
; 9: Russian Roulette (Подпольная)
cmp eax, 9
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameRoulette, 4
ret
@@:
; 10: Skulls and Cups (Черепа)
cmp eax, 10
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameSkulls, 5
ret
@@:
; 11: Dice (Кости)
cmp eax, 11
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameDice, 7
ret
@@:
; 12: Coin (Монетка)
cmp eax, 12
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameCoin, 6
ret
@@:
; 13: DBD Skill Check (Крюк)
cmp eax, 13
jne @F
mov tournamentMode, 0
invoke RunConsoleGameFrom3D, OFFSET GameSkillCheck, 11
ret
@@:
; 14: Umamusume Derby (Скачки)
cmp eax, 14
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameUmamusume, 0
ret
@@:
; 15: Hell Tower / Floor 666 (Адская Башня)
cmp eax, 15
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameTournament, 0
ret
@@:
; 16: Online Casino (Radmin VPN)
cmp eax, 16
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameOnlineCasino, 0
ret
@@:
; 17: VIP Boutique / Shop (Магазин рубашек и талисманов)
cmp eax, 17
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameShop, 0
ret
@@:
; 18: ATM / Cashier (Кассир / Банкомат)
cmp eax, 18
jne @F
invoke RunConsoleGameFrom3D, OFFSET AccountMenu, 0
ret
@@:
; 19: Hall of Fame / Achievements (Достижения)
cmp eax, 19
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameAchievements, 0
ret
@@:
; 20: Stats Board (Табло статистики)
cmp eax, 20
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameStatsByGame, 0
ret
@@:
; 21: Daily Tasks (Ежедневные задания)
cmp eax, 21
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameDailyTasks, 0
ret
@@:
; 22: Settings (Настройки)
cmp eax, 22
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameSettings, 0
ret
@@:
; 23: Training Mode (Тренировка)
cmp eax, 23
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameTraining, 0
ret
@@:
; 24: Observer Mode (Наблюдатель ИИ)
cmp eax, 24
jne @F
invoke RunConsoleGameFrom3D, OFFSET GameObserver, 0
ret
@@:
; 25: Cabaret Dancers (Чаевые $100)
cmp eax, 25
jne trigger_exit
cmp bankroll, 100
jl dancer_no_cash
sub bankroll, 100
inc dancerLuckBuff
invoke CopyString3D, OFFSET msgDancerTipped, OFFSET flashMessage
mov flashTimer, 120
invoke PlaySoundA, OFFSET soundJackpot, 0, 1
call SaveGame
ret
dancer_no_cash:
invoke CopyString3D, OFFSET msgNeedMoney, OFFSET flashMessage
mov flashTimer, 60
ret
trigger_exit:
ret
Trigger3DInteraction ENDP
; --- Initialize 3D Engine & All 28 Sprites ---
Init3DEngine PROC
push ebx
push esi
push edi
call Create3DWindow
test eax, eax
jz init_failed
call LoadTextures3D
test eax, eax
jz init_failed
; --- 0: VIP Dancer 1 (Stage Left) ---
mov casinoSprites[0*SIZEOF SpriteObject].posX, (13 * FP_1 + FP_HALF)
mov casinoSprites[0*SIZEOF SpriteObject].posY, (4 * FP_1)
mov casinoSprites[0*SIZEOF SpriteObject].baseTexId, 10
mov casinoSprites[0*SIZEOF SpriteObject].frameCount, 12
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, 25
mov casinoSprites[0*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer1
; --- 1: VIP Dancer 2 (Center Stage) ---
mov casinoSprites[1*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF)
mov casinoSprites[1*SIZEOF SpriteObject].posY, (3 * FP_1 + FP_HALF)
mov casinoSprites[1*SIZEOF SpriteObject].baseTexId, 10
mov casinoSprites[1*SIZEOF SpriteObject].frameCount, 12
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, 25
mov casinoSprites[1*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer2
; --- 2: VIP Dancer 3 (Stage Right) ---
mov casinoSprites[2*SIZEOF SpriteObject].posX, (19 * FP_1 + FP_HALF)
mov casinoSprites[2*SIZEOF SpriteObject].posY, (4 * FP_1)
mov casinoSprites[2*SIZEOF SpriteObject].baseTexId, 10
mov casinoSprites[2*SIZEOF SpriteObject].frameCount, 12
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, 25
mov casinoSprites[2*SIZEOF SpriteObject].promptPtr, OFFSET promptDancer3
; --- 3: Blackjack / 21 ---
mov casinoSprites[3*SIZEOF SpriteObject].posX, (12 * FP_1 + FP_HALF)
mov casinoSprites[3*SIZEOF SpriteObject].posY, (9 * FP_1)
mov casinoSprites[3*SIZEOF SpriteObject].baseTexId, 31
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, 0
mov casinoSprites[3*SIZEOF SpriteObject].interactId, 1
mov casinoSprites[3*SIZEOF SpriteObject].promptPtr, OFFSET promptBlackjack
; --- 4: Poker (Texas Hold'em) ---
mov casinoSprites[4*SIZEOF SpriteObject].posX, (19 * FP_1 + FP_HALF)
mov casinoSprites[4*SIZEOF SpriteObject].posY, (9 * FP_1)
mov casinoSprites[4*SIZEOF SpriteObject].baseTexId, 35
mov casinoSprites[4*SIZEOF SpriteObject].frameCount, 1
mov casinoSprites[4*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[4*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[4*SIZEOF SpriteObject].animSpeed, 0
mov casinoSprites[4*SIZEOF SpriteObject].interactId, 2
mov casinoSprites[4*SIZEOF SpriteObject].promptPtr, OFFSET promptPoker
; --- 5: Casino European Roulette ---
mov casinoSprites[5*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF)
mov casinoSprites[5*SIZEOF SpriteObject].posY, (9 * FP_1)
mov casinoSprites[5*SIZEOF SpriteObject].baseTexId, 32
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, 0
mov casinoSprites[5*SIZEOF SpriteObject].interactId, 5
mov casinoSprites[5*SIZEOF SpriteObject].promptPtr, OFFSET promptCasinoRoul
; --- 6: Classic Roulette ---
mov casinoSprites[6*SIZEOF SpriteObject].posX, (16 * FP_1 + FP_HALF)
mov casinoSprites[6*SIZEOF SpriteObject].posY, (12 * FP_1)
mov casinoSprites[6*SIZEOF SpriteObject].baseTexId, 32
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, 0
mov casinoSprites[6*SIZEOF SpriteObject].interactId, 6
mov casinoSprites[6*SIZEOF SpriteObject].promptPtr, OFFSET promptRoulette
; --- 7: Slots 777 (West Arcade) ---
mov casinoSprites[7*SIZEOF SpriteObject].posX, (5 * FP_1)
mov casinoSprites[7*SIZEOF SpriteObject].posY, (7 * FP_1)
mov casinoSprites[7*SIZEOF SpriteObject].baseTexId, 24
mov casinoSprites[7*SIZEOF SpriteObject].frameCount, 3
mov casinoSprites[7*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[7*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[7*SIZEOF SpriteObject].animSpeed, 6
mov casinoSprites[7*SIZEOF SpriteObject].interactId, 3
mov casinoSprites[7*SIZEOF SpriteObject].promptPtr, OFFSET promptSlot777
; --- 8: Slots CloverPit (5x3) ---
mov casinoSprites[8*SIZEOF SpriteObject].posX, (5 * FP_1)
mov casinoSprites[8*SIZEOF SpriteObject].posY, (10 * FP_1)
mov casinoSprites[8*SIZEOF SpriteObject].baseTexId, 24
mov casinoSprites[8*SIZEOF SpriteObject].frameCount, 3
mov casinoSprites[8*SIZEOF SpriteObject].curFrame, 1
mov casinoSprites[8*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[8*SIZEOF SpriteObject].animSpeed, 6
mov casinoSprites[8*SIZEOF SpriteObject].interactId, 4
mov casinoSprites[8*SIZEOF SpriteObject].promptPtr, OFFSET promptSlotClover
; --- 9: Classic Jackpot Slot ---
mov casinoSprites[9*SIZEOF SpriteObject].posX, (5 * FP_1)
mov casinoSprites[9*SIZEOF SpriteObject].posY, (13 * FP_1)
mov casinoSprites[9*SIZEOF SpriteObject].baseTexId, 24
mov casinoSprites[9*SIZEOF SpriteObject].frameCount, 3
mov casinoSprites[9*SIZEOF SpriteObject].curFrame, 2
mov casinoSprites[9*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[9*SIZEOF SpriteObject].animSpeed, 6
mov casinoSprites[9*SIZEOF SpriteObject].interactId, 3
mov casinoSprites[9*SIZEOF SpriteObject].promptPtr, OFFSET promptSlotClassic
; --- 10: Umamusume Derby Arcade ---
mov casinoSprites[10*SIZEOF SpriteObject].posX, (5 * FP_1)
mov casinoSprites[10*SIZEOF SpriteObject].posY, (16 * FP_1)
mov casinoSprites[10*SIZEOF SpriteObject].baseTexId, 36
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, 0
mov casinoSprites[10*SIZEOF SpriteObject].interactId, 14
mov casinoSprites[10*SIZEOF SpriteObject].promptPtr, OFFSET promptUmamusume
; --- 11: DBD Skillcheck Arcade ---
mov casinoSprites[11*SIZEOF SpriteObject].posX, (5 * FP_1)
mov casinoSprites[11*SIZEOF SpriteObject].posY, (19 * FP_1)
mov casinoSprites[11*SIZEOF SpriteObject].baseTexId, 36
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, 0
mov casinoSprites[11*SIZEOF SpriteObject].interactId, 13
mov casinoSprites[11*SIZEOF SpriteObject].promptPtr, OFFSET promptSkillCheck
; --- 12: Cashier / ATM (East Wing) ---
mov casinoSprites[12*SIZEOF SpriteObject].posX, (27 * FP_1)
mov casinoSprites[12*SIZEOF SpriteObject].posY, (7 * FP_1)
mov casinoSprites[12*SIZEOF SpriteObject].baseTexId, 33
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, 0
mov casinoSprites[12*SIZEOF SpriteObject].interactId, 18
mov casinoSprites[12*SIZEOF SpriteObject].promptPtr, OFFSET promptATM
; --- 13: VIP Boutique / Bar Counter ---
mov casinoSprites[13*SIZEOF SpriteObject].posX, (27 * FP_1)
mov casinoSprites[13*SIZEOF SpriteObject].posY, (10 * 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, 0
mov casinoSprites[13*SIZEOF SpriteObject].interactId, 17
mov casinoSprites[13*SIZEOF SpriteObject].promptPtr, OFFSET promptShop
; --- 14: Online Casino Terminal ---
mov casinoSprites[14*SIZEOF SpriteObject].posX, (27 * FP_1)
mov casinoSprites[14*SIZEOF SpriteObject].posY, (13 * FP_1)
mov casinoSprites[14*SIZEOF SpriteObject].baseTexId, 36
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, 0
mov casinoSprites[14*SIZEOF SpriteObject].interactId, 16
mov casinoSprites[14*SIZEOF SpriteObject].promptPtr, OFFSET promptOnline
; --- 15: Hall of Fame / Achievements ---
mov casinoSprites[15*SIZEOF SpriteObject].posX, (27 * FP_1)
mov casinoSprites[15*SIZEOF SpriteObject].posY, (16 * FP_1)
mov casinoSprites[15*SIZEOF SpriteObject].baseTexId, 36
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, 0
mov casinoSprites[15*SIZEOF SpriteObject].interactId, 19
mov casinoSprites[15*SIZEOF SpriteObject].promptPtr, OFFSET promptAchieve
; --- 16: Stats Board ---
mov casinoSprites[16*SIZEOF SpriteObject].posX, (27 * FP_1)
mov casinoSprites[16*SIZEOF SpriteObject].posY, (19 * FP_1)
mov casinoSprites[16*SIZEOF SpriteObject].baseTexId, 36
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, 0
mov casinoSprites[16*SIZEOF SpriteObject].interactId, 20
mov casinoSprites[16*SIZEOF SpriteObject].promptPtr, OFFSET promptStats
; --- 17: Durak Card Table (South Backroom) ---
mov casinoSprites[17*SIZEOF SpriteObject].posX, (12 * FP_1)
mov casinoSprites[17*SIZEOF SpriteObject].posY, (23 * FP_1)
mov casinoSprites[17*SIZEOF SpriteObject].baseTexId, 37
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, 0
mov casinoSprites[17*SIZEOF SpriteObject].interactId, 7
mov casinoSprites[17*SIZEOF SpriteObject].promptPtr, OFFSET promptDurak
; --- 18: Buckshot Roulette Table ---
mov casinoSprites[18*SIZEOF SpriteObject].posX, (16 * FP_1)
mov casinoSprites[18*SIZEOF SpriteObject].posY, (23 * FP_1)
mov casinoSprites[18*SIZEOF SpriteObject].baseTexId, 34
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, 0
mov casinoSprites[18*SIZEOF SpriteObject].interactId, 8
mov casinoSprites[18*SIZEOF SpriteObject].promptPtr, OFFSET promptBuckshot
; --- 19: Russian Roulette Table ---
mov casinoSprites[19*SIZEOF SpriteObject].posX, (20 * FP_1)
mov casinoSprites[19*SIZEOF SpriteObject].posY, (23 * 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, 0
mov casinoSprites[19*SIZEOF SpriteObject].interactId, 9
mov casinoSprites[19*SIZEOF SpriteObject].promptPtr, OFFSET promptRussRoul
; --- 20: Craps / Dice Table ---
mov casinoSprites[20*SIZEOF SpriteObject].posX, (12 * FP_1)
mov casinoSprites[20*SIZEOF SpriteObject].posY, (26 * FP_1)
mov casinoSprites[20*SIZEOF SpriteObject].baseTexId, 38
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, 0
mov casinoSprites[20*SIZEOF SpriteObject].interactId, 11
mov casinoSprites[20*SIZEOF SpriteObject].promptPtr, OFFSET promptDice
; --- 21: Skulls and Cups Table ---
mov casinoSprites[21*SIZEOF SpriteObject].posX, (16 * FP_1)
mov casinoSprites[21*SIZEOF SpriteObject].posY, (26 * FP_1)
mov casinoSprites[21*SIZEOF SpriteObject].baseTexId, 38
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, 0
mov casinoSprites[21*SIZEOF SpriteObject].interactId, 10
mov casinoSprites[21*SIZEOF SpriteObject].promptPtr, OFFSET promptSkulls
; --- 22: Coin Flip Table ---
mov casinoSprites[22*SIZEOF SpriteObject].posX, (20 * FP_1)
mov casinoSprites[22*SIZEOF SpriteObject].posY, (26 * FP_1)
mov casinoSprites[22*SIZEOF SpriteObject].baseTexId, 38
mov casinoSprites[22*SIZEOF SpriteObject].frameCount, 1
mov casinoSprites[22*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[22*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[22*SIZEOF SpriteObject].animSpeed, 0
mov casinoSprites[22*SIZEOF SpriteObject].interactId, 12
mov casinoSprites[22*SIZEOF SpriteObject].promptPtr, OFFSET promptCoin
; --- 23: Training Table ---
mov casinoSprites[23*SIZEOF SpriteObject].posX, (10 * FP_1)
mov casinoSprites[23*SIZEOF SpriteObject].posY, (14 * FP_1)
mov casinoSprites[23*SIZEOF SpriteObject].baseTexId, 37
mov casinoSprites[23*SIZEOF SpriteObject].frameCount, 1
mov casinoSprites[23*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[23*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[23*SIZEOF SpriteObject].animSpeed, 0
mov casinoSprites[23*SIZEOF SpriteObject].interactId, 23
mov casinoSprites[23*SIZEOF SpriteObject].promptPtr, OFFSET promptTraining
; --- 24: Observer Mode AI vs AI ---
mov casinoSprites[24*SIZEOF SpriteObject].posX, (22 * FP_1)
mov casinoSprites[24*SIZEOF SpriteObject].posY, (14 * FP_1)
mov casinoSprites[24*SIZEOF SpriteObject].baseTexId, 37
mov casinoSprites[24*SIZEOF SpriteObject].frameCount, 1
mov casinoSprites[24*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[24*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[24*SIZEOF SpriteObject].animSpeed, 0
mov casinoSprites[24*SIZEOF SpriteObject].interactId, 24
mov casinoSprites[24*SIZEOF SpriteObject].promptPtr, OFFSET promptObserver
; --- 25: Daily Tasks Board ---
mov casinoSprites[25*SIZEOF SpriteObject].posX, (27 * FP_1)
mov casinoSprites[25*SIZEOF SpriteObject].posY, (22 * FP_1)
mov casinoSprites[25*SIZEOF SpriteObject].baseTexId, 36
mov casinoSprites[25*SIZEOF SpriteObject].frameCount, 1
mov casinoSprites[25*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[25*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[25*SIZEOF SpriteObject].animSpeed, 0
mov casinoSprites[25*SIZEOF SpriteObject].interactId, 21
mov casinoSprites[25*SIZEOF SpriteObject].promptPtr, OFFSET promptDaily
; --- 26: Settings Terminal ---
mov casinoSprites[26*SIZEOF SpriteObject].posX, (27 * FP_1)
mov casinoSprites[26*SIZEOF SpriteObject].posY, (25 * FP_1)
mov casinoSprites[26*SIZEOF SpriteObject].baseTexId, 36
mov casinoSprites[26*SIZEOF SpriteObject].frameCount, 1
mov casinoSprites[26*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[26*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[26*SIZEOF SpriteObject].animSpeed, 0
mov casinoSprites[26*SIZEOF SpriteObject].interactId, 22
mov casinoSprites[26*SIZEOF SpriteObject].promptPtr, OFFSET promptSettings
; --- 27: Demon Portal: Hell Tower Floor 666 ---
mov casinoSprites[27*SIZEOF SpriteObject].posX, (16 * FP_1)
mov casinoSprites[27*SIZEOF SpriteObject].posY, (29 * FP_1)
mov casinoSprites[27*SIZEOF SpriteObject].baseTexId, 39
mov casinoSprites[27*SIZEOF SpriteObject].frameCount, 1
mov casinoSprites[27*SIZEOF SpriteObject].curFrame, 0
mov casinoSprites[27*SIZEOF SpriteObject].animTimer, 0
mov casinoSprites[27*SIZEOF SpriteObject].animSpeed, 0
mov casinoSprites[27*SIZEOF SpriteObject].interactId, 15
mov casinoSprites[27*SIZEOF SpriteObject].promptPtr, OFFSET promptHell
mov eax, 1
jmp init_return
init_failed:
xor eax, eax
init_return:
pop edi
pop esi
pop ebx
ret
Init3DEngine ENDP
; --- Main 3D Engine Loop ---
StartCasino3D PROC uses ebx esi edi
call Init3DEngine
test eax, eax
jz engine_shutdown
invoke GetTickCount
mov rngSeed3D, eax
mov previousTick3D, eax
engine_loop:
invoke PeekMessageA, OFFSET msg3D, 0, 0, 0, PM_REMOVE
test eax, eax
jz dispatch_frame
cmp msg3D.message, WM_QUIT
je engine_shutdown
invoke TranslateMessage, OFFSET msg3D
invoke DispatchMessageA, OFFSET msg3D
jmp engine_loop
dispatch_frame:
invoke GetTickCount
mov frameStart3D, eax
sub eax, previousTick3D
cmp eax, 50
jbe @F
mov eax, 50
@@:
mov deltaTime3D, eax
mov eax, frameStart3D
mov previousTick3D, eax
invoke GetForegroundWindow
cmp eax, h3DWnd
jne engine_idle
invoke IsIconic, h3DWnd
test eax, eax
jnz engine_idle
; F11: Fullscreen Toggle
invoke Pressed3D, 7Ah
test eax, eax
jz @F
call ToggleFullscreen3D
@@:
; ESC: Pause Menu Toggle
invoke Pressed3D, 1Bh
test eax, eax
jz engine_tick
xor paused3D, 1
engine_tick:
cmp paused3D, 0
jne draw_pause
mov eax, deltaTime3D
add animationClock3D, eax
call UpdateCamera3D
call CheckInteractions
call HandlePlayerInput
call UpdateCamera3D
call RenderCeilingAndFloor
call RenderWalls
call RenderSprites
call RenderHUD
call RenderMinimap
jmp present_frame
draw_pause:
; Dim overlay behind pause box
invoke DrawBoxBorder, 40, 50, 240, 140, 00151C21h, 00D8BC6Ah, 2
invoke DrawString8x8, 64, 70, OFFSET textPauseTitle, 00FFFFFFh
invoke DrawString8x8, 56, 100, OFFSET textPauseResume, 00D8BC6Ah
invoke DrawString8x8, 56, 125, OFFSET textPauseMenu, 0000D7FFh
invoke DrawString8x8, 56, 150, OFFSET textPauseQuit, 00BBBBBBh
; Key M: Classic Console Menu
invoke Pressed3D, 4Dh
test eax, eax
jz check_quit_key
mov paused3D, 0
invoke RunConsoleGameFrom3D, OFFSET MainMenu, 0
jmp present_frame
check_quit_key:
; Key Q: Save and Quit
invoke Pressed3D, 51h
test eax, eax
jnz engine_shutdown
present_frame:
call Present3D
lea edi, pressedKeys3D
xor eax, eax
mov ecx, 64
rep stosd
invoke GetTickCount
sub eax, frameStart3D
cmp eax, 16
jae engine_loop
mov ecx, 16
sub ecx, eax
invoke Sleep, ecx
jmp engine_loop
engine_idle:
invoke Sleep, 50
jmp engine_loop
engine_shutdown:
call SaveGame
cmp h3DDC, 0
je @F
invoke ReleaseDC, h3DWnd, h3DDC
mov h3DDC, 0
@@:
cmp h3DWnd, 0
je @F
invoke DestroyWindow, h3DWnd
mov h3DWnd, 0
@@:
cmp hCasinoConsole, 0
je @F
invoke ShowWindow, hCasinoConsole, SW_SHOW
invoke SetForegroundWindow, hCasinoConsole
@@:
ret
StartCasino3D ENDP
include src_graphics\platform_code.inc
'''
with open('d:/покер/casino3d.inc', 'wb') as f:
f.write(content.strip().encode('cp1251'))
print('Successfully generated unified casino3d.inc in CP1251!')